Развертывание проекта из Subversion на Production-сервер

В статье будет описана автоматизация развёртывания программного проекта на сервере из системы контроля версий Subversion.

Лень - двигатель прогресса. В один прекрасный день мне надоело вручную обновлять исходные коды на боевом сервере при помощи командной строки и Midnight Commander. Каждый раз приходилось выполнять одни и те же действия, которые в результате оформились в небольшой скрипт.

План действий по обновлению следующий:
  1. Обновить рабочую копию проекта workcopy из SVN;
  2. Произвести экспорт проекта из рабочей копии в директорию сборки build, чтобы избавиться от служебных директорий .svn;
  3. Скопировать накопленные пользовательские ресурсы из боевого проекта production/resources в директорию сборки build/resources;
  4. Скопировать в директорию сборки требуемые сторонние библиотеки build/lib;
  5. Произвести смену пользователя и группы для нужных директорий;
  6. Переместить директорию боевого проекта в бэкап;
  7. Переместить директорию сборки на место боевого проекта.
Экспортировать рабочую копию SVN можно двумя путями:
  1. Стандартный svn export source dest медленно, но верно
  2. Продвинутый rsync -aW --numeric-ids --exclude ".svn/" source/ dest работает на 35% быстрее и подходит для SVN 1.7 (для ранних версий нужно переписать параметр exclude, чтобы пропускать служебные файлы в каждой директории).

Скрипт deploy.sh:

#!/bin/bash

DIR_BUILD=build
DIR_WORK=workcopy
DIR_PRODUCTION=production

echo "Update $DIR_WORK from SVN..."
svn up $DIR_WORK

echo "Export $DIR_WORK to $DIR_BUILD..."
rsync -aW --numeric-ids --exclude ".svn/" "$DIR_WORK/" "$DIR_BUILD"
#svn export -q "$DIR_WORK" "$DIR_BUILD"

echo "Copy 'resources' folder from production..."
cp -R "$DIR_PRODUCTION/resources" "$DIR_BUILD/resources"

echo "Copy Doctrine library..."
cp -R lib/DoctrineORM-2.3.0/Doctrine "$DIR_BUILD/lib/Doctrine"

echo "Copy Zend library..."
cp -R lib/ZendFramework-2.0.4/library/Zend "$DIR_BUILD/lib/Zend"

echo "Change owner..."
chown -R apache:www "$DIR_BUILD"

echo "Delete old backup..."
rm -R "$DIR_PRODUCTION-backup"

echo "Create backup..."
mv "$DIR_PRODUCTION" "$DIR_PRODUCTION-backup"

echo "Deploy $DIR_BUILD to $DIR_PRODUCTION"
mv "$DIR_BUILD" "$DIR_PRODUCTION"

Примечание:
Директория сборки, директория боевого проекта и директория резервной копии должны быть расположены на одном разделе, чтобы избежать физического перемещения данных в завершающей стадии и минимизировать время обновления.

Comments