メリークリスマス!
最後は cap deploy
とかの前後にChatWorkに投稿するためのgemの紹介です
- https://github.com/sue445/capistrano-around_chatwork
- https://rubygems.org/gems/capistrano-around_chatwork
capistrano-chatworkとの違い
capistranoからChatWorkに投稿するプラグインで https://github.com/mitukiii/capistrano-chatwork がありますが、capistrano-chatworkは cap deploy
の前後に投稿するのに対し、capistrano-around_chatworkでは任意のtaskの前後にChatWorkに投稿することができます。
サンプル
cap unicorn:start
の前後にChatWorkに投稿しています。doneのtaskの実行時間も自動計算されます
使い方
require "capistrano/around_chatwork"
set :chatwork_api_token, "YOUR_API_TOKEN"
set :chatwork_room_id, 00000000
around_chatwork "unicorn:start"
ChatWorkのAPI tokenと通知先の部屋IDを設定し、前後を通知で囲みたいタスクを around_chatwork
に書くだけでokです。
chatwork_api_token
と chatwork_room_id
は capistrano-chatworkと全く同じものなので、capistrano-chatworkを導入してる場合は同じ設定を共有できます
通知メッセージを編集したい場合は starting_message
と ending_message
をいい感じに編集して下さい。
set :starting_message, -> {
"[info][title][#{fetch(:stage)}] :task_name: @#{fetch(:user)}[/title]started[/info]"
}
set :ending_message, -> {
"[info][title][#{fetch(:stage)}] :task_name: @#{fetch(:user)}[/title]done (:elapsed_time: sec)[/info]"
}
文中の :task_name:
と :elapsed_time:
はフックしたタスク名とタスクの処理時間に置換されます。
詳しいこと
capタスクの前後に動的にタスクを設定したい
capistrano 3系の仕組みはRake taskがベースなので下記が参考になります
Rake で任意のタスクの前後に別のタスクを実行する - HsbtDiary(2012-02-10)
実際のコードはこんな感じです。
def around_chatwork(task_name)
start_time = nil
before_task = Rake::Task.define_task("#{task_name}:__before__") do
message = Capistrano::AroundChatwork.format_message(fetch(:starting_message), task_name)
Capistrano::AroundChatwork.post_chatwork(message)
start_time = Time.now
end
after_task = Rake::Task.define_task("#{task_name}:__after__") do
elapsed_time = Time.now - start_time
message = Capistrano::AroundChatwork.format_message(fetch(:ending_message), task_name, elapsed_time)
Capistrano::AroundChatwork.post_chatwork(message)
end
Rake::Task[task_name].enhance([before_task]) do
Rake::Task[after_task].invoke
end
end
ちょっと強引ですが、around_chatwork
に渡されたtask名の前後に実行したいtaskをそれぞれ動的生成して、enhance
と invoke
に渡しています。
ちなみにcapistranoのbefore/afterでも同じことをやっています
https://github.com/capistrano/capistrano/blob/v3.6.1/lib/capistrano/dsl/task_enhancements.rb#L5-L18