«前の日記(2016-04-24) 最新 次の日記(2016-05-07)» 編集

いがいが日記


2016-05-06 [長年日記]

_ Capistrano3.5でafter hookを書いたときの探索の仕様が変わってた

Capistrano3.5でafter hook を書いたときの探索する名前空間の仕様が変わった模様。

https://github.com/capistrano/capistrano/issues/1652

今回、namespace :deploy の中で after :deploy, :notify do ... end で登録している部分が動かなくなった。

after hook を書くと、以下が実行されます。

https://github.com/capistrano/capistrano/blob/v3.5.0/lib/capistrano/dsl/task_enhancements.rb#L10

ここで2つの処理が行われます。

  • Rake::Task.define_task でRakeタスクとしてcapistranoタスクが登録される (ブロック付きで呼び出された場合。)
    • ちなみに登録されたタスクは Rake::Task.tasks で確認できる。
  • Rake.application.lookup(post_task, task.scope) で実行するタスクを探してキューに積む(たぶん)

namespace :deploy の中で after :deploy, :notify do ... end で登録している部分が動かない。deploy:notify という名前でRakeタスクが登録されるけど、探しにいってるのは :notify になってしまうようだ。そのため Rake.application.lookup(post_task, task.scope) が見つからずにnilになり、それにinvokeメソッドを呼んで ArgumentError: wrong number of arguments (0 for 1+) エラーになる。

これが起こるのは namespace と after の第1引数が両方deploy になって、かつ、ブロックを渡しているケースだけ。after のトリガーを :deploy から deploy:finished へ変更したら動いた。これ、トリガーに :deploy を使うなって話と、名前空間 :deploy を使うなって話なのかな。


«前の日記(2016-04-24) 最新 次の日記(2016-05-07)» 編集