#Unity と #CircleCI を組み合わせてゲーム開発にCI/CDを導入してみた
こんにちは、ゲームソリューショングループの入井です。
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-osx
とbuild-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-file
jobの詳細画面に行き、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に
- 元のままだとテスト・ビルド終了時にライセンス関係のエラーが発生する
- 参考issue
- contextの名前
- Context名が
unity
であること前提
- Context名が
各パラメータの細かな意味については、game-ciの公式ドキュメントをご参照ください。
パイプライン再実行
configファイルの変更をコミットすることにより、CircleCIで自動的にパイプラインが再実行されます。
無事にテストもビルドも完了しています。
WebGLのビルド結果を見る
build-webgl
jobの詳細画面にて、ARTIFACTSタブを開くとWebGLのビルド結果が展開されています。index.htmlを開くとビルドしたゲームがブラウザ上でプレイできます。
まとめ
CircleCI上でUnityプロジェクトのテスト・ビルドを自動実行できるようになりました。
今回はサンプルプロジェクトでしたが、これを元にすることで他のUnityゲーム開発プロジェクトでも基本的なCI/CDの導入が可能になるはずです。