【Jenkins】ビルド失敗時のログをSlackに自動投稿する


はじめに

Jenkinsのビルドが失敗した時、ログから原因を特定して修正を行う必要があります。しかし、Jenkinsを社内のローカルサーバーで動かしている場合など、外部からアクセスできない場合がありました。そこで、今回はビルド失敗時のログを自動的にSlackに投稿する仕組みを作ったので、紹介したいと思います。

環境

  • Windows 10 Home 1903
  • Jenkins ver. 2.204.5

方法

ビルド失敗時のトリガー

今回はParameterized Trigger pluginを使いました。これはパラメータを引継ぎつつ下流ジョブを動かすことができるプラグインです。ログを出力する際に必要がパラメーター渡しつつ、また発火の条件を指定することもできる(今回はビルド失敗時)ため、要件に合致していました。

参考: 開発者(個人)のためのJenkins - Parameter編

ちなみに下流ジョブでは受け取るパラメータを定義しておく必要がある点に注意です。

Jenkinsのビルドログを取得してutf8に変換する

下流ジョブのビルド/シェルの実行にて記述していきます。

cd "${JENKINS_HOME}/workspace"

curl http://localhost:8080/all/job/${PROJECT_NAME}/${BUILD_NUMBER}/consoleText >${PROJECT_NAME}-${BUILD_NUMBER}.log
./convert.bat ${PROJECT_NAME}-${BUILD_NUMBER}.log

ビルドログの取得にはcurlコマンドを利用します。ビルドログはhttp://[JENKINS_URL]/job/[JOB_NAME]/[BUILD_NUMBER]/consoleTextで取得できるため、上流ジョブから引き継いだパラメータを利用して加工します。そのままだとconcoleTextという名前で保存されてしまうので、今後のためにビルド情報を使った名前をつけておきます。

また、WindowsではShift-Jis形式になっていて不都合があるため、UTF8に変換しておきます。以下のバッチファイルを利用しました。

参考: シフトJISのテキストファイルをUTF-8に変換するバッチ - 今日を乗り切るExcel研究所

(今回は出力ファイルで上書きされるように一部変更しています)

Slackにログファイルをアップロードする

Slack APIを使ってファイルをアップロードします。ファイル操作の権限が必要なため、Slack Appの作成が必要になります。少し煩雑ですが、ドキュメントを参考に進めていけば難しく無いと思います。

参考: Basic app setup | Slack
参考: files.upload method | Slack

curlコマンドを使って以下のようにアップロードできました(CHANNEL_IDと“ACCESS_TOKEN`は書き換えてください)

curl -F file=@${PROJECT_NAME}-${BUILD_NUMBER}.log -F channels=[CHANNEL_ID] -H "Authorization: Bearer xoxb-[ACCESS_TOKEN]" https://slack.com/api/files.upload
rm ${PROJECT_NAME}-${BUILD_NUMBER}.log

参考: Slack — APIに使う「チャンネルID」を取得する方法 - Qiita

最後にrmコマンドでローカルからファイルを削除して終わりです。

最後に

宣伝ですが、MyDearest株式会社では新作VRゲーム『ALTDEUS: Beyond Chronos(アルトデウス: ビヨンドクロノス)』を開発中です。リリースされたぜひ遊んでください!

また、私のTwitter(@nkjzm)のフォローや「LGTM」もよろしくお願いします!