Capistrano のデプロイ実行を通知するGem を作った

今のところ、Webhook にしか対応していない。とりあえず、Slack は連携できます。 ソースはGitHub を参照ください。

Gem の使い方

インストール方法

Gemfile に下記を追加する。

gem 'capistrano-hook'

Capfile に下記を追加する。

require 'capistrano/hook'

Slack への通知設定

Incoming Webhook Integration から通知用のIntegration を作成する。 作成した後に発行される Webhook URL を :webhook_url に指定する。 定義するファイルは config/deploy.rb でも個別環境ごとの config/deploy/production.rb などでも良い。

set :webhook_url, 'https://hooks.slack.com/services/XXXXXXXX'

各デプロイタスクで通知が必要な場合に適宜下記の変数を定義する。 変数を定義しなければ通知はスキップされます。

設定するハッシュの内容はSlack のAPI ドキュメント Incoming Webhooks を参照ください。

デプロイ開始時の通知設定

set :webhook_starting_payload, {
  username:   'Capistrano',
  icon_emoji: ':monkey_face:',
  text:       'Now, deploying...'
}

デプロイ終了時の通知設定

set :webhook_finished_payload, {
  username:   'Capistrano',
  icon_emoji: ':monkey_face:',
  text:       'Deployment has been completed!'
}

デプロイ失敗時の通知設定

set :webhook_failed_payload, {
  username:   'Capistrano',
  icon_emoji: ':monkey_face:',
  text:       'Oops! something went wrong.'
}

Hubot などを使って通知をしても良いが、Incoming Webhook を使うとSlack のチャンネル名を変更するときもSlack 側の変更だけで済むので楽だと思う。

通知の仕組み解説

Capistrano のデプロイフローにあわせて通知用のタスクをフックして実行しています。

Capistrano のデプロイフロー

capistrano-hook が利用しているのは下記の3つのフローです。

  • deploy:starting
    • デプロイ開始時に実行される事前処理タスク
  • deploy:finishing
    • デプロイ終了時に実行される事後処理タスク
  • deploy:failed
    • デプロイ失敗時に実行されるタスク

cf. Capistrano - Flow

Capistrano のBefore / After Hooks

Capistrano のタスクに対して、before, after フックを定義できます。 capistrano-hook は下記のタスクをフックしています。

before 'deploy:starting',  'webhook:post:starting'
after  'deploy:finishing', 'webhook:post:finished'
after  'deploy:failed',    'webhook:post:failed'

webhook:post:* のタスクは capistrano-hook 内で定義しているタスクです。

もやもや

Capistrano タスクのテストはどうしたら良いのか?

capistrano-bundlercapistrano-rbenv などを読んだけど、テストが無かった :disappointed_relieved: