2014-02-18 5 views
1

Я пытаюсь написать рецепт Заводной для Capistrano 3. После того, как смотреть на Sidekiq's recipe я придумал с этим:Заводной для Capistrano 3

namespace :load do 
    task :defaults do 
    set :clockwork_default_hooks, -> { true } 

    set :clockwork_pid,   -> { 'tmp/pids/clockwork.pid' } 
    set :clockwork_log,   -> { "#{current_path}/log/clockwork.log" } 

    set :clockwork_roles,   -> { :app } 

    set :clockwork_config,  -> { 'clock.rb' } 
    end 
end 

namespace :deploy do 
    before :starting, :check_clockwork_hooks do 
    invoke 'clockwork:add_default_hooks' if fetch(:clockwork_default_hooks) 
    end 
end 

namespace :clockwork do 
    def clockwork_pid_full_path 
    if fetch(:clockwork_pid).start_with?('/') 
     fetch(:clockwork_pid) 
    else 
     "#{current_path}/#{fetch(:clockwork_pid)}" 
    end 
    end 

    task :add_default_hooks do 
    after 'deploy:updated', 'clockwork:stop' 
    after 'deploy:reverted', 'clockwork:stop' 
    after 'deploy:published', 'clockwork:start' 
    end 

    desc 'Stop clockwork' 
    task :stop do 
    on roles fetch(:clockwork_roles) do 
     if test "[ -f #{clockwork_pid_full_path} ]" 
     within current_path do 
      execute "kill -int $(cat #{clockwork_pid_full_path}) 2>/dev/null" 
     end 
     else 
     execute "echo 'clockwork was not running'" 
     end 
    end 
    end 

    desc 'Start clockwork' 
    task :start do 
    on roles fetch(:clockwork_roles) do 
     within current_path do 
     with rails_env: fetch(:rails_env, 'production') do 
      execute "export RAILS_ENV=$RAILS_ENV" 
      execute :bundle, :exec, :clockwork, "#{fetch(:clockwork_config)} >> #{fetch(:clockwork_log)} 2>&1 &" 
     end 
     execute "ps -eo pid,command | grep clockwork | grep -v grep | awk '{print $1}' > #{clockwork_pid_full_path}" 
     end 
    end 
    end 

    desc 'Restart clockwork' 
    task :restart do 
    invoke 'clockwork:stop' 
    invoke 'clockwork:start' 
    end 
end 

Однако заводной: начать задача будет работать, только если я удалю часть 2>&1 & в конце. Если я попытаюсь начать процесс в фоновом режиме, ничего не произойдет.

Что я делаю неправильно?

+0

вы сделали это работает? – emerak

+0

@emerak Посмотрите на ответ. –

+0

Вы вручную создали папку pids? – emerak

ответ

1

Это то, с чем я закончил. Я адаптировал его из найденного Gist.

namespace :clockwork do 
    desc "Stop clockwork" 
    task :stop do 
    on roles(:app) do 
     within release_path do 
     with rails_env: fetch(:rails_env) do 
      execute :bundle, :exec, :clockworkd, "-c clock.rb --pid-dir=#{cw_pid_dir} --log-dir=#{cw_log_dir} --log stop" 
     end 
     end 
    end 
    end 

    desc "Clockwork status" 
    task :status do 
    on roles(:app) do 
     within release_path do 
     with rails_env: fetch(:rails_env) do 
      execute :bundle, :exec, :clockworkd, "-c clock.rb --pid-dir=#{cw_pid_dir} --log-dir=#{cw_log_dir} --log status" 
     end 
     end 
    end 
    end 

    desc "Start clockwork" 
    task :start do 
    on roles(:app) do 
     within release_path do 
     with rails_env: fetch(:rails_env) do 
      execute :bundle, :exec, :clockworkd, "-c clock.rb --pid-dir=#{cw_pid_dir} --log-dir=#{cw_log_dir} --log start" 
     end 
     end 
    end 
    end 

    desc "Restart clockwork" 
    task :restart do 
    on roles(:app) do 
     within release_path do 
     with rails_env: fetch(:rails_env) do 
      execute :bundle, :exec, :clockworkd, "-c clock.rb --pid-dir=#{cw_pid_dir} --log-dir=#{cw_log_dir} --log restart" 
     end 
     end 
    end 
    end 

    def cw_log_dir 
    "#{shared_path}/log" 
    end 

    def cw_pid_dir 
    "#{shared_path}/tmp/pids" 
    end 

    def rails_env 
    fetch(:rails_env, false) ? "RAILS_ENV=#{fetch(:rails_env)}" : '' 
    end 
end 
0

Попробуйте этот драгоценный камень capistrano-clockwork.

Это самый простой способ, который очень хорошо работал для меня. Я пробовал несколько вариантов «gists», но не имел успеха.

Вам просто нужно обновить эти файлы Gemfile, Capifile и deploy.rb.

Gemfile:

gem 'daemons' 
gem 'capistrano-clockwork', group: :development 

Capfile:

require 'capistrano/clockwork' 

deploy.rb:

set :clockwork_file, "lib/name_of_your_clockwork_config.rb" 

Не забудьте выполнить bundle install перед тем Deploy;)