時間のかかるコマンドの実行完了時にslack通知するようにする

時間のかかるコマンドの実行完了時にslack通知するようにする
公開日時
更新日時

yarn installdocker-compose build のように時間のかかるコマンドを実行した際に、完了まで待機するだけなのは時間の無駄なので別の作業をしていたい。

同じPCで作業していた場合は定期的にターミナルを見てコマンド実行が完了したかを確認するのでもいいが、別のPCで実行している場合は確認が手間になる。

そこでコマンド実行完了時にslack通知できるようにした。

基本設定

CLIでのSlack通知には「slackcat」を使う。

インストール完了後に↓のコマンドでトークンを発行し、ブラウザに表示されるトークンを入力すれば設定完了。

slackcat --configure

~/.config/slackcat/config を編集することでデフォルトの投稿チャンネルを設定できる。

default_team = "your-team"
default_channel = "notification"

この状態で↓を実行すればコマンド実行結果がSlackに通知される。

docker-compose build | slackcat -t

メンションを送るようにする

slackcatでのSlack通知は認証ユーザ(=自分自身)による投稿になるため、Push通知を受け取ることができない。

そこで、通知用のユーザアカウントを作成してチームに招待し、通知用ユーザのTokenを発行して ~/.config/slackcat/config に設定する。

※ 今回はフリープランのSlack Teamで試しているためユーザ追加は無料だが、有料プランの場合はユーザを追加するごとに料金がかかるので注意

↓のSlack APIのテスト機能を使って、メンションを送りたいユーザのID(= 自分自身)を確認する。

{
  "members": [
    {
      "id": "XXXXXX"
    }
  ]
}

slackcatコマンドにはcommentオプションでメッセージを追加できるので <@user_id> でメンションを送るように設定。

都度user_idを指定するのは手間なので、↓のようにaliasを作っておくと楽。

# ~/.bashrc
alias slack_notify='slackcat -t --channel notification --comment "<@user_id>"'

これで↓を実行すれば、コマンド実行完了時にメンション付きでslack通知される。

docker-compose build | slack_notify

より手軽な方法

Slack API: Applicationsで適当なSlack Appを作成し、Incoming Webhooksを追加する。

slackcatのようにコマンド実行結果を受け取る場合は工夫が必要になるが、単純に実行終了のみを通知するのであればWebhookの方が手軽にできる。

# ~/.bashrc
alias slack_notify="curl -s -o /dev/null -X POST -H 'Content-type: application/json' --data '{\"text\":\"Finished\"}' https://hooks.slack.com/services/xxxx"

WebhookはSlack Appからの通知になるのでDMで自分に送るようにしておけばPush通知も受け取ることが出来る。

また、ユーザ追加の必要もないので有料プランの場合も追加料金無しに対応できる。


Related #slack

jsでSlack Webhookを送信する

公式のWebhook SDKを使うと手軽

VercelのSlack連携アプリを更新した

旧Slack連携アプリは8/20で終了

GitHub app is built on Slack's workspace apps which are now deprecated

旧GitHub appは新appのインストール後に消すべきだった