AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

Capistrano3 で複数のデプロイ先を設定する

といっても、 config/deploy/production.rb に複数 server を書いて、物理的に別のサーバにデプロイする、とかいうやつじゃないです。

複数の deploy_to を設定する

これ、1つのサーバに複数のデプロイ先を用意します。

どういう時に必要かというと、1ソースの中でコンフィグによって出し分けをしていたりする場合ですね。コアは共有してるけど、コンフィグの値によって表示する view が違う(分けることができる)場合とか。んで、コンフィグ違いによってサブドメインを分けて複数サイトを運用している場合。具体的に言うと以下みたいにしたい感じ。

└┬ /var/
 └┬ /www/
  └┬ /AppRoot/
   ├┬ /config-a/
   │└─ /current/
   └┬ /config-b/
    └─ /current/

production staging でそれぞれ * /var/www/AppRoot/config-a/current/ * /var/www/AppRoot/config-b/current/ にデプロイした、合計 4 環境作りたい、と。

どうする

Capistrano2 までなら、起動時のコマンドに -S 引数 とすることで引数がつけれたようですが、 Capistrano3 では廃止されたようです。 代わりに環境変数を設定するようにして、 config/deploy.rb 内で、その環境変数を読み取り利用します。

具体的にはこう

config/deploy.rb

case ENV['CONFIG_TYPE']
when "config-a"
  set :deploy_to, "/var/www/AppRoot/config-a/"
when "config-b"
  set :deploy_to, "/var/www/AppRoot/config-b/"
else
  print ("有効な CONFIG_TYPE= を指定してください")
  exit!
end

bundle exec cap (staging|production) deploy CONFIG_TYPE=(config-a|config-b) と実行します。

デプロイ先の指定には、 RALIS_ENV= 的なノリで指定するようにしました。

期待した値となる、 config-a config-b が入っていない場合は「有効な CONFIG_TYPE= を指定してください」と表示して終了します。

そうそう必要になる人はおらんじゃろ!って感じですが、調べても簡単にやる方法が出てこなかったので、バッドっぽいノウハウとしてお納め頂ければ。