LoginSignup
3
5

More than 5 years have passed since last update.

capistrano 3 で1回の実行中に同じタスクを2回以上呼ぶには reenable すればOK

Posted at

はじめに

バッチ処理的なものを 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力しか持ち合わせていないので放棄。

いずれにしても複数回呼ぶようなタスクを共通にして切り出しても大丈夫になったので、コードがきれいになるんじゃないかと思っている。

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5