Грамотное разворачивание сайта без VCS
September 3, 2009 , revised October 1, 2009 in DevopsСитуация: есть сервер с доступом по SSH и без каких-либо дополнительных программных средств. Есть код в git-репозитарии (даже не важно, что в git, главное, что под системой контроля версий). Задача: поместить код на сервер и периодически его обновлять, да так, чтоб не руками, чтоб не стыдно было, чтоб не гонять полную копию каждый раз. Займемся.
Ну да, не совсем без системы контроля версий, а при наличии отсутствия ее на сервере.
UPD: Еще проще и удобнее выливать сайты через sshfs.
Способ первый. Используем Capistrano
Для тех, кто в танке: Capistrano – это такая штука для выполнения команд на удаленных серверах с помощью SSH. Например, с ее помощью можно одной командой залезть на сервер, вытянуть туда код из репозитария, выполнить миграции и перезапустить сервер. Удобно.
К сожалению, вытянуть код прямо с сервера у нас не получится – там не знают о VCS.
«Папа, а правда, есть люди, которые не пользуются VCS? Нет, сынок, это фантастика.»
Для таких случаев у Capistrano есть стратегия copy.
#config/deploy.rb set :deploy_via, :copy set :copy_strategy, :export set :scm, :git set :branch, 'master' # или любая другая ветка set :repository, 'git@my.server:repo/location.git' set :deploy_path '/path/to/app/on/deploy/server' role :web, 'the.deploy.server'
Все, вызываем cap:deploy
, Capistrano вытягивает содержимое ветки, зажимает в gzip-архив и отправляет на сервер. Снова удобно.
К сожалению, на конкретном сервере у меня возникла проблема с использованием дерева каталогов Capistrano, а точнее, с симлинками в этом дереве. Если можно как-то обойтись без /current и /releases – напиши об этом в комментах, а я расскажу о дедовском способе.
Способ второй. Не такой модный, зато простой и тоже работающий
Shell-скрипт, который вытягивает содержимое репозитария и запихивает его на сервер rsync-ом. Его, наверное, можно было бы начинить переменными и комментариями, но мне лень.
#!/bin/sh cd /tmp rm -rf site_checkout git clone git@my.server:repo/location.git site_checkout cd site_checkout git checkout master rm -rf .git rsync -zr -e ssh . the.deploy.server:/path/to/site/on/deploy/server cd .. rm -rf site_checkout
Кажись, это требует настройки параметров доступа к the.deploy.server в ~/.ssh/config
, у меня так и есть.
Если что непонятно – я уточню.
Понравился пост? Купи мне кофе