Pull to refresh

Capistrano: удалённое развёртывание приложений

Website development *
В этой статье описывается пример использования инструмента Capistrano для удалённого развёртывания приложений. В качестве примера берётся приложение на PHP.

Capistrano — это инструмент, который может выполнять задачи на удалённой машине через ssh-доступ. Он разработан на языке руби и широко применяется для публикации приложений Ruby on Rails, Однако его легко можно использовать вместе с другими языками программирования, например, PHP.

Для более детального ознакомления и практического использования следует прочитать дополнительную документацию и попрактиковаться. Я же хочу просто продемонстрировать возможности капистрано.

Что нужно:


1. наличие ssh-доступа к хостингу, на который будет публиковаться приложение;
2. проект в какой-либо системе контроля версий; по умолчанию subversion;
3. локальная машина разработчика (т.е. с которой осуществляется удалённая публикация) должна работать под управлением Linux, Mac OS или BSD, Windows не подойдёт.

Что у нас есть


Приложение на PHP со структурой
myproject/
** lib/
** config/
** public/
**** index.php

Адрес в репозитории
svn://svnhost/trunk/myproject/
Пользователь репозитория: mysvnuser

Хостинг
1. хост: web1234
2. пользователь: myuser
3. директория проекта на хостинге: /home/myuser/myproject
4. корневая веб-директория сайта: /home/myuser/myproject/public_html

Подготовка



Для начала установим необходимый инструмент.

На локальной машине устанавливаем (для убунту):
1. руби: sudo apt-get install ruby rubygems
2. капистрано: sudo gem install capistrano,
3. клиент svn: sudo apt-get install subversion

Если я что забыл, то смотрите здесь.

На удалённом сервере создаём директорию /home/myuser/myproject/deploy, куда будет извлекаться из репозитория проект.

Поехали



Всё делаем на локальной машине.

Переходим в директорию с проектом
$ cd /var/www/myproject
$ ll
drwxr-xr-x 2 alex alex 4096 2009-01-14 20:56 config
drwxr-xr-x 2 alex alex 4096 2009-01-14 20:56 lib
drwxr-xr-x 2 alex alex 4096 2009-01-14 20:56 public


Запускаем команду «capify .»
$ capify .
[add] writing `./Capfile'
[add] writing `./config/deploy.rb'
[done] capified!


Команда capify создала 2 файла:
1. Capify, который необходим капистрано; его минимальная задача — загрузить config/deploy.rb;
2. config/deploy.rb — скрипт на руби, который хранит инструкции и настройки капистрано.

Файл Capify мы не трогаем, все изменения делаем в deploy.rb. Скопируйте приведённый ниже код в config/deploy.rb и измените его под свои нужды.

# Имя приложения
set :application, "myproject"
# Вызов функции set создаст переменную application и присвоит ей значение "myproject"

# В проекте мы используем только один сервер, выполняющий роль веб-сервиса.
role :web, "web1234" # хост удалённого сервера
set :user, 'myuser' # пользователь удалённого сервера
set :use_sudo, false # не запускать команды под sudo

# Директория приложения на удалённом хостинге
set :app_dir, "/home/#{user}/#{application}/" # /home/myuser/myproject/
# Запись "/home/#{user}/#{application}/" аналогична "/home/$user/$application/" в PHP

# Директория, куда будет делаться checkout из репозитория
set :deploy_to, "#{app_dir}/deploy" # /home/myuser/myproject/deploy

# Настройки репозитория
set :scm, :subversion # используем subversion
set :scm_user, 'mysvnuser' # имя пользователя репозитория
set :scm_url, "svn://svnhost/trunk/#{application}" # svn://svnhost/trunk/myproject/
# Формируем команду svn checkout --username mysvnuser svn://host/trunk/myproject
set :repository, Proc.new { "--username #{scm_user} #{scm_url}"}

task :after_symlink, :roles => :web do
run "ln -nfs #{release_path}/public #{app_dir}/public_html"
end


На локальной машине выполняем команду
$ cap deploy:setup

Капистрано соединяемся по ssh с сервером web1234, фактически ssh myuser@web1234:22, и создаёт необходимые ему директории в /home/myuser/myproject/deploy:
** releases,
** shared

Выполняем команду
$ cap deploy:update
Капистрано выполняет следующие команды на удалённом сервере:
1. создаёт новую директорию в /home/myuser/myproject/deploy/releases, например, releases/20090114102030
2. делает svn checkout svn://svnhost/trunk/myproject/ в эту директорию
3. создаёт симлинк /home/myuser/myproject/deploy/current на /home/myuser/myproject/deploy/releases/20090114102030
4. создаёт симлинк /home/myuser/myproject/public_html на /home/myuser/myproject/deploy/releases/20090114102030/public

Пункт 4 реализован в строках
task :after_symlink, :roles => :web do
run "ln -nfs #{release_path}/public #{app_dir}/public_html"
end

Переменная release_path содержит путь до текущего релиза приложения.

Измените немного код приложения (например, в index.php), закоммитьте изменения и повторите команду
$ cap deploy:update
Капистрано создаст новую директорию releases/20090114203040и сделает в неё svn checkout из репозитория. Потом установит симлинк deploy/current на deploy/releases/20090114203040/, а publick_html на deploy/releases/20090114203040/public.

У вас уже будет такая структура директорий:
deploy/
** releases
**** 20090114102030
******** lib/
******** config/
******** public/
************ index.php
**** 20090114203040
******** lib/
******** config/
******** public/
************ index.php
** current -> releases/20090114203040
** shared
public_html -> deploy/releases/20090114203040/public

Следует заметить, что задачу deploy:update капистрано выполняет в транзакции.

Этот тот минимум, который нужен для удалённой публикации приложения. В этом примере не надо перезапускать веб-сервер (или несколько серверов), делать изменения в базе данных и т.п. Для реальных проектов вам придётся самостоятельно изучить капистрано.
Tags: phpcapistranodeployудалённое развёртывание приложений
Hubs: Website development
Total votes 27: ↑23 and ↓4 +19
Comments 29
Comments Comments 29

Popular right now