Блог Загирова Рустама

Около-интернетные заметки

Unicorn в Capistrano 3

| Комментарии

Вышла новая версия capistrano под номером 3. Можете прочитать полный анонс от комманды.

Главные изменения:

  • Под капотом теперь SSHKit, и можно использовать разные фишки dsl. В частности появился метод test, которым можно проверить возврат и выполнить в зависимости от этого разные комманды. Что позволило избавится от выполнения такого: “[ -f ] && unicorn; true”
  • Модульность: bundler, rbenv, rvm, maintenance. Даже рельсовые assets и migration развели, можно подключать по отдельности. Идут по пути рельс: подключаешь только то, что тебе нужно.
  • Теперь поддержка multistage из коробки
  • Новые опции linked_files и linked_dirs
  • Сломали —dry-run. К справедливости, это баг SSHKit, но неприятненько

Собственно переписанные правила для unicorn’а:

Capfile:

1
2
3
4
require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/bundler'
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }

deploy.rb:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
namespace :deploy do

  desc 'Restart application'
  task :restart do
    invoke 'deploy:unicorn:restart'
  end
end

namespace :unicorn do
  pid_path = "#{release_path}/tmp/pids"
  unicorn_pid = "#{pid_path}/unicorn.pid"

  def run_unicorn
    execute "#{fetch(:bundle_binstubs)}/unicorn", "-c #{release_path}/config/unicorn.rb -D -E #{fetch(:stage)}"
  end

  desc 'Start unicorn'
  task :start do
    on roles(:app) do
      run_unicorn
    end
  end

  desc 'Stop unicorn'
  task :stop do
    on roles(:app) do
      if test "[ -f #{unicorn_pid} ]"
        execute :kill, "-QUIT `cat #{unicorn_pid}`"
        #execute :rm, unicorn_pid
      end
    end
  end

  task :force_stop do


  desc 'Restart unicorn'
  task :restart do
    on roles(:app) do
      if test "[ -f #{unicorn_pid} ]"
        execute :kill, "-USR2 `cat #{unicorn_pid}`"
      else
        run_unicorn
      end
    end
  end
end

Комментарии