Capistrano: установка и запуск

Автор: | 28/10/2015

cap_logoПростой пример установки, первоначальной настройки и запуска Capistrano.

Т.к. времени на написание особо не было – то пост без детального описания.

Но, как обычно – в конце есть полезнные ссылки по теме.

Пример выполняется на:

# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.3 LTS
Release:        14.04
Codename:       trusty

Для работы Capistrano требуется Ruby >= 2.0.

Проверяем текущую версию:

# ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]
$ gem -v
1.8.23

При необходимости – обновляем до версии 2.2.

Установка Capistrano

В данном примере будет использоваться Capistrano версии 2 (есть 3).

Находим последнюю версию тут>>>.

Устанавливаем сам Capistrano и capistrano-ext (пригодится позже):

# gem install capistrano -v 2.15.6
# gem install capistrano-ext

Проверяем:

# cap --version
Capistrano v2.15.6

Использование Capistrano

Создаём каталог проекта:

$ mkdir cap_proj && cd cap_proj

Инициализируем проект:

$ capify .
[add] writing './Capfile'
[add] making directory './config'
[add] writing './config/deploy.rb'
[done] capified!

Теперь содержимое каталога проекта будет выглядеть так:

$ ls -la
total 16
drwxrwxr-x 3 vagrant vagrant 4096 Oct 27 13:41 .
drwxr-xr-x 5 vagrant vagrant 4096 Oct 27 13:41 ..
-rw-rw-r-- 1 vagrant vagrant 172 Oct 27 13:41 Capfile
drwxrwxr-x 2 vagrant vagrant 4096 Oct 27 13:41 config

Нас пока интересует только один файл – config/deploy.rb:

$ head config/deploy.rb
# config valid only for current version of Capistrano
lock '3.4.0'

set :application, 'my_app_name'
set :repo_url, '[email protected]:me/my_repo.git'

# Default branch is :master
# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp

# Default deploy_to directory is /var/www/my_app_name

Удаляем его содержимое:

$ echo > config/deploy.rb

И заполняем с нуля.

Указываем имя приложения:

set :application, "TestApp"

Его репозиторий:

set :scm, :git
set :repository, "[email protected]:username/app.git"
set :scm_passphrase, ""

Указываем сервер, на который приложение должно деплоиться:

server "domain.org.ua:2222", :app, :web, :db, :primary => true
set :user, "setevoy"
set :deploy_to, "/home/setevoy/cap_proj"

В результате – мы должны получить примерно такой файл:

$ cat config/deploy.rb
set :application, "TestApp"

set :scm, :git
set :repository, "[email protected]/app.git"
set :scm_passphrase, ""

server "domain.org.ua:2222", :app, :web, :db, :primary => true
set :user, "setevoy"
set :deploy_to, "/home/setevoy/cap_proj"

Обратите внимание на порт после имени хоста:

server “domain.org.ua:2222”

в случае, если используется нестандартный порт SSH.

Выполняем setup, что бы Capistrano создал необходимые каталоги в “:deploy_to, "/home/setevoy/cap_proj"“:

$ cap deploy:setup
  * 2015-10-27 15:20:06 executing `deploy:setup'
  * executing "sudo -p 'sudo password: ' mkdir -p /home/setevoy/cap_proj /home/setevoy/cap_proj/releases /home/setevoy/cap_proj/shared /home/setevoy/cap_proj/shared/system /home/setevoy/cap_proj/shared/log /home/setevoy/cap_proj/shared/pids"
    servers: ["domain.org.ua"]
[email protected]'s password:
    [domain.org.ua:2222] executing command
Password:
 ** [out :: domain.org.ua:2222]
    command finished in 2805ms
  * executing "sudo -p 'sudo password: ' chmod g+w /home/setevoy/cap_proj /home/setevoy/cap_proj/releases /home/setevoy/cap_proj/shared /home/setevoy/cap_proj/shared/system /home/setevoy/cap_proj/shared/log /home/setevoy/cap_proj/shared/pids"
    servers: ["domain.org.ua"]
    [domain.org.ua:2222] executing command
 ** [out :: domain.org.ua:2222]
    command finished in 75ms

Проверяем:

$ cap deploy:check
  * 2015-10-27 15:20:48 executing `deploy:check'
  * executing "test -d /home/setevoy/cap_proj/releases"
    servers: ["domain.org.ua"]
