Задача
Часто приходится сталкиваться с долгосрочными проектами, которые требуют разработки на тестовом сервере под Linux, и после проверки клиентом — обновления кода на его сервере. Разумеется, имеет смысл использовать систему контроля версий (мы используем SVN), и когда есть доступ к клиентскому серверу через SSH — достаточно сделать например команду svn update или svn checkout.
Проблема
Однако, когда к клиентскому серверу есть доступ только по FTP — приходится заливать обновления вручную, используя одну из альтернатив:
— копировать по FTP все файлы проекта, чтобы ничего не упустить
— составлять список файлов которые были изменены с момента предыдущего релиза, и заливать только их.
Решение
Хочу поделиться решением, которое позволяет автоматизировать этот процесс, и производить обновление проекта на клиентском сервере простым запуском скрипта на вашем dev-сервере. Для этого предлагается написать простенький Shell скрипт, который будет выполнять следующее:
1) Экспортировать код проекта из системы контроля версий
2) Обновлять код проекта на клиентском сервере
Решение первой задачи предельно простое:
#удаление папки содержащей старый релиз
rm -r /home/project/release_folder/
#експорт кода проекта в папку релиза
svn export --force http//svn.yourserver.com/repositary_name /home/project/release_folder/
При этом, естественно, в зависимости от используемой системы контроля версий, можно задавать параметры, например чтобы выложить в релиз определенную ревизию.
Для решения второй задачи можно воспользоваться командой lftp, которая обладает большим набором параметров и позволяет производить обширные манипуляции с файлами посредством протокола ftp:
#синхронизация папки с релизом с папкой на удаленном сервере клиента
lftp -f sync_script.x
Содержимое файла sync_script.x:
open login:password@customerserver.com
mirror -c -e -R -X '*.config.php' --no-perms /home/project/release_folder htdocs/sub
exit
Как видим, данная команда позволяет создавать точное зеркало папки с релизом на удаленном клиентском сервере. При этом мы можем, например, используя её параметры, запретить обновление определенных файлов, или изменение прав доступа к файлам на удаленном сервере.
Сделав такой скрипт на своем сервере, достаточно запустить его, и подождать пару секунд, пока он обновит папку релиза и синхронизирует ее содержимое с клиентским сервером по FTP. Это здорово экономит время и нервы + исключает “человеческий фактор”. Расширив этот скрипт, можно обновлять проект хоть на сотне серверов, всего за пару минут.