こんにちは。情熱開発部 プログラム1課の角谷瑠晟です!
普段業務を行っていると定期的に何かを行いたい事は多いと思います。
そこで役に立つのが今回紹介するJenkinsです!
今回はJenkinsでUnityのプロジェクトをビルドし、
その結果をSlackに通知出来るようにするまでの一連の流れを紹介しようと思います。
※Jenkinsのバージョンは2.37.5.1
※Unityのバージョンは2021.3.15f1を使用しています。
Jenkinsとは
ご存じの方がほとんどでしょうが、JenkinsはCIツールになります。
bat等を用意して適切な設定をすればそのbatを定期的に実行してくれます。
また、プラグインも存在しており簡単に他のアプリとの連携も行う事が出来ます。
上記の特徴を生かし定期的にビルドを行う事でデバッグが行いやすくなります。
また、一度設定すれば動作し続けてくれるのでJenkins用のPCを用意し、作業用のPCの負担を減らす事も可能です。
以下のページでJenkinsのインストールが出来ます。
Jenkins
注意点としてJenkinsの起動にはJavaが必要ですが、
Jenkins2.357からはJava8で起動しなくなったので、
Java11またはJenkins17をインストールしている必要があります。
Java
次の見出しからはJenkinsをインストールしており、
起動まで出来ている状態からの話になります。
Jenkins起動までは以下の記事等をご参照ください。
Jenkinsをインストールする手順(Windows)
JenkinsでUnityビルドを行う
まず、JenkinsからUnityのビルドを行うためにビルドをするための静的関数を作成します。
以下のようにBuild関数を定義しました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.Build.Reporting;
public class TestBuild
{
[MenuItem("TestBuild/Build", false)]
public static void Build()
{
// 現在のビルドターゲットの取得
var target = EditorUserBuildSettings.activeBuildTarget;
if ( target == BuildTarget.StandaloneWindows ) target = BuildTarget.StandaloneWindows64;
// 登録されているシーンを取得
List<string> sceneList = new List<string>();
EditorBuildSettingsScene[] scenes = EditorBuildSettings.scenes;
foreach (EditorBuildSettingsScene scene in scenes)
{
if ( scene.enabled ) {
sceneList.Add(scene.path);
}
}
// プレイヤー作成
BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
buildPlayerOptions.scenes = sceneList.ToArray();
// ローカルのROMを吐き出すパスを決定
string path = "../Build/TestBuild.exe";
buildPlayerOptions.locationPathName = path;
buildPlayerOptions.options = BuildOptions.Development;
//引数のPlatform向けを指定
buildPlayerOptions.target = target;
// ROM自体のビルド
BuildReport report = BuildPipeline.BuildPlayer(buildPlayerOptions);
BuildSummary summary = report.summary;
if (summary.result == BuildResult.Succeeded)
Debug.Log("Build succeeded: " + summary.totalSize + " bytes");
else if (summary.result == BuildResult.Failed)
Debug.Log("Build failed");
Debug.Log("Build Done");
}
}
MenuItemにする必要はないですが、Jenkinsから動かした際にそもそもの関数の挙動が間違っているかどうかを調べなくていいようにするためにもUnityのMenuから動かせるようにしておき動作確認をしておくのがおすすめです。
UnityのMenuから実行すると問題なく実行ファイルが作成されているのを確認できました。
では、実際に上記の関数をJenkinsから動作させてみましょう。
Jenkinsで適当なジョブを作成します。
ジョブを作成すると最初にジョブの設定画面になるはずなので、
その中の下の方にある項目のBuildStepsの欄でWindowsバッチコマンドの実行を選択し、以下のような記述をします。
"C:\Program Files\Unity\Hub\Editor\2021.3.15f1\Editor\Unity.exe" -batchmode -quit -projectPath D:\JenkinsProject/JenkinsUnityProject -executeMethod TestBuild.Build
- -batchmode・・・Unityを開くのではなくbatchmodeとして起動
- -quit・・・関数を実行した後に自動でUnityを終了
- -projectPath・・・UnityProjectのパス
- -excuteMethod・・・実行したい関数(関数はstaticである必要があります。)
他の引数や詳細が知りたい場合はUnityの公式ドキュメントがあるのでそちらをご確認ください。
Unityコマンドライン引数
問題なく実行出来ると先ほどUnityのEditor画面で実行して作成された場所と同じ場所に実行ファイルが生成されているはずです。
これでJenkinsからUnityの関数を実行してビルドをする準備は整いました。
次はSlackとの連携を行います。
JenkinsとSlackを連携させる
次はビルドが成功したかどうかをJenkinsの画面を確認しなくても分かるようにSlackと連携しましょう。
まずは、SlackでJenkinsがメッセージを送信できるようするためにSlackのチャンネルにJenkinsのAppを追加します。
SlackにJenkinsCIを追加する
AppがSlackに追加出来るとJenkins CIのページが開くので以下の
チームサブドメインとインテグレーション用トークン認証情報 IDをメモしておいてください。
次はJenkinsで設定をする必要があるのでJenkinsで設定を行います。
Jenkinsの管理の欄のプラグインの管理を選択します。
Avaliable pluginsの欄からSlack Notificationにチェックを入れ一番下のInstall without restartを選択します。
これにより、プラグインがインストールされるはずです。
ジョブの設定画面のBuildStepsの下にあるビルド後の処理からSlackNotificationを追加します。
上記を選択して新しく追加される入力項目の高度な設定を選択して先ほどメモしておいたIDを入力します。
- Workspace・・・チームサブドメインのID
- Slack Token (deprecated)・・・インテグレーション用トークン認証情報 ID
- Channel・・・投稿したいSlackのチャンネルを入力します。
選択した後は必要な通知項目にチェックを入れます。
Gitを使用している場合はNotification message includesの欄の設定を変えるだけで簡単に今回のJenkinsがGitを更新した際分のコミット履歴をSlackに表示することが出来ます。
では実際に実行してみましょう。
Slackにビルドが始まった事と成功したことが無事通知されました!
さいごに
今回はUnityをJenkinsでビルドし、その結果をSlackに通知するまでの流れを紹介しました。
Jenkinsを触ったことがない方は難しいと思うかもしれませんが、
プラグインを用いて簡単にSlackとの連携も行えるため、
最低限欲しい機能を実装した状態のビルド環境作りというのは簡単に出来るかと思います。
まだまだ他にも便利なプラグインもあると思うので、ぜひ自分で使用して確認してみてください。
最後までご覧いただきありがとうございました。
参考にさせていただいた資料
【免責事項】
本サイトでの情報を利用することによる損害等に対し、
株式会社ロジカルビートは一切の責任を負いません。