[email protected]'s password:
    [domain.org.ua:2222] executing command
    command finished in 25ms
  * executing "test -w /home/setevoy/cap_proj"
    servers: ["domain.org.ua"]
    [domain.org.ua:2222] executing command
    command finished in 69ms
  * executing "test -w /home/setevoy/cap_proj/releases"
    servers: ["domain.org.ua"]
    [domain.org.ua:2222] executing command
    command finished in 50ms
  * executing "which git"
    servers: ["domain.org.ua"]
    [domain.org.ua:2222] executing command
    command finished in 44ms
The following dependencies failed. Please check them and try again:
--> You do not have permissions to write to `/home/setevoy/cap_proj'. (domain.org.ua:2222)
--> You do not have permissions to write to `/home/setevoy/cap_proj/releases'. (domain.org.ua:2222)

Проблема с правами вызвана тем, что Capistrano создаёт каталоги под sudo.

Этого можно избежать, добавив переменную вида:

set :use_sudo, false

Или поменя владельца каталога на удалённом сервере вручную.

После добавления set :use_sudo, false – повторяем:

$ cap deploy:setup
  * 2015-10-27 15:24:51 executing `deploy:setup'
  * executing "mkdir -p /home/setevoy/cap_proj /home/setevoy/cap_proj/releases /home/setevoy/cap_proj/shared /home/setevoy/cap_proj/shared/system /home/setevoy/cap_proj/shared/log /home/setevoy/cap_proj/shared/pids"
    servers: ["domain.org.ua"]
[email protected]'s password:
    [domain.org.ua:2222] executing command
    command finished in 34ms
  * executing "chmod g+w /home/setevoy/cap_proj /home/setevoy/cap_proj/releases /home/setevoy/cap_proj/shared /home/setevoy/cap_proj/shared/system /home/setevoy/cap_proj/shared/log /home/setevoy/cap_proj/shared/pids"
    servers: ["domain.org.ua"]
    [domain.org.ua:2222] executing command
    command finished in 22ms

Проверяем:

$ cap deploy:check
  * 2015-10-27 15:25:35 executing `deploy:check'
  * executing "test -d /home/setevoy/cap_proj/releases"
    servers: ["domain.org.ua"]
[email protected]'s password:
    [domain.org.ua:2222] executing command
    command finished in 20ms
  * executing "test -w /home/setevoy/cap_proj"
    servers: ["domain.org.ua"]
    [domain.org.ua:2222] executing command
    command finished in 17ms
  * executing "test -w /home/setevoy/cap_proj/releases"
    servers: ["domain.org.ua"]
    [domain.org.ua:2222] executing command
    command finished in 15ms
  * executing "which git"
    servers: ["domain.org.ua"]
    [domain.org.ua:2222] executing command
    command finished in 15ms
You appear to have all necessary dependencies installed

Ппроверяем удалённый сервер:

$ ls -l /home/setevoy/cap_proj/
total 8
drwxrwxr-x 2 setevoy setevoy 4096 Oct 27 17:38 releases
drwxrwxr-x 5 setevoy setevoy 4096 Oct 27 17:38 shared

Осталось задеплоить код из репозитория.

Выполняем:

$ cap deploy:update
  * 2015-10-27 15:59:00 executing `deploy:update'
 ** transaction: start
  * 2015-10-27 15:59:00 executing `deploy:update_code'
    executing locally: "git ls-remote [email protected]/rdsmanager.git HEAD"
    command finished in 11650ms
  * executing "git clone -q [email protected]:username/rdsmanager.git /home/setevoy/cap_proj/releases/20151027155911 && cd /home/setevoy/cap_proj/releases/20151027155911 && git checkout -q -b deploy 19111d25cd2182b2323c4616d8057964c33b471b && (echo 19111d25cd2182b2323c4616d8057964c33b471b > /home/setevoy/cap_proj/releases/20151027155911/REVISION)"
    servers: ["domain.org.ua"]
