🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

Грамотное разворачивание сайта без 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, у меня так и есть.

Если что непонятно – я уточню.

Buy me a coffee Понравился пост? Купи мне кофе