hello-world
webエンジニアのメモ。とりあえずやってみる。

[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

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

参考


Related #capistrano

[解決] capistranoでcopy_excludeが動いた

昨日、 capistranoでcopy\_excludeが動かない という記事を書きましたが、追加調査を行い無事に解決することができました。

capistranoで世代管理する際の注意点

最近、デプロイツールに capistranoを使っているのですが、世代管理の設定を勘違いしていたのでメモを残しておきます。

[rails]capistrano3でrole指定したサーバが複数台ある場合に、ある1台でのみ実行する方法

capistrano 3.2.1 で確認 capistrano3でrole指定したサーバが複数台ある場合に、ある1台でのみ実行する方法です。

capistranoを使ってsymfonyデプロイ(capifonyのインストールと設定)

Railsのデプロイツールであるcapistranoを使って、symfonyのプロジェクトをデプロイできるcapifonyというgemを使ってみたのでそのインストールと設定方法をメモしておきます。