はじめに
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」もよろしくお願いします!