Jenkins から curl で Google Chat に通知する

備忘録。

社内の情報共有サイトに Google Chat で Webhook を使う方法が流れてたので、それを参考に Jenkins のビルドを通知する Bot を設定しました。

普段、Git と Jenkins を使っているのですが、現在の運用では、リリース内容によってはビルドするブランチを master から feature や release などに切り替えることがあります。で、今の Jenkins のビルド設定でどのブランチのどのコミットをビルドしたのかを手軽に知りたいと思いまして。

Git のブランチモデルについてまとめた記事はこちら。

Git ブランチモデル改善 (案) - kntmr-blog

前提

Webhook

Google Chat のルームから Webhook を設定する。以下のような URL が生成される。

https://chat.googleapis.com/v1/spaces/<ROOM_ID>/messages?key=<KEY>&token=<TOKEN>

Jenkins

今回は「Windowsバッチコマンドの実行」から curl で POST する。curl コマンドがない場合はインストールする。

Jenkins から curl が参照できない

この Jenkins が 32bit で動作しているのが原因なのか、C:\Windows\System32\curl コマンドが参照できないっぽい。なので、C:\Windows\SysWOW64\curl.exe を使うようにする。

リクエストエラー1

コマンドプロンプトから叩くと正常に実行できるのに、Jenkins から実行すると Payload が正しくないというエラーが返る。

$ curl -X POST -H "Content-Type:application/json" -d '{"text": "message"}' "%WEBHOOK_URL%"

リクエストの JSON をダブルクォートで囲って、中のダブルクォートをエスケープしたらイケた。ただ、^エスケープするだけでもよかったかも。

$ curl -X POST -H "Content-Type:application/json" -d "{\"text\": \"message\"}" "%WEBHOOK_URL%"

リクエストエラー2

Jenkins から curl を実行すると 400 Invalid request token が返る。原因は Webhook の URL に &% が含まれているため。& はクエリパラメータなのでいいとして、なぜ token に % が含まれるんだろうか...。

それぞれエスケープして ^&%% にする。

https://chat.googleapis.com/v1/spaces/<ROOM_ID>/messages?key=<KEY>^&token=aaaaaaaa%%3D

まとめ

最終的にこんな感じになりました。リクエストに thread を指定すると同一のスレッドにメッセージを送ることができる。今回は Jenkins の環境変数を利用して以下の情報を通知するようにした。(実際はもう少し気の利いたメッセージにしてある)

  • BUILD_NUMBER: ビルド番号
  • GIT_BRANCH: ブランチ
  • GIT_COMMIT: コミットハッシュ
set PROXY=http://<PROXY_HOST>:<PROXY_PORT>/
set WEBHOOK_URL=https://chat.googleapis.com/v1/spaces/<ROOM_ID>/messages?key=<KEY>^&token=aaaaaaaa%%3D
curl -X POST -H "Content-Type:application/json" -d "{\"text\": \"%BUILD_NUMBER% %GIT_BRANCH% %GIT_COMMIT%\", \"thread\": {\"name\": \"spaces/<ROOM_ID>/threads/<THREAD_ID>\"}}" -x %PROXY% "%WEBHOOK_URL%"