[email protected]'s password:
    [domain.org.ua:2222] executing command
 ** [domain.org.ua :: out] The authenticity of host 'bitbucket.org (131.103.20.168)' can't be established.
 ** RSA key fingerprint is 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40.
 ** Are you sure you want to continue connecting (yes/no)?
 ** [domain.org.ua :: out] yes
 ** Warning: Permanently added 'bitbucket.org,131.103.20.168' (RSA) to the list of known hosts.
    command finished in 4806ms
  * 2015-10-27 15:59:24 executing `deploy:finalize_update'
  * executing "chmod -R -- g+w /home/setevoy/cap_proj/releases/20151027155911 && rm -rf -- /home/setevoy/cap_proj/releases/20151027155911/public/system && mkdir -p -- /home/setevoy/cap_proj/releases/20151027155911/public/ && ln -s -- /home/setevoy/cap_proj/shared/system /home/setevoy/cap_proj/releases/20151027155911/public/system && rm -rf -- /home/setevoy/cap_proj/releases/20151027155911/log && ln -s -- /home/setevoy/cap_proj/shared/log /home/setevoy/cap_proj/releases/20151027155911/log && rm -rf -- /home/setevoy/cap_proj/releases/20151027155911/tmp/pids && mkdir -p -- /home/setevoy/cap_proj/releases/20151027155911/tmp/ && ln -s -- /home/setevoy/cap_proj/shared/pids /home/setevoy/cap_proj/releases/20151027155911/tmp/pids"
    servers: ["domain.org.ua"]
    [domain.org.ua:2222] executing command
    command finished in 68ms
  * executing "find /home/setevoy/cap_proj/releases/20151027155911/public/images /home/setevoy/cap_proj/releases/20151027155911/public/stylesheets /home/setevoy/cap_proj/releases/20151027155911/public/javascripts -exec touch -t 201510271559.24 -- {} ';'; true"
    servers: ["domain.org.ua"]
    [domain.org.ua:2222] executing command
 ** [out :: domain.org.ua:2222] find: `/home/setevoy/cap_proj/releases/20151027155911/public/images': No such file or directory
 ** [out :: domain.org.ua:2222] find: `/home/setevoy/cap_proj/releases/20151027155911/public/stylesheets': No such file or directory
 ** [out :: domain.org.ua:2222] find: `/home/setevoy/cap_proj/releases/20151027155911/public/javascripts': No such file or directory
    command finished in 49ms
  * 2015-10-27 15:59:24 executing `deploy:create_symlink'
  * executing "rm -f /home/setevoy/cap_proj/current &&  ln -s /home/setevoy/cap_proj/releases/20151027155911 /home/setevoy/cap_proj/current"
    servers: ["domain.org.ua"]
    [domain.org.ua:2222] executing command
    command finished in 23ms
 ** transaction: commit

Проверяем:

$ ls -l cap_proj/
total 8
lrwxrwxrwx 1 setevoy setevoy   46 Oct 27 18:12 current -> /home/setevoy/cap_proj/releases/20151027155911
drwxrwxr-x 3 setevoy setevoy 4096 Oct 27 18:12 releases
drwxrwxr-x 5 setevoy setevoy 4096 Oct 27 18:10 shared
$ ls -l cap_proj/current/
total 40
drwxrwxr-x 3 setevoy setevoy  4096 Oct 27 18:12 conf
drwxrwxr-x 6 setevoy setevoy  4096 Oct 27 18:12 lib
lrwxrwxrwx 1 setevoy setevoy    33 Oct 27 18:12 log -> /home/setevoy/cap_proj/shared/log
drwxr-xr-x 2 setevoy setevoy  4096 Oct 27 18:12 public
-rw-rw-r-- 1 setevoy setevoy 19771 Oct 27 18:12 RDSmanager.py
-rw-rw-r-- 1 setevoy setevoy    41 Oct 27 18:12 REVISION
drwxr-xr-x 2 setevoy setevoy  4096 Oct 27 18:12 tmp

Готово.

Ссылки по теме

https://github.com/capistrano

http://guides.beanstalkapp.com

http://capistranorb.com