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だとなんかうまく動かない)


f:id:toshizabeth:20210723121248p:plain

CreateALF という専用のリポジトリを作成して、

Actions > Set up this workflow で専用のワークフローを構築していきます

f:id:toshizabeth:20210723121431p:plain


ファイルの名前はなんでも良いです

中身をすべて消して、以下のサンプルをコピペして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を利用させていただきます

f:id:toshizabeth:20210723121917p:plain


ここで最新の 2021.1.15f1-mac-mono-0 を利用します

f:id:toshizabeth:20210723122029p:plain


なので先程のコードのunity-tag が [2021.1.15f1-mac-mono-0]になっていたわけですね


注意点として

/opt/unity/Editor/Unity ← ここ前までは大文字の Unity だったんですが、小文字になってました。これに気づかずに失敗の嵐



保存すると勝手にActionが走ります。

f:id:toshizabeth:20210723122201p:plain


成功したらArgifacts(成果物)をダウンロードしてください

認証に必要なファイルが入っています(まだなんの効力も持たないファイル)

f:id:toshizabeth:20210723122301p:plain


Activation

次に先程のファイルを利用して認証ファイルを作成します


Unity - Activation

ここにアクセスして先程の .alf ファイルを送っちゃってください


f:id:toshizabeth:20210723122554p:plain


で、次に進んでごにょっとしてライセンスファイルをダウンロードします


これは自分の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どちらのフォルダを作って

f:id:toshizabeth:20210723135714p:plain

こんな感じにエラーが出るように

f:id:toshizabeth:20210723135751p:plain

まずはUnity上でエラーが出ることを確認

f:id:toshizabeth:20210723135854p:plain

正常にエラー(?)確認!!


これをプッシュしてプルリク作ります

そうすると反応して勝手にGithubActionが実行されます

f:id:toshizabeth:20210723140044p:plain

実行ログみるためにActionの方見に行きます

f:id:toshizabeth:20210723140133p:plain


記述した通りの順番で実行されていくのログが見えます。見てるだけで楽しい

2回めはキャッシュされて少し速度アップします(一回目のコミットミスがあってやり直してます)


unity-test-runnner@2 というところが今回のメイン

f:id:toshizabeth:20210723140415p:plain

ちゃんとエラーになりましたね!


成果物はこのように詳細が表示されます

今回、EditTestスクリプトのEditTestSimplePassesが実行されましたが、期待されている結果はtrueなのにfalseが渡されていてテスト失敗しています

f:id:toshizabeth:20210723140530p:plain


今度はこれを直してみましょう


f:id:toshizabeth:20210723140642p:plain


プッシュして再度テストが走ることの確認


f:id:toshizabeth:20210723140725p:plain


今度はうまくいきました!!!

f:id:toshizabeth:20210723141030p:plain


緑色になって気持ちいい...

f:id:toshizabeth:20210723141058p:plain


プッシュするたびにテストが走るようになってコード修正も少し安心できます

しかし、機能テストコードを書かなければ意味がないのでそこは頑張りましょうということで..

安心したらマージしましょう


テスト通らないとマージできないようにする設定もあるのでそこはお好みで!


その他

うまく行かない場合、ymlに記述したUnityバージョンが正しいか確認しましょう。

バージョンがずれてるとうまく行かないケースが高い。

Unity2021.1.X 系と Unity2021.2.X系 もあかん


※ 自分のプロジェクトでエラーが出たのでメモとして残しておきます

パッケージ解決時に com.unity.modules.nvidia パッケージが見つからんと怒られる

f:id:toshizabeth:20210723130646p:plain


入れた記憶ないのと使う予定が全く想像できないので manifest.jsonから消しました。

以下のバグで勝手に入ったのか?

issuetracker.unity3d.com


今回使用したテストプロジェクトのURLをおいておきます

github.com