Легкое обновление ядра Drupal 7
Потратил выходные на подчистку накопившихся глюков на сайте, заодно обновил оформление. Вроде бы починил все, что было поломано. Попутно немножко прокачал практические навыки использования bash - еще немного, и я буду морально готов отказаться от своих слов, что я слишком стар для этого языка :) Все-таки наличие на работе коллег-юниксоидов, готовых делиться опытом, очень помогает проникнуться его мощью и красотой.
Под катом несколько наработок, которые могут оказаться полезными другим друпаловодам-любителям вроде меня.
Быстрое создание копии сайта
Меня уже давно смущало то, что даже имея дома сервер, я не могу использовать его как экспериментальную площадку для обкатки изменений на сайте. Во-первых, конфигурация систем у меня на сервере и на хостинге, пусть в мелочах, но отличается. А во-вторых, объем CMS не маленький, задолбаешься копировать данные туда-обратно через Интернет.
В то же время, экспериментировать на живом сайте тоже не комильфо. Да, периодически приходилось, но это крайне некомфортное занятие. Относиться с пофигизмом к тому, что десятки человек натыкаются на неработающий сайт, не могу. Работать в состоянии стресса тоже не умею и не люблю. Поэтому, наконец, собрался с силами и сделал то, что уже давно надо было сделать: написал на баше скрипт, который снимает с сайта копию и кладет ее рядом. И теперь, вместо того, чтобы торопливо "резать по живому", можно неспешно экспериментировать с копией. Зашел на хостинг через SSH, сделал копию - и развлекайся, сколько хочешь, не забывай только записывать, что менял, чтобы потом все то же повторить на "боевом" сайте. А если совсем все сломал - можно просто еще раз запустить скрипт и начать все сначала :)
Вот текст скрипта, вдруг кому пригодится:
ORIGINAL="$HOME/public_html/myx" REPLICA="$HOME/public_html/myx-replica" DEFAULT=$REPLICA/sites/default SETTINGS=$DEFAULT/settings.php # Create replica of CMS files chmod -R u+w $REPLICA/* rm -r $REPLICA/* cp -a $ORIGINAL/. $REPLICA echo "Disallow: /" >> $REPLICA/robots.txt # Create database replica DBORIGINAL="ostankin_DRUPAL" DBREPLICA="ostankin_DRUPALREPLICA" USERNAME=`awk $'/\'username\' =>/ {split($0,arr,"\'"); print arr[4]}' $SETTINGS` PASSWORD=`awk $'/\'password\' =>/ {split($0,arr,"\'"); print arr[4]}' $SETTINGS` mysqldump -u$USERNAME -p$PASSWORD $DBORIGINAL | mysql -u$USERNAME -p$PASSWORD $DBREPLICA # Re-point CMS replica to DB replica SEARCH=$'\'database\' => \'' chmod u+w $DEFAULT chmod u+w $SETTINGS sed -i -e "s/$SEARCH$DBORIGINAL/$SEARCH$DBREPLICA/" $SETTINGS chmod u-w $DEFAULT chmod u-w $SETTINGS
Скрипт делает простую вещь: копирует файлы CMS в указанный каталог, копирует состояние базы данных в другую базу, затем перенацеливает конфигурацию копии CMS на новую базу. Процедура выполняется одним движением и занимает пару десятков секунд.
Быстрое обновление минорной версии Drupal 7
Получив возможность работать с копией, я решил заодно попробовать поставить все обновления. Drupal имеет привычку постоянно проверять наличие обновлений и весьма назойливо напоминать администратору о необходимости их поставить. И если модули в "семерке" уже научились обновляться сами, то обновления ядра по-прежнему необходимо ставить вручную. А это процесс довольно муторный и требующий остановки сайта минут на тридцать. Решив, что раз уж у меня есть копия, я стал неспешно обкатывать на ней процедуру обновления...
...на выходе получился еще один скрипт, который проделывает все это за пару секунд :) Плюс еще минуту на ручную доводку. Итак, дано:
- распакованный дистрибутив текущей версии;
- распакованный дистрибутив новой версии;
- работающий Drupal 7.
Имея все эти данные, скрипт аккуратно обновляет файлы, и в конце работы напоминает, что часть файлов надо доработать руками. В отдельный каталог складываются исходные версии этих самых файлов, отличия их от новых, а также отчет о возникших в процессе ошибках (если они были).
Вот пример скрипта, обновляющего ядро Drupal с версии 7.25 до версии 7.32:
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" OLD=$HOME/d7/drupal-7.25 NEW=$HOME/d7/drupal-7.32 DRUPAL=$HOME/public_html/myx-replica WORK=$DIR/work DELETE=$WORK/files_to_delete ERRORS=$WORK/errors if [ ! -d "$WORK" ]; then echo "$WORK does not exist, creating..." mkdir $WORK fi cd $OLD find . | grep -v '^.\/sites' > $DELETE cd $DRUPAL echo "Saving original .htaccess and robots.txt to $WORK..." cp .htaccess robots.txt $WORK echo "Removing old core files..." tac $DELETE | tr '\n' '\0' | xargs -0 rm 2>$ERRORS tac $DELETE | tr '\n' '\0' | xargs -0 rmdir 2>>$ERRORS cat $ERRORS |grep -v 'Is a directory' | grep -v 'No such file or directory' rm $ERRORS echo "Copying new core files..." cp -r $NEW/. $DRUPAL cd $DIR echo "Saving diffs for .htaccess and robots.txt in $WORK..." diff $WORK/robots.txt $DRUPAL/robots.txt >$WORK/robots_diff.txt diff $WORK/.htaccess $DRUPAL/.htaccess >$WORK/htaccess_diff.txt echo "Done! Don't forget to re-apply your changes to .htaccess and robots.txt."
В общем, да здравствует лень - двигатель прогресса :)
P.S. Пока писал этот пост, пролил чай на клавиатуру ноутбука. Разобрал, просушил, и заодно починил отломавшееся крепление на крышке. Тенденция, однако! :)
Комментарии
LD
Пн, 2014-11-03 10:39
Link
ничо не поняла, конечно.
ничо не поняла, конечно. зашла чисто за традиционным тестом: узнАет - не узнает. узнал :-)
myx
Пн, 2014-11-03 13:27
Link
Спасибо за тест! Если честно,
Спасибо за тест! Если честно, меня тоже этот вопрос беспокоил :)