GitHubActionsでUnity TestRunnerを走らせる 改
以前書いた記事のアップデート版です
現在では以前書いた記事は古くなって正常に動かなくなってる(アップデートしてる)ので追記していきます
https://github.com/marketplace/actions/unity-test-runner
こちらの GitHubAction を利用させてもらいます。テンプレート使って楽しましょう
そしてわかりやすいドキュメント
https://game.ci/docs/github/test-runner
CreateALF
GitHub ActionsでUnityTestRunnerを走らせるためにライセンス認証が必要です
そのためのライセンスファイルもGitHubActionsで作成します。
Dockerを手元で実行するの面倒くさいですし(あとM1Macだとなんかうまく動かない)
CreateALF という専用のリポジトリを作成して、
Actions > Set up this workflow で専用のワークフローを構築していきます
ファイルの名前はなんでも良いです
中身をすべて消して、以下のサンプルをコピペしてUnityEditorバージョンなどCIで使うバージョンに変更して Start commit > Merge してください
name: Create ALF File on: [push] jobs: build: runs-on: ubuntu-latest strategy: matrix: unity-tag: [2021.1.15f1-mac-mono-0] # ← ここは docker image のバージョン。自分のプロジェクトのバージョンに合わせて container: docker://unityci/editor:${{ matrix.unity-tag }} steps: - run: mkdir artifact - run: /opt/unity/Editor/Unity -quit -batchmode -nographics -logfile -createManualActivationFile || exit 0 - run: cp "Unity_v$UNITY_VERSION.alf" artifact env: UNITY_VERSION: 2021.1.15f1 # ← ここはUnityのバージョンだけ - uses: actions/upload-artifact@master with: name: ${{ matrix.unity-tag }} path: artifact
Docker Imageのバージョンですが、以前は gableroux/unity3d
を利用させていただきましたが、更新が止まったようです(新しい方に移行してくれとのこと)
なので最新のEditorImageをアップしてくれている unityci/editor の方のimageを利用させていただきます
ここで最新の 2021.1.15f1-mac-mono-0
を利用します
なので先程のコードのunity-tag が [2021.1.15f1-mac-mono-0]になっていたわけですね
注意点として
/opt/unity/Editor/Unity
← ここ前までは大文字の Unity だったんですが、小文字になってました。これに気づかずに失敗の嵐
保存すると勝手にActionが走ります。
成功したらArgifacts(成果物)をダウンロードしてください
認証に必要なファイルが入っています(まだなんの効力も持たないファイル)
Activation
次に先程のファイルを利用して認証ファイルを作成します
ここにアクセスして先程の .alf ファイルを送っちゃってください
で、次に進んでごにょっとしてライセンスファイルをダウンロードします
これは自分のIDと結びついているので大事なものです。他の人には見せないようにしましょう
ulfファイルをVisualStudioCodeでもなんでも良いのでファイルを開いて中身をすべてコピーします
これをCI実行したいプロジェクトの Settings > Secrets の右上の 「New repository secret」を選択して
名前を UNITY_LICENSE にして中身を先程コピーした内容を貼り付けます
このsettingsのSecretに書いたものは ${{ secrets.名前 }}
で参照できるようになります。
秘密の情報を隠して名前でアクセスできる。重要なものを公開するわけには行かないので隠しましょう
※ 以前は暗号化しないとログに表示されて見られる危険性がありましたが、現在はログにも表示されなくなったので暗号化してないです
で、この状態でライセンス問題はOKなのでCI実行したいプロジェクトでテスト実行コードを書きます
次はCI実行したいプロジェクトがあるリポジトリで Actions タブから同じように New wordkflow を押します
中身は以下のように
name: UnityTestRunner on: push: branches: master pull_request: types: [opened, synchronize] # ← プルリク開いたときと更新時に反応して走らせる jobs: testAllModes: name: Test in ${{ matrix.testMode }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: projectPath: - . # ここは . じゃないとエラー出る testMode: - playmode - editmode steps: # Checkout - uses: actions/checkout@v2 with: ref: ${{ github.event.pull_request.head.sha }} lfs: true # Cache - uses: actions/cache@v2 with: path: ${{ matrix.projectPath }}/Library key: Library-${{ matrix.projectPath }} restore-keys: | Library- # Test - uses: game-ci/unity-test-runner@v2 id: tests env: UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} # ← secret で登録した内容がここで出力される with: customParameters: '-nographics' # 追加 projectPath: ${{ matrix.projectPath }} testMode: ${{ matrix.testMode }} artifactsPath: ${{ matrix.testMode }}-artifacts githubToken: ${{ secrets.GITHUB_TOKEN }} checkName: ${{ matrix.testMode }} Test Results unityVersion: 2021.1.15f1 # 何も書かないと自動でProjectVersion見てくれる # Output - uses: actions/upload-artifact@v2 if: always() with: name: Test results for ${{ matrix.testMode }} path: ${{ steps.tests.outputs.artifactsPath }}
unityVersion は何も書かないと自動でプロジェクトのバージョンに合わせてDockerImage取ってきてくれますが、新しいUnity使用してるとまだDockerImageに上がってない可能性が高いので明示的に指定する事もあります
( マイナーバージョンのズレであれば通るときあります )
2020 や 2019 の最新すぎるものじゃない場合はあると思うのでここの行は消しちゃってもいいです。
これを保存後、プルリク上げると自動でテストが走ると思います
まずはレッドケース、エラーがちゃんと出るか確認してみましょう
適当にエラーが出るテストを作ります
PlayModeとEditModeどちらのフォルダを作って
こんな感じにエラーが出るように
まずはUnity上でエラーが出ることを確認
正常にエラー(?)確認!!
これをプッシュしてプルリク作ります
そうすると反応して勝手にGithubActionが実行されます
実行ログみるためにActionの方見に行きます
記述した通りの順番で実行されていくのログが見えます。見てるだけで楽しい
2回めはキャッシュされて少し速度アップします(一回目のコミットミスがあってやり直してます)
unity-test-runnner@2 というところが今回のメイン
ちゃんとエラーになりましたね!
成果物はこのように詳細が表示されます
今回、EditTestスクリプトのEditTestSimplePassesが実行されましたが、期待されている結果はtrueなのにfalseが渡されていてテスト失敗しています
今度はこれを直してみましょう
プッシュして再度テストが走ることの確認
今度はうまくいきました!!!
緑色になって気持ちいい...
プッシュするたびにテストが走るようになってコード修正も少し安心できます
しかし、機能テストコードを書かなければ意味がないのでそこは頑張りましょうということで..
安心したらマージしましょう
テスト通らないとマージできないようにする設定もあるのでそこはお好みで!
その他
うまく行かない場合、ymlに記述したUnityバージョンが正しいか確認しましょう。
バージョンがずれてるとうまく行かないケースが高い。
Unity2021.1.X 系と Unity2021.2.X系 もあかん
※ 自分のプロジェクトでエラーが出たのでメモとして残しておきます
パッケージ解決時に com.unity.modules.nvidia パッケージが見つからんと怒られる
入れた記憶ないのと使う予定が全く想像できないので manifest.jsonから消しました。
以下のバグで勝手に入ったのか?
今回使用したテストプロジェクトのURLをおいておきます