Capistrano 3の私のソリューション:
set :sidekiq_runit_service_name, "sidekiq"
set :sidekiq_default_hooks, ->{ true }
set :sidekiq_cmd, ->{ "#{fetch(:bundle_cmd, "bundle")} exec sidekiq" }
set :sidekiqctl_cmd, ->{ "#{fetch(:bundle_cmd, "bundle")} exec sidekiqctl" }
set :sidekiq_timeout, ->{ 10 }
set :sidekiq_role, ->{ :app }
set :sidekiq_pid, ->{ "#{current_path}/tmp/pids/sidekiq.pid" }
namespace :sidekiq do
desc "Quiet sidekiq (stop accepting new work)"
task :quiet do
on roles(fetch(:sidekiq_role)) do
execute "if [ -d #{current_path} ] && [ -f #{fetch(:sidekiq_pid)} ] && kill -0 `cat #{fetch(:sidekiq_pid)}`> /dev/null 2>&1; then cd #{current_path} && #{fetch(:sidekiqctl_cmd)} quiet #{fetch(:sidekiq_pid)} ; else echo 'Sidekiq is not running'; fi"
end
end
desc "Stop sidekiq"
task :stop do
on roles(fetch(:sidekiq_role)) do
execute "sv stop #{fetch(:sidekiq_runit_service_name)}; true"
execute "if [ -d #{current_path} ] && [ -f #{fetch(:sidekiq_pid)} ] && kill -0 `cat #{fetch(:sidekiq_pid)}`> /dev/null 2>&1; then cd #{current_path} && #{fetch(:sidekiqctl_cmd)} stop #{fetch(:sidekiq_pid)} #{fetch :sidekiq_timeout} ; else echo 'Sidekiq is not running'; fi"
end
end
desc "Start sidekiq"
task :start do
on roles(fetch(:sidekiq_role)) do
execute "sv start #{fetch(:sidekiq_runit_service_name)}"
end
end
desc "Restart sidekiq"
task :restart do
invoke 'sidekiq:stop'
invoke 'sidekiq:start'
end
end
if fetch(:sidekiq_default_hooks)
before 'deploy:started', "sidekiq:quiet"
after 'deploy:updated', "sidekiq:stop"
after 'deploy:reverted', "sidekiq:stop"
after 'deploy:published', "sidekiq:start"
after 'deploy:restart', "sidekiq:restart"
end