[rails]capistrano実行時にユーザ入力によって動作を変える
capistranoでaskメソッドを使うとユーザ入力を受け付けることが可能になります。
例えば独自バッチのプロセスを再起動するかどうかをデプロイ時の状況によって変更したい場合
# config/deploy.rb
set :restart_my_batch, ask('restart my batch ? (default: false)', false)
namespace :deploy do
desc 'Restart application'
task :restart do
on roles(:app) do
invoke 'unicorn:restart'
end
on roles(:batch) do # ユーザ入力に応じて動作を変更
invoke 'my_batch:restart' if fetch(:restart_my_batch)
end
end
end
という風にするとデプロイ実行時にユーザ入力によって動作を切り替えることができます。
(lib/capistrano/tasks/my_batch.cap に独自バッチの再起動タスクが定義されている想定です)
ただ、askに入力が聞かれるタイミングがfetchを行ったタイミングになるため、この状態だとdeploy:restartタスクが実行された段階で初めてユーザ入力が聞かれるのでしばらく待たなければなりません。
どうせならデプロイを実行したタイミングで必要なユーザ入力を済ませておきたいと思ったので、以下のようにaskのすぐ後にfetchを記述し、即ユーザ入力が発生するようにしました。
set :restart_my_batch, ask('restart my batch ? (default: false)', false)
fetch(:restart_my_batch) # これを追加(この段階でユーザ入力が発生)
namespace :deploy do
desc 'Restart application'
task :restart do
on roles(:app) do
invoke 'unicorn:restart'
end
on roles(:batch) do # ユーザ入力に応じて動作を変更
invoke 'my_batch:restart' if fetch(:restart_my_batch)
end
end
end
最初にユーザ入力をしておくことで、ユーザ入力でデプロイが止まってしまっていた、というミスを防げますね。