hello-world.jp.net
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

[rails]cap deploy時に複数のAuto Scalingグループにもデプロイしたい

先日、AWSのAuto Scallingを使った際に、cap deploy時にAuto Scaleインスタンスにも自動でデプロイできるようにする必要があったので調べたところ、

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

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

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

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

[未解決] capistranoでcopy_excludeが動かない

capistrano でデプロイ時に不要ファイル(.svn, .git等)を省く設定をしたのですが、なぜかうまく動きません。