📘

GitLab CI で Unity アプリをビルドする CI テンプレートを作った

2022/12/09に公開

この記事は GitLab Advent Calendar 2022 の 9 日目の記事です。

GitLab CI で Unity アプリをビルドする CI テンプレートを作った

Unity アプリを CI でビルドするサービスはいくつかあります。

後者の 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 ファイルの内容をコピペします。
  • TypeFile を必ず選んでください。

以上で 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 だと遅すぎて、一時間超えてタイムアウトするかもしれません。どちらかの対策をしてください。

仕様

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 Runner構築のススメ

GitLab SaaS Runner では Android ビルドできない...

GitLab SaaS Runner (Linux) のディスク容量の問題か、Android ビルドには失敗しました。

Issue 投げておいたので対応してもらえると嬉しいなあ...

ラインセスファイルの取り扱いに注意してください

GitLab プロジェクトの CI/CD 変数は、そのプロジェクトの Maintainer ロール以上しか設定・参照できませんが、それ以外のメンバーに漏洩しないことを保証できるわけではありません。取り扱いには十分注意してください。

また、CI でビルドするための Unity Editor のライセンスに関しては Unity Editor の使用許諾の範囲内でお願いします。

Discussion