JenkinsでUnityアプリを自動ビルドして開発効率をあげよう! Part.2 アプリビルド(Android)編
GraffityのAzukiです!
前回から時間が空いてしまいましたが久々のエンジニアブログになります。
Jenkinsを使った自動ビルドの話その2でございます。
前回の記事はこちらです
前回の記事ではJenkinsのインストールをして新規プロジェクトを作成したところまででした。
今回はアプリをビルドするためのスクリプトを書き、それをJenkinsから実行する手順を紹介します!
ビルド対象はiOSとAndroidになるのですが、iOSは少し手順が増えたりするので今回はAndroidで解説をします。
まずはUnityプロジェクトを作る
ビルドをする物がそもそも無いので今回は仮でプロジェクトを作成します。
今回はgraffity_engineer_blog_jenkins_test_unity_projectという名前でプロジェクトを作ってます。
ビルドしたらJenkinsのロゴが出るイケてるプロジェクトを作りました(2分)
このプロジェクトをJenkinsでビルドさせます。
Unityでビルドスクリプトを書こう!
アプリをビルドするときは普段だとUntiyのメニューからビルドをすると思います。
しかし人間向きのUIを使った操作をJenkinsなどの外部ツールでUIを操作するのはあまり現実的ではありません。
そのため、いわゆるCUI、コマンドでUnityを実行させる必要があります。そのほうが便利だからです。
そのため、コマンドラインでJenkinsを実行したときに実行されるメソッドをUnityプロジェクト内に実装する必要があります。今回だとビルドをする、というメソッドを実装してやる必要があるというわけです。
まずはEditorフォルダを作ります。
次にEditorフォルダ内でスクリプトを作成します。
今回はJenkinsBuild.csとしました。
スクリプトを実装していきます。
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
public static class JenkinsBuild
{
[MenuItem("Build/ApplicationBuild/Android")]
public static void BuildAndroid()
{
//AndroidにSwitch Platform
EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Android, BuildTarget.Android);
var scene_name_array = CreateBuildTargetScenes().ToArray();
PlayerSettings.applicationIdentifier = "com.hogehoge.fugafuga";
PlayerSettings.productName = "jenkins test";
PlayerSettings.companyName = "Graffity";
//Splash Screenをオフにする(Personalだと動かないよ)
PlayerSettings.SplashScreen.show = false;
PlayerSettings.SplashScreen.showUnityLogo = false;
//AppBundleは使用しない(本番ビルドのときだけ使うイメージ)
EditorUserBuildSettings.buildAppBundle = false;
BuildPipeline.BuildPlayer(scene_name_array,"Build.apk" , BuildTarget.Android, BuildOptions.Development);
}
#region Util
private static IEnumerable<string> CreateBuildTargetScenes()
{
foreach (var scene in EditorBuildSettings.scenes)
{
if (scene.enabled)
yield return scene.path;
}
}
#endregion
}
少し解説します。
[MenuItem("Build/ApplicationBuild/Android")]
public static void BuildAndroid()
{
Jenkinsで実行するときはstaticクラス・static関数である必要があります。
また、Editor上で動作確認するときに便利なので
[MenuItem("Build/ApplicationBuild/Android")]
みたいな感じでメニューに項目を作っておくと幸せになれます。
var scene_name_array = CreateBuildTargetScenes().ToArray();
--
private static IEnumerable<string> CreateBuildTargetScenes()
{
foreach (var scene in EditorBuildSettings.scenes)
{
if (scene.enabled)
yield return scene.path;
}
}
これは何をしているのかというと
このリストからチェックのついてるものだけ抽出しているという処理です。
要するにビルド対象のシーンの配列を作ってるってことですね。
PlayerSettings.applicationIdentifier = "com.hogehoge.fugafuga";
PlayerSettings.productName = "jenkins test";
PlayerSettings.companyName = "Graffity";
ここはアプリの情報を設定しています。ApplicationIdentifierにはユニークなものを指定しましょう。
//AppBundleは使用しない(本番ビルドのときだけ使うイメージ)
EditorUserBuildSettings.buildAppBundle = false;
AppBundleはGoogleが提供しているアプリのビルド形式のようなものです。
実際にPlayStoreにアップロードするときはAppBundleを使用したほうが良いのですが、ビルドに時間がかかる&実機確認が少しめんどくさくなるので開発中はfalseにしておきましょう。
BuildPipeline.BuildPlayer(scene_name_array,"Build.apk" , BuildTarget.Android, BuildOptions.Development);
最後のこの処理が実際のビルド処理になります。
第一引数にシーンの名前リスト、第2引数に出力ファイル名、3,4はプラットフォーム指定とビルドオプションです。
ここまで書いたら一回動作確認をしましょう
メニューが増えているので押すとビルドが始まります。
数分待ってビルドファイルが出力されれば成功です!
続いて、この処理をJenkins上で行えるようにJenkinsのプロジェクト設定を弄っていきましょう!
Jenkinsでビルドする
Jenkinsを開き作成してあるジョブを開きます
設定をクリックし設定画面を出します。
今回は最低限ビルドできる仕組みをここに構築していきます。
ビルド→シェルの実行をクリックします。
シェルの入力欄が出てくるので下記を入力します
#!/bin/bash
/Applications/Unity/Hub/Editor/2019.4.10f1/Unity.app/Contents/MacOS/Unity \
-batchmode \
-quit \
-logFile ~/graffity_engineer_blog_jenkins_test_unity_project/Unitylog.txt \
-projectPath ~/graffity_engineer_blog_jenkins_test_unity_project/ \
-executeMethod JenkinsBuild.BuildAndroid
これでビルドができます。
こちらも少し解説します。
/Applications/Unity/Hub/Editor/2019.4.10f1/Unity.app/Contents/MacOS/Unity \
Unityの場所を指定します。
ここは人によって場所が変わるかもしれないので都度置き換えてください
-batchmode
このコマンドでUnityをバッチモードで起動することができます。この次以降のコマンドはバッチモード用のコマンドたちということです。
-quit
ビルドが終わったら自動で終了するという設定をしています。そのまま残られても邪魔なだけですしね。
-logFile ~/graffity_engineer_blog_jenkins_test_unity_project/Unitylog.txt \
Unityの動作中のログファイルを出力するための設定です。バッチモードで実行しているとエラーが起きた時などに何が原因かの特定が困難なのでログを必ず出すようにしましょう。
-projectPath ~/graffity_engineer_blog_jenkins_test_unity_project/ \
Projectの場所です。一番大事。
-executeMethod JenkinsBuild.BuildAndroid
実際に実行するメソッドです。こっちのほうが大事だわ。
先ほど作ったJenkinsBuildクラスのBuildAndroidメソッドを指定します。
このコマンドを入力することでビルドが行われるようになります。
記入が終わったらJenkinsで保存を押しましょう
実際にビルドしてみる
ではいよいよ動作確認をします!
ジョブ画面でビルド実行をクリックするとビルドが始まります!
ジョブ開始と同時にUnityも立ち上がります。
しばらくまってこのような表示になればビルド成功です!
(もし赤色になった場合はビルドが失敗しています)
プロジェクトフォルダにApkとLogファイルが出力されていれば成功です!
おまけ
ビルドが成功したかどうかなどはBuildPlayer関数の戻り値から取得することができます。もし失敗した時に何か処理を挟みたい時などはここに書くことができます。
var report = BuildPipeline.BuildPlayer(scene_name_array,"Build.apk" , BuildTarget.Android, BuildOptions.Development);
switch (report.summary.result)
{
case BuildResult.Unknown:
break;
case BuildResult.Succeeded:
break;
case BuildResult.Failed:
break;
case BuildResult.Cancelled:
break;
default:
throw new ArgumentOutOfRangeException();
}
まとめ
今回はJenkinsで実際にアプリをビルドするところまで紹介しました。
今のところただビルドできるだけなのでメリットをあまり感じないかもしれないのですが次回以降、ブランチを指定してビルドや、ApkをDeploygateなどの外部サービスにアップロードする手順などを紹介していこうと思います!
次もできるだけ早く!!!書くのでお楽しみに!!
------------------
CI大好きGraffityについて
この記事が気に入ったらサポートをしてみませんか?