備忘録。
社内の情報共有サイトに Google Chat で Webhook を使う方法が流れてたので、それを参考に Jenkins のビルドを通知する Bot を設定しました。
普段、Git と Jenkins を使っているのですが、現在の運用では、リリース内容によってはビルドするブランチを master から feature や release などに切り替えることがあります。で、今の Jenkins のビルド設定でどのブランチのどのコミットをビルドしたのかを手軽に知りたいと思いまして。
Git のブランチモデルについてまとめた記事はこちら。
Git ブランチモデル改善 (案) - kntmr-blog
前提
- Windows 10 Pro
- Jenkins 2.107.3
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%"