LoginSignup
2
0

More than 5 years have passed since last update.

特定の処理の前後にChatWorkに投稿する「capistrano-around_chatwork」

Posted at

メリークリスマス! :santa:

最後は cap deploy とかの前後にChatWorkに投稿するためのgemの紹介です

capistrano-chatworkとの違い

capistranoからChatWorkに投稿するプラグインで https://github.com/mitukiii/capistrano-chatwork がありますが、capistrano-chatworkは cap deploy の前後に投稿するのに対し、capistrano-around_chatworkでは任意のtaskの前後にChatWorkに投稿することができます。

サンプル

20150603215100.png

cap unicorn:start の前後にChatWorkに投稿しています。doneのtaskの実行時間も自動計算されます

使い方

Capfile
require "capistrano/around_chatwork"
config/deploy.rb
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_tokenchatwork_room_id は capistrano-chatworkと全く同じものなので、capistrano-chatworkを導入してる場合は同じ設定を共有できます

通知メッセージを編集したい場合は starting_messageending_message をいい感じに編集して下さい。

config/deploy.rb
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)

実際のコードはこんな感じです。

lib/capistrano/around_chatwork.rb
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をそれぞれ動的生成して、enhanceinvoke に渡しています。

ちなみにcapistranoのbefore/afterでも同じことをやっています
https://github.com/capistrano/capistrano/blob/v3.6.1/lib/capistrano/dsl/task_enhancements.rb#L5-L18

2
0
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
2
0