Capistrano3で複数コンポーネントのリリースを一つにまとめようとしたが諦めた。
ここでは諦めた理由をメモしておく。
db:migrateなど同一のタスクを利用する同じ種類のコンポーネントなら一つにはまとめられそうではある。
やりたかったこと
capistrano-multiconfigで以下のような感じで複数コンポーネントのリリースを1つにまとめてしまう。
$ cd cap-all
$ cap app:staging deploy # rails app リリース
$ cap static:staging deploy # 非rails static リリース
諦めた理由
capistranoでは以下のような順番で処理が行われる(該当コード)。
1. 定義されたload:defaultsタスクで初期値読み込みなど(19行目)
2. 指定されたconfig読み込み(34行目から)
例えばbundle installをするためのcapistrano/bundlerはタスク定義とload:defaultによる初期値設定が同じファイルで定義されている(該当コード)。
このため
- 1.の処理前にcapistrano/bundlerをrequireするとタスクが定義されタスク間のhookが決められてしまう。
- (bundleが必要なコンポーネントとそうでないコンポーネントがある場合でも、共通でbundleのタスクが実行されてしまう)。
- configでrequireするとタスクとタスク間のhookはわけられるが、load:defaultsタスクが実施されないため初期値が定義されない。
上記どちらの方法も対応は可能だと思うが複雑になりそうだと思ったので諦めた。