【 Unity 】GitHub Actions で Unity Test Runner ( CI ) の自動化を行う

古くなったので以下の記事で更新しました

toshizabeth.hatenablog.com


個人プロジェクト開発で Unity 上で Test を書くことがあるのですが、 とある日、どうにか個人プロジェクトでもユニットテストの自動化( CI )を行いたいと思いました。

会社ではJenkinsを使用し、プルリクエストがOpen、synchronizeするたびにUnity Test Runner が走りコミット単位でテスト結果が走ります。 Jenkins用意するのは超めんどくさいし個人だと限界がある..

と、思い色々模索しているとGitHub ActionsでUnity Test Runner の自動化走らせれるところまでできました

GitHub Actions とは?

GitHub公式では

GitHub Actionsを使用すると、ワールドクラスのCI / CDですべてのソフトウェアワークフローを簡単に自動化できます。 
GitHubから直接コードをビルド、テスト、デプロイでき、コードレビュー、ブランチ管理、問題のトリアージを希望どおりに機能させます。

と書かれている通り、GitHubに何も導入せずともCIができるものと考えて良さそうです。

GitHub Actionsは様々な有用な記事があるのでそちらを参考に。

今回実装するに当たり参考になった記事

qiita.com

neue.cc

今回は webbertakken さんが作ったプロジェクトを参考に Unityのユニットテストの自動化をしようと思います

github.com

いろいろ試してみましたが、こちらのプロジェクトを参考に実装するのが最も簡単でした。

手順

GitHubのプルリクをトリガーとしてビルドを走らせるマシンが手元にないので dockerhub の unity を使用します。

dockerは「コンテナ型」と呼ばれる仮想化サービスを提供してくれるサービス 仮想マシンを立ち上げるための設定があらかじめ入っているので、起動が簡単にでき、速い

...らしいです。

hub.docker.com

こちらを Github Actions の container に指定します。(webbertakken さんのコマンドを使用すればこの作業もいらない)

手順として、まずはUnity Test Runnerを走らせるためにもUnityをアクティベートするためのライセンスが必要です。 個人ライセンスであれば

qiita.com

こちらの記事を参考に、アクティベートに必要な情報が入った「 Unity_v2019.x.ulf 」 ファイルを作成します。

(暗号化の手順はいらない。GitHub の secret 設定を利用する)

アクティベートするまでに必要な手順↓

  1. 危険なのでPrivateなリポジトリで alf ファイルを作成。

  2. Unity - Activation で ulf ファイルを作成。

  3. 自動テストを走らせたいリポジトリGItHub > [Project] > Setting > Secrets に Key: UNITY_LICENSE, Value: [ulf ファイルの中身をコピペ]する。

GitHubのSecretsにKey Value形式で追加しておくと、GitHub Actionsで Key を入れるだけでそこが自動的に Value に置き換わります。

直接 yml ファイルにプライベートな情報を入れてしまうのを避けるためにこの方法が使用できます。

今回では UNITY_LICENSE をUnityActionsの中に書くと ulf ファイルの中身に置き換わります。

後は、GitHub Actionsから新規でファイルを作成し、中身をサンプルにかかれている通りに作成するとUnity Test Runnerが走るjobが作成されます。 サンプルを改良し

・プルリク作成時

・プルリクにコミットが追加された時

にも、そのコミットに対しテストを走るようにしてみました。

name: UnityTestRunner

on:
  pull_request:
    types: [opened, synchronize]  # プルリク作成時と更新時をトリガーとする

env:
  UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} # Unityライセンスを環境変数に設定

jobs:
  build:
    name: UnityTestRunnerBuild
    runs-on: ubuntu-latest
    steps:
    
      # Checkout
      - name: Checkout repository
        uses: actions/checkout@v2
        with:
          ref: ${{ github.event.pull_request.head.sha }} # プルリクの最後のコミットをテスト対象とする(チェックアウトさせる)
          lfs: true
    
      # Cache
      - uses: actions/cache@v1.1.0
        with:
          path: Library
          key: Library

      # Test
      - name: Run tests
        uses: webbertakken/unity-test-runner@v1.4
        id: unity-test-runner
        with:
          unityVersion: 2019.3.8f1 # ここは自分のUnityVersionで。
          artifactsPath: all-artifacts
          
      - uses: actions/upload-artifact@master
        with:
          name: test_results
          path: ${{ steps.unity-test-runner.outputs.artifactsPath }} # jobの成果物は artifacts という名前で保存される。そこにテストの結果(.xml)をアップロードする。

実行結果 ↓

f:id:toshizabeth:20200412205833p:plain

上記の超有益な情報が書いてある記事を参考にすれば問題ないと思います。 簡単にUnity Test Runnerを走らせることができてびっくり。

cache がうまく聞いてない気がする(実行に時間がかかる..)のでここは要調査です