Легкое обновление ядра 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. Пока писал этот пост, пролил чай на клавиатуру ноутбука. Разобрал, просушил, и заодно починил отломавшееся крепление на крышке. Тенденция, однако! :)

Комментарии

ничо не поняла, конечно. зашла чисто за традиционным тестом: узнАет - не узнает. узнал :-)

Изображение myx

Спасибо за тест! Если честно, меня тоже этот вопрос беспокоил :)