odeの開発メモ日記

プログラマーやってます。今までの道のり ポケコンbasic→C(DirectX5 ネットやろうぜ)→Perl(ちょろっと)→Java→C#→Ruby→Android(Java)

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)