J'ai une configuration multi-sites où 3 sites différents partagent la même base de code. Tous les modules sont dans le all/modules
pour qu'ils aient tous exactement les mêmes modules. Je veux mettre à jour les modules et le noyau de la base de code avec drush
mais je ne trouve pas de moyen de le faire.
Il n'y a pas settings.php
fichier dans sites/default
so drush
génère une erreur. Dois-je simplement créer une base de données factice pour que drush
puisse connecter et mettre à jour les modules? Évidemment, je vais devoir exécuter update.php
sur les sites après les mises à jour.
Les bases de données sont séparées, elles partagent juste les modules et le noyau.
Au lieu d'appliquer les mises à jour à chaque site individuel en utilisant @sites
qui n'a jamais fonctionné, j'ai pu y parvenir en exécutant les mises à jour sur un site spécifique. Voici le code qui a fonctionné pour moi:
drush -l example.com pm-update
example.com étant le nom de mon lien symbolique. Note latérale: je n'ai pas eu à créer d'alias de drush pour que cela fonctionne.
C'est en PHP, mais c'est ce que j'utilise depuis mon dossier sites.
Exemple d'utilisation à partir de la ligne de commande:
cd /path/to/drupal/sites
php drush_updates.php
Le fichier:
<?php
/**
* Run db updates on all of the sites in the multisite, using Drush
*/
print "\n\n***************************************************\n";
print "This script will find all of the site dirs and run drush updb -y on them.\n\n";
$start_dir = ".";
$files = scandir($start_dir);
foreach ($files as $file) {
if (is_dir($file) && $file != "." && $file != ".." && $file != "all") {
print "drush updb -y on $file...\n";
chdir($file);
system("drush updb -y");
chdir("..");
}
}
print "\n\n*******************************************\n";
print "Finished!\n\n";
?>
Voici ce que je fais pour mettre à jour une configuration multi-sites:
for d in sites/*; do pushd $d; drush up -y; popd; done
Avez-vous 3 différents sites/sitename.com/
répertoires? Si c'est le cas, vous voudrez cd
dans chacun d'eux un à la fois et exécutez drush up
dans chaque.
La première fois que vous l'exécuterez, il téléchargera les nouveaux modules et exécutera les crochets de mise à jour sur la base de données de ce site et les deux prochaines fois, il verra qu'ils sont déjà téléchargés, il exécutera simplement les crochets de mise à jour sur les bases de données des deux autres sites. .
J'ai une configuration similaire - plusieurs sites utilisant la même base de code et différentes bases de données. J'utilise un script Shell pour exécuter la même commande drush sur chaque site. Le script est ci-dessous - il est personnalisé en fonction de la configuration de mon serveur. Les bits pertinents sont:
Mon Drupal est/var/www/drupal7
Chaque site (dans drupal7/sites) contient ".d7". dans le nom.
Le script ci-dessous (appelé d7_all_sites) peut exécuter 3 commandes drush sur chacun de mes sites: effacer tous les caches, mettre les sites en/hors mode maintenance et mettre à jour la base de données. La commande est donnée par un paramètre. Donc, quand je mets à jour des modules, je fais ça ...
$ d7_all_sites mm 1 ## puts all sites into maintenance mode
$ drush up ## updates the modules
$ d7_all_sites updb ## updates each site's DB schema
$ d7_all_sites mm 0 ## takes all sites out of maintenance mode
Je suis un novice en scripting, donc toute suggestion pour améliorer le script est la bienvenue.
#!/bin/bash
# test that at least one parameter if given, else return error message & exit
if [ $# -eq 0 ]
then
echo -e "\n You must supply a valid parameter ...\n cc to clear caches.\n mm [0 or 1] for maintenance mode (0=online, 1=offline).\n updb to update databases.\n"
exit 2
fi
## clear all caches command
if [ $1 = "cc" ]
then
for SITE in `ls /var/www/drupal7/sites | grep ".d7."`;
do
echo
echo Clearing caches on $SITE ...
drush --uri=$SITE --root=/var/www/drupal7 cache-clear all
done
exit 0
fi
## maintenance mode
if [ $1 = "mm" ]
then
if [ $# -ne 2 ]
then
echo -e "\n You must supply a parameter ...\n 0 for online.\n 1 for offline.\n"
exit 2
else
if [ $2 -eq 0 ]
then
text="online ..."
else
if [ $2 -eq 1 ]
then
text="offline ..."
echo -e "\n You must supply a parameter ...\n 0 for online.\n 1 for offline.\n"
exit 2
fi
fi
fi
for SITE in `ls /var/www/drupal7/sites | grep ".d7."`;
do
echo
echo Putting $SITE $text
drush --uri=$SITE --root=/var/www/drupal7 vset --exact --yes maintenance_mode $2
done
exit 0
fi
# update databases
if [ $1 = "updb" ]
then
for SITE in `ls /var/www/drupal7/sites | grep ".d7."`;
do
echo
echo Checking $SITE for database updates ...
drush --uri=$SITE --root=/var/www/drupal7 --yes updatedb
done
exit 0
fi
# if no commands have been run, return an error message
echo -e "\n You must supply a valid parameter ...\n cc to clear caches.\n mm [0 or 1] for maintenance mode (0=online, 1=offline).\n updb to update databases.\n"