[rails]capistrano実行時にユーザ入力によって動作を変える


[まとめ] 現在開催中のKindleセール情報はこちら

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

という風にするとデプロイ実行時にユーザ入力によって動作を切り替えることができます。

(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

最初にユーザ入力をしておくことで、ユーザ入力でデプロイが止まってしまっていた、というミスを防げますね。

参考

[まとめ] 現在開催中のKindleセール情報はこちら