capistranoで複数のデプロイをしたい場合
設置の単位を分けたい場合があります。
例えばステージングと本番環境(プロダクション)や、ウェブアプリとバッチ等です。
やり方
deploy.rbファイルを用途別に作成する。
- config/deploys/staging_web.rb(ステージングweb)
- config/deploys/production_web.rb(本番web)
- config/deploys/production_batch_create_search_index.rb(各種バッチごと)
上記の各ファイルは通常のdeploy.rbと同じ記述をしてもらうとして、追加で先頭に下記の2行を追加する
load 'deploy' if respond_to?(:namespace) # cap2 differentiator Dir["#{File.dirname(__FILE__)}/../../vendor/plugins/*/recipes/*.rb"].each { |plugin| load(plugin) }
RAILS_ROOT/Capfileは使用しないので削除しても構わない。
デプロイ時のコマンド
cap -f config/deploys/production_batch_create_search_index
.rb deploy
副次的なメリット
railsアプリのパスでなくても実行可能になります。
今までは
cd /usr/local/rails/hogeapp/
cap deployとしていたのが
cap -f /usr/local/rails/hogeapp/config/deploys/production_batch_create_search_index
.rb deploy
と1行で実行可能になります。
解説
-fオプションによりdeploy.rbだけでない任意のファイルを指定可能になります。
但しこの場合RAILS_ROOT/Capfileが読まれなくなるためにデフォルトのタスクのdeploy等が使用できなくなります。
-Fというオプションを渡すことでCapfileを読むように指定できるのですが、またこれが曲者で-fで指定したタスクの後にCapfileをロードするために
-fで指定したdeploy:start(任意のサーバー thinやpassngerを起動するために上書きする)等をデフォルトのタスク(script/reaper等)に戻してしまいます。
そのためCapfileの中身を少し修正したものをdeploy.rbの先頭に追加することで回避しました。
調査メモ
-fでのファイルの後にCapfileが呼ばれるのをソースを見て確認しました。
option_parserで-fで指定したrecipeを追加し、その後にlook_for_default_recipe_fileで
デフォルトのrecipe(RAILS_ROOTのCapfile)をロードしている。
capistrano/cli/options.rb
option_parser.parse!(args) coerce_variable_types! # if no verbosity has been specified, be verbose options[:verbose] = 3 if !options.has_key?(:verbose) look_for_default_recipe_file! if options[:default_config] || options[:recipes].empty?
その他の方法
capistrano-extというgemを使う方法があるらしいです。
実行環境
capistrano (2.5.5)