GitLab CI で Unity アプリをビルドする CI テンプレートを作った
この記事は GitLab Advent Calendar 2022 の 9 日目の記事です。
GitLab CI で Unity アプリをビルドする CI テンプレートを作った
Unity アプリを CI でビルドするサービスはいくつかあります。
- Unity Cloud Build を使う
- GameCI を GitHub Actions などで使う
後者の GameCI は GitLab でも使える のですが、.gitlab-ci.yml ファイルをこぴって適切に修正してくださいとなかなか大変そうなものです。
個人的には少しずつ追記していくタイプが欲しかったので、自作してみました。
Unity アプリをビルドする
Unity アプリを CI でビルドする際の課題は二つあります。
- Unity Editor のライセンスの登録
- Unity アプリのビルドスクリプト
ちょっとめんどくさいです。
Unity GitLab CI の組み込み
まずはあなたの Unity プロジェクトを GitLab リポジトリにプッシュしてください。
その次に、.gitlab-ci.yml
ファイルを作成し、次の一行を追加し、これもプッシュします。
include: https://gitlab.com/ignis-build/unity-gitlab-ci/-/raw/master/ci/templates/unity.yml
ライセンスの登録
最初に、ライセンスアクティベーションファイルを作成する CI ジョブ (request:alf
) が動作します。プロジェクトの左サイドバーの CI/CD
からパイプライン
を開いて、該当するジョブを開いてください。
ジョブの完了後、Unity_v202x.x.xx.alf
ファイルをダウンロードします。
このファイルを Unity の手動でのライセンス登録サイトでアップロードして、ラインセンスファイルをダウンロードします。ファイル名は Unity_v202x.ulf
となっているはずです。
このファイルをプロジェクトの CI/CD 変数に登録します。プロジェクトの左サイドバーの設定
-> CI/CD
-> 変数
を開き、UNITY_ULF
変数を追加します。
- 値には
Unity_v202x.ulf
ファイルの内容をコピペします。 -
Type
はFile
を必ず選んでください。
以上で Unity Editor のライセンスの登録は完了です。
次回からはライセンスアクティベーションファイルを作成する CI ジョブ (request:alf
) は動作しません。
Unity アプリをビルドする
Unity アプリをビルドするために、C# のコードを書く必要があります。
次のコードは WebGL プラットフォームでビルドする C# のコードの例です。これを Assets/Editor
ディレクトリ以下に保存してください。(Assets
以下のどこかの Editor
ディレクトリであれば OK です)
using UnityEditor;
using UnityEditor.Build.Reporting;
public static class Build
{
public static void WebGL()
{
var report = BuildPipeline.BuildPlayer(
new[] { "Assets/Scenes/SampleScene.unity" },
"dist/webgl",
BuildTarget.WebGL,
BuildOptions.None);
if (report.summary.result != BuildResult.Succeeded)
{
EditorApplication.Exit(1);
}
}
}
ビルド用の CI ジョブを .gitlab-ci.yml
ファイルに追加します。
include: https://gitlab.com/ignis-build/unity-gitlab-ci/-/raw/master/ci/templates/unity.yml
build:webgl:
extends: .unity
stage: build
script:
- $UNITY_CMD -executeMethod Build.WebGL
artifacts:
name: webgl
paths: [dist]
そしてプッシュしてください。
GitLab プロジェクトの左サイドバーの CI/CD
-> パイプライン
を開くと、ビルドが始まっているのがわかると思います。
ものすごく時間がかかると思いますが、build:webgl
CI ジョブが完了すれば、ビルドされた成果物をダウンロードできます。
GitLab SaaS 版 Runner のデフォルトの Small だと遅すぎて、一時間超えてタイムアウトするかもしれません。どちらかの対策をしてください。
-
tags: [saas-linux-medium-amd64]
で Medium を利用する (Free プランでも使えます) -
timeout: 3h
を加える (https://docs.gitlab.com/ee/ci/yaml/#timeout を見てください)
仕様
Unity アプリのコマンドラインビルドに慣れている人が、CI ビルドをするときに楽ができることを目標にしています。
- Unity プロジェクト設定から Unity のバージョンを自動検出しています。
-
UNITY_ULF
CI/CD 変数が登録されていない場合は、ライセンスアクティベーションファイルの作成 CI ジョブだけが動作します。 - ビルドジョブは
extends: .unity
を加えてください。ビルド用の Docker Image が選択され、before_script:
でライセンスの登録を行います。-
UNITY_CMD
:unity-editor -quit -batchmode -logfile -
がセットされています -
UNITY_CI_PLATFORM
:android
すると Android ビルド用の Docker Image が選択されます。
-
詳しくは CI テンプレート を読んでいただけると。
もうちょっと便利にしたいですねぇ。
注意
GitLab Pages にデプロイする
GitLab Pages は *.gz
の展開には対応していないので、そのままでは WebGL 版アプリをデプロイしても動作しません。
次のように、PlayerSettings.WebGL.compressionFormat = WebGLCompressionFormat.Disabled
として圧縮を無効にします。
public static void WebGL()
{
// 圧縮を無効にします。
PlayerSettings.WebGL.compressionFormat = WebGLCompressionFormat.Disabled;
var report = BuildPipeline.BuildPlayer(
EnabledScenes(),
"dist/webgl",
BuildTarget.WebGL,
BuildOptions.None);
if (report.summary.result != BuildResult.Succeeded) EditorApplication.Exit(1);
}
できる限りプロジェクト専用 GitLab Runner を用意してください
GitLab.com の SaaS 版 Runner はそれほど早くありません。また、docker+machine executor を利用している関係上、CI ジョブの実行のたびに docker pull
が動作し、そのダウンロード及び展開時間だけでそれなりの時間がかかってしまいます。
docker executor な GitLab Runner を別途用意することをお勧めします。
GitLab SaaS Runner では Android ビルドできない...
GitLab SaaS Runner (Linux) のディスク容量の問題か、Android ビルドには失敗しました。
Issue 投げておいたので対応してもらえると嬉しいなあ...
ラインセスファイルの取り扱いに注意してください
GitLab プロジェクトの CI/CD 変数は、そのプロジェクトの Maintainer
ロール以上しか設定・参照できませんが、それ以外のメンバーに漏洩しないことを保証できるわけではありません。取り扱いには十分注意してください。
また、CI でビルドするための Unity Editor のライセンスに関しては Unity Editor の使用許諾の範囲内でお願いします。
Discussion