こんにちは。情熱開発部 プログラム1課の角谷瑠晟です!
自分ですが、ようやく担当していたプロジェクトが無事ひと段落しそうでほっとしています。
さて、今回はそのプロジェクトを安定して進行する上でも大切なJenkisを
前回行った内容からさらに便利にして行こうと思います。
具体的に言うとJenkinsからSlackに通知を送る際ビルドに失敗していた場合ビルドの結果を送信しようと思います。
これが行えるとSlackを見るだけで何故ビルドが失敗しているか分かるようになります。
※Jenkinsのバージョンは前回と同じく2.37.5.1を使用しています。
前回のJenkinsブログの振り返り
まず今回のブログの内容に入る前に前回自分が書かせていただいたJenkinsのブログについて振り返らせていただこうと思います。
前回のブログは以下をご参照ください。
JenkinsでUnityをビルドしてSlackに結果を通知する
前回はJenkinsでUnityビルドを行いビルドしたかどうかをSlackに通知するという簡単なものでした。
これでもJenkinsとして最低限の仕事はこなせますが、
このままだとJenkinsがビルドを開始したか、ビルドが成功したか、ビルドが失敗したかという大まかな情報しかSlackで確認することが出来ません。
もし、ビルドが失敗した場合の内容を細かく確認しようとした場合Jenkinsに接続しコンソール履歴からビルドの結果を確認する必要があります。
上記の状態でも問題がないと言えば問題はありませんが、
出来ればJenkinsにアクセスする事を必要とせずSlackで確認出来る方が確認の手間も少なく便利だということが分かるかと思います。
準備編1:ビルドエラーを発生させる
上記の反省点を生かして今回はJenkinsでSlackにビルド結果を送信しSlackでどうしてビルドが失敗したかを確認できるようにしようと思います。
こちらが出来ることによりビルドが失敗した場合でもJenkinsにアクセスせずになぜビルドが失敗したかを確認することが出来ます。
では、まずビルドを失敗させるために適当なUnityProjectを作成し、
以下のようなscriptを追加します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class test : MonoBehaviour
{
int testbuilderror = 0 // ここでエラーが発生
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
コメントでも記載している通り、このままではビルドエラーが起きてしまいますね。
ここで前回のブログで行ったbatchmodeでのビルドを行ってください。
するとUnityは以下にEditorのログを吐き出してくれるのでご確認ください。
C:\Users\username\AppData\Local\Unity\Editor\Editor.log
上記のlogを開いて最後の方を確認すると以下のようなエラー文が書かれているのが分かると思います。
このlogをSlackに投稿出来れば目的は達成出来そうです!
##### Output
Assets\test.cs(7,27): error CS1002: ; expected
*** Tundra build failed (0.11 seconds), 1 items updated, 316 evaluated
Assets\test.cs(7,27): error CS1002: ; expected
AssetDatabase: script compilation time: 0.421596s
Scripts have compiler errors.
Exiting without the bug reporter. Application will terminate with return code 1
準備編2:Slackでの準備を行う
自分が試した限りだとSlackに最初から追加されているJenkins CIを使っての自由なSlackの投稿やファイルのアップロードは出来なさそうでした。
ですので、SlackAppを作成する必要があります。
今回は本題ではないためSlackAppの作成は以下のサイト等を参考に行ってください。
https://qiita.com/yuukiw00w/items/94e4495fc593cfbda45c
作成した後Jenkinsから投稿したいChannelへのAppの追加を忘れないようにしてください。
また、Scopesの設定は書き込みを行う関係上chat:writeが必要です。
いよいよJenkinsで作業を行う
さて、ここまで来てようやくJenkinsで作業を行う事が可能です。
Slackへの通知を行うJobを作成するためにパイプラインを選択してジョブを作成してください。
作成したジョブの設定画面が開くと思います。
最後までスクロールを行い下の方にあるPiplineSyntaxを選択します。
選択すると以下のようなページに遷移すると思います。
ここでSampleStepを選択し、その中からslackSend:Send SlackMessageを選択してください。
選択したら以下のような画面に切り替わると思います。
まずは先ほど作成したSlackのAppへのアクセス権限をJenkinsに付与する必要があります。
高度な設定を選択し、Credentialの項目の追加を選択してください。
種類はSecret textを選択して貰えば大丈夫です。
Secretの欄に先ほどSlackで作成したAppのBot User OAuth Tokenを入力します。
IDは好きな名前で大丈夫です。
Credentialに追加し終わった後は必要な情報を入力し下の方にあるGenerate Pipline Scriptをクリックしてみてください。
以下のようなコードが生成されると思います。
slackSend channel: '#general', message: 'test', teamDomain: 'Slack', tokenCredentialId: 'test'
PiplineSyntaxのページでは必要な入力をすることで簡単なサンプルコードを入手する事が可能です。
では、こちらを元にしてSlackにEditor.logのテキストを投稿するコードを書いてみます。
pipeline {
agent any
stages {
stage('SlackMessageSend') {
steps {
script {
dir('C:\\Users\\build01\\AppData\\Local\\Unity\\Editor') {
String messagetext = readFile encoding: 'shift-jis', file: 'Editor.log'
slackSend botUser: true, channel: '#general', color: 'good', message: messagetext, teamDomain: 'Slack', tokenCredentialId: 'test'
}
}
}
}
}
}
ファイル内のテキストの取得ですが、こちらもPiplineSyntaxページのSample StepにreadFile: Read file from workspaceという項目があるのでそちらを選択して必要な情報を記入した後Generate Pipline Scriptを入力することで上記と似たサンプルコードを取得する事が出来ます。
こちらのパイプラインを動かすと以下のようになります。(Editor.logが長すぎて文章が見切れてしまうため最後の部分以外は省いた状態にしています。)
無事Editor.logの内容を取得してSlackに投稿する事が出来てそうですね!
これでSlackを確認するだけで何故エラーが起きているのかを確認する事が可能です!
実際にビルドが失敗した時にだけビルド結果を送信する場合は以下のようなスクリプトになります。
9行目のbuildでビルド用のJenkinsのジョブを動かし、
エラーが発生した際に上記で行ったSlackへの送信スクリプトを呼ぶ事で実現可能です。
pipeline {
agent any
stages {
stage('Build'){
steps {
script {
try {
build 'testbuild'
} catch(Exception e){
currentBuild.result = 'FILURE'
dir('C:\\Users\\build01\\AppData\\Local\\Unity\\Editor') {
String messagetext = readFile encoding: 'shift-jis', file: 'Editor.log'
slackSend botUser: true, channel: '#general', color: 'good', message: messagetext, teamDomain: 'Slack', tokenCredentialId: 'test'
}
}
}
}
}
}
}
終わりに
いかがでしたでしょうか。
事前に準備する事が多く大変な印象があるかと思いますが、
準備さえしてしまえばGroovy言語を触った事がなかった自分でも
調べたり生成されるサンプルコードを見る事によってPiplineでSlackとの連携を行う事が可能でした。
また、テキストを取得しSlackに投稿出来るだけで行える幅が大きく広がると思います。
実際自分が関わったプロジェクトでもROMのサイズをテキストに吐き出しそれを取得しSlackに投稿することによって日々のROM容量の推移を確認する事が出来ました。
書き方さえある程度分かればPiplineSyntaxのページで必要情報を入力しサンプルコードを出力するだけでファイルのアップロード等も簡単に出来ると思いますので是非ご自分でも挑戦してみてください。
最後までご覧いただきありがとうございました。
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。