#Unity と #CircleCI を組み合わせてゲーム開発にCI/CDを導入してみた

2023.01.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、ゲームソリューショングループの入井です。

Unityでのゲーム開発にCircleCIを組み合わせることにより、プロジェクトリポジトリのイベントをトリガーに自動的にテストとビルドが実行されるいわゆるCI/CDの仕組みを作ることができます。

今回はCircleCI公式が公開しているデモリポジトリを利用して、実際にCI/CDパイプラインが実行される環境を作ってみました。

なお、CircleCIはFreeプランを使用しています。

CircleCIが公開しているGitHubのデモリポジトリをForkする

CircleCIでCI/CDを実行するには、GitHub等で自分のアカウントにリポジトリを作る必要があります。

CircleCIは、Unityの2DゲームプロジェクトでCI/CDを回すデモリポジトリを公開しています。

https://github.com/CircleCI-Public/Unity2D-Demo-Game-CI-CD

UnityでのCICDを試すのに丁度良いため、こちらのリポジトリをForkします。

CircleCIでProjectをセットアップする

CircleCIのプロジェクト管理画面で先ほどForkしたリポジトリが表示されているので、Set Up Projectボタンをクリックします。

CircleCI用のconfig.ymlをどのように用意するか選択するモーダルが表示されます。デモリポジトリには既にconfig.ymlが作られているので、一番上のFastestを選択してブランチ名にmainを指定し、Set Up Projectボタンをクリックします。

デフォルトのconfig.ymlを元にパイプラインが実行される

プロジェクトのセットアップ完了とともにCICDパイプラインが自動的に実行されます。

しかし、管理画面でパイプラインのステータスを確認するとFailingとなっており、失敗してしまっているようです。

パイプラインの詳細画面を確認すると、test-osxbuild-osx-il2cppjobがいきなり失敗しています。

どちらのjobも、ログを確認すると以下のようなテキストが表示されます。どうやら、MacOSのLargeクラスはFreeプランでは使用できないためエラーが発生しているようです。

Resource class macos for large, image xcode:13.4.1 is not available for your project, or is not a valid resource class. This message will often appear if the pricing plan for this project does not support macos use.

もうしばらく待つと、他のjobもエラーが発生して次々と終了していきます。

試しにtest-linuxのログを見て何が起きているのかを確認します。以下のようなテキストが表示されています。

Failed to find the serial or parse it from the Unity license. Please try again or open an issue.

Unityのライセンス認証に失敗したのが原因でjobがエラー落ちしてしまっているようです。

MacOSのエラーについては一旦CI/CD対象から外すことで回避できますが、Unityのライセンス認証はテストやビルドを行うために必須であるため、次はアクティベーション作業を進めていきます。なお、Windows等のjobは結果が出るまでかなり時間がかかりCircleCIクレジットが勿体ないので、パイプラインをキャンセルした上で次のアクティベーション作業に進みましょう。

Unityライセンスのアクティベーションとその結果のダウンロード

パイプラインの中で唯一成功しているcreate-activation-filejobの詳細画面に行き、ArtifactタブをクリックするとUnity.alfというアクティベーションに必要なファイルができているため、これをダウンロードします。

次に、Unity公式のManual Activationページにて、ダウンロードしたunity.alfをアップロードします。この時、Unityアカウントでのサインインが必要となります。

ライセンスの種類について聞かれるため、実態に合った回答を選択してNextボタンをクリックします。

アクティベーションに成功するとライセンスファイルのダウンロード画面が表示されるので、Download license fileボタンをクリックしたファイルをダウンロードします。

CircleCIのContext(環境変数)にUnityの認証情報登録

パイプライン実行時にUnityアカウント認証を行うには、configファイルのパラメータに環境変数で必要な値を渡す必要があります。

CircleCI管理画面にてOrganization Settings → Contextsと開き、以下のように環境変数を作成します。Context名についてはunityなど任意の分かりやすい名前を設定します。

  • UNITY_USERNAME
    • UnityアカウントのEメールアドレス
  • UNITY_PASSWORD
    • Unityアカウントのパスワード
  • UNITY_ENCODED_LICENSE
    • アクティベーション時にダウンロードしたライセンスファイルをbase64エンコードしたもの
    • 例えばLinux系環境であれば、以下のようなコマンドでエンコード可能
      cat Unity_v20XX.x.ulf | base64 -w 0

config.ymlを修正する

Forkしたリポジトリの.circleci/config.ymlについて、以下のように修正します。

version: 2.1

orbs:
  unity: game-ci/unity@1.4.0

workflows:
  build-unity-project:
    jobs:
      - unity/test:
          name: "test-linux"
          step-name: "Check if the tests run and results are uploaded"
          unity-license-var-name: "UNITY_ENCODED_LICENSE"
          unity-username-var-name: "UNITY_USERNAME"
          unity-password-var-name: "UNITY_PASSWORD"
          executor:
            name: "unity/ubuntu"
            target_platform: "linux-il2cpp"
            editor_version: "2021.3.9f1"
            resource_class: "medium"
          project-path: "src"
          test-platform: "playmode"
          context: unity
      - unity/build:
          name: "build-webgl"
          step-name: "Build WebGL"
          unity-license-var-name: "UNITY_ENCODED_LICENSE"
          unity-username-var-name: "UNITY_USERNAME"
          unity-password-var-name: "UNITY_PASSWORD"
          executor:
            name: "unity/ubuntu"
            target_platform: "webgl"
            editor_version: "2021.3.9f1"
            resource_class: "large"
          project-path: "src"
          build-target: "WebGL"
          compress: false
          context: unity

変更点としては主に以下の通りです。

  • jobについてLinuxでのテストとWebGLビルド以外削除
    • 実行時間節約のため
    • iOS系のjobのエラー回避のため
  • game-ci(Unity用のCircleCI Orb)のバージョンを1.4に
  • contextの名前
    • Context名がunityであること前提

各パラメータの細かな意味については、game-ciの公式ドキュメントをご参照ください。

パイプライン再実行

configファイルの変更をコミットすることにより、CircleCIで自動的にパイプラインが再実行されます。

無事にテストもビルドも完了しています。

WebGLのビルド結果を見る

build-webgljobの詳細画面にて、ARTIFACTSタブを開くとWebGLのビルド結果が展開されています。index.htmlを開くとビルドしたゲームがブラウザ上でプレイできます。

まとめ

CircleCI上でUnityプロジェクトのテスト・ビルドを自動実行できるようになりました。

今回はサンプルプロジェクトでしたが、これを元にすることで他のUnityゲーム開発プロジェクトでも基本的なCI/CDの導入が可能になるはずです。