はじめに
バッチ処理的なものを capistrano 3 からやろうと思ったらうまくいかなかったのでなんとかしてみた記録。
cap 3 になってタスク呼び出しが invoke に変わったので、流れってゆうか、ついででダブりコードをきれいにしようと思ったらはまった。
結論
- ruby ってゆうか rake の仕様なの?(よく知らない。ruby好きじゃない)
- execute または reenable で再実行可能にしてあげればいい
OKなコード
namespace :batch do
task :a do
on roles(:all) do
execute :echo, "a"
set :say, "a"
invoke "batch:echos"
end
end
task :b do
on roles(:all) do
execute :echo, "b"
set :say, "b"
invoke "batch:echos"
end
end
task :echos do
on roles(:all) do
execute :echo, "#{fetch(:say,'yes')}"
# こういう強制の仕方はいかがなものかと思うで、
# もっといい書き方のわかるるびりすとからのコメントをお待ちしています
# というわけで、このページで書きたいのはこの1行だけ。
Rake::Task["batch:echos"].reenable
end
end
task :ab do
on roles(:all) do
set :say, "ab"
invoke "batch:echos"
invoke "batch:a"
invoke "batch:b"
end
end
end
これでうまくいった。
cap stg batch:a
cap stg batch:b
cap stg batch:ab
雑感
コード的にはこのへん
https://github.com/capistrano/capistrano/blob/169f69729439dc85246a6a8ca3343e1aabdb4ad5/lib/capistrano/dsl.rb#L15
なので、 呼び出し時 invoke の第二引数に渡したりでどうにかなんないかなと思ったんだけど、
http://docs.ruby-lang.org/ja/2.0.0/class/Rake=3a=3aTask.html#I_INVOKE
これだけじゃどう書けばいいのかわからない程度のruby力しか持ち合わせていないので放棄。
いずれにしても複数回呼ぶようなタスクを共通にして切り出しても大丈夫になったので、コードがきれいになるんじゃないかと思っている。