Help us understand the problem. What is going on with this article?

【Unity】GithubActionsでUnityを起動してTestRunner実行後の結果を出力するまでの手順

特定のリポジトリにアセットをpushしたタイミングでバリデーションを走らせたい場面があります。

例えばバリデーションに成功した後でpushするというルールを決めたとしても保証は出来ません。それらのアセットがバリデーション済みの保証はできません。

こういう手動に頼らないといけない部分は自動化を検討したいものです。
そこでGithubActionsを使った納品物(アセット)のバリデーションを確実に走らせるようにしてみます。

今回は【Unity】TestRunnerを使ったアセットバリデーションツールを最短経路で作ってみるで作成したアセットバリデーションをGithubActionsで実行できるようにしていきます。

image.png
全体のワークフロー図です。3つのリポジトリを使っています。

先人に感謝

【Unity】GitHub Actions v2でUnity Test Runnerを走らせて、結果をSlackに報告する【入門】
基本はこちらの記事を参考に進めていってます。
とても参考になりました。ありがとうございます。

環境

  • Unity2019.4.4f1

GithubActionsでTestRunnerを走らせるまでの準備

  1. ALFファイルの作成
  2. ULFファイルの取得
  3. ULFファイルの暗号化

GithubActionsでUnityを走らせるためにはライセンス認証が必要となります。
そのためにマニュアルアクティベーションを攻略していきます。
参考 : Offline / Manual Activation

1.ALFファイルの作成

先のワークフロー図のCreateALFプライベートリポジトリでの作業です。

  1. Unityを起動してALFファルを作成
  2. 成果物として出力

このような手順のyamlを作成してGithubActionsを実行します。

CreateALF.yaml
name: Create ALF File
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    container: docker://gableroux/unity3d:2019.4.4f1
    steps:
    - run: mkdir artifact
    # 1.Unityを起動してALFファルを作成
    - run: /opt/Unity/Editor/Unity -quit -batchmode -nographics -logfile -createManualActivationFile || exit 0
    - run: cp "Unity_v2019.4.4f1.alf" artifact
    # 2.成果物として出力
    - uses: actions/upload-artifact@master
      with:
        name: 2019.4.4f1
        path: artifact

このワークフローが成功すると、このようにALFが成果物としてダウンロードできるようになります。
image.png

自分はCI・GithubActions初学者なのでGithubActionsワークフローの構文について調査しておきます。

参考:GitHub Actionsのワークフロー構文

文法 内容 備考
name ワークフロー名 任意の名前
on 実行トリガー push, issueなど
jobs ジョブリスト
build ジョブ名 任意の名前
runs-on (必須)ジョブを実行するマシンの種類指定
container 指定コンテナ
steps 一連のタスク すべてのアクションはステップとして実行される
run OSのシェルを実行
uses ステップの一部として実行されるアクション
with usesで指定したアクションに必要なパラメータ KEY・VALUEのmap

その他構文的に分からなかった部分の調査

actions/upload-artifact

actions/upload-artifactに付随する withのの調査です。

CreateALF(抜粋).yaml
- uses: actions/upload-artifact@master
  with:
    name: 2019.4.4f1
    path: artifact

actions/upload-artifactとはGithub公式が提供するビルドの成果物をアップロードするアクションです。引き渡すパラメータにnamepathwithでセットしています。

namepathの必要性の調べ方

本家のactions/upload-artifactのソースを確認します。
https://github.com/actions/upload-artifact/blob/main/action.yml

以下その一部です。

action(抜粋).yml
inputs: 
  name:
    description: 'Artifact name'
    required: false
  path:
    description: 'A file, directory or wildcard pattern that describes what to upload'
    required: true

このようにinputs(入力)namepathをパラメータとして必要としている事が分かります。pathはrequired: trueなので必須です。

CreateALF.yamlで定義したwithの内容がactions/upload-artifactの入力情報として渡されたという事が分かり、スッキリしました。

参考 : 成果物を使用してワークフローデータを永続化する

actions/upload-artifactの後ろの「@」について

@をつけるとバージョンを指定できます。

  • @ブランチ名
  • @コミットハッシュ

という使い方が出来るようです。

参考 : バージョンされたアクションを使用する例

2.ULFファイルの取得

ULFとはUnityLicenseFileの事で、中身に認証情報が格納されています。
このファイルがオフライン認証を可能にするため重要なファイルです。このファイルを取得する方法です。

https://license.unity3d.com/manual にアクセスします。

image.png
キャプチャのように先程取得したALFファイルを突っ込んでNextボタンをクリックします。

ファイル命名バリデーションが存在する

Unity_v2019.4.4f1.alfでは命名で弾かれてしまいました。
正しくは、 Unity_v2019.4.4.alfです。
ファイル命名に注意が必要です。

その後の質問に回答し、無事にULFファイルを取得できました。
ファイル名はUnity_v2019.x.ulfです。

ULFファイルの暗号化

CreateULFプライベートリポジトリでの作業です。

先程取得したULFファイルをこのリポジトリのルートに配置します。
image.png

ULFファイル(Unity_v2019.x.ulf)はXMLなので中身が丸見えです。
参考サイトの通り、事前にopensslで暗号化して使用時に復号化して使うことにします。

事前にGithub上でパスワードを作成

Settings > Secretsから暗号化に使うパスワードを作成します。

image.png

このようにKeyとValueをセットにした鍵を作成することが出来ます。GithubActions上で以下のようにValueのパスワードにアクセスすることが出来ます。

${{ secrets.Key名  }}

実際のコードでは${{ secrets.CYPHERKEY }}でアクセスしています。

平文のULFファイルを暗号化するGithubActionsが以下です。

CreateULF.yaml
name: Create Unity License File

on: [push]

jobs:
  job:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@master
      - run: mkdir -p artifact
      - run: openssl aes-256-cbc -e -in Unity_v2019.x.ulf -out artifact/Unity_v2019.x.ulf-cipher -k ${{ secrets.CYPHERKEY }}
      - uses: actions/upload-artifact@master
        with:
          name: ciphers
          path: artifact

image.png

ワークフローが完了すると成果物として暗号化されたULFが取得できます。
ファイル名を分かりやすくUnity_v2019.x.ulf-cipherとしています。

GithubActionsでTestRunnerを実行する

TestRunnerWithGithubActionsパブリックリポジトリでの作業です。
https://github.com/baobao/unity-test-runner-with-github-actions

以前執筆した【Unity】TestRunnerを使ったアセットバリデーションツールを最短経路で作ってみるで作成したUnityプロジェクトをGithubActionsでEditorModeTestを走らせます。ソースを丸コピしています。

暗号化したULFをリポジトリのルートに配置します。
image.png

ちなみにローカルPCでコマンドラインからUnityのEditorModeを実行するコマンドは以下です。これをGithubActionsのジョブに組み込んでいきます。

'/Applications/Unity Hub/2019.4.4f1/Unity.app/Contents/MacOS/Unity' -runTests -projectPath /パス(省略)/プロジェクト名 -batchmode -testPlatform EditMode

以下の手順のジョブをyamlに書いてGithubActionsで実行してみます。

  1. 暗号化されたULFの復号化
  2. Unity起動 ULFを使ってライセンス認証
  3. Unity起動 EditorModeTestの実行
  4. 成果物をartifactディレクトリにアップロード
run-test-runner.yml
name: UnityTestRunnerWithGithubActions

on:
  push:
    branches:
    - master

jobs:
  editorTestJob:
    runs-on: ubuntu-latest
    container: docker://gableroux/unity3d:2019.4.4f1

    steps:
    - uses: actions/checkout@master
    # TestRunnerの結果を出力するディレクトリ作成
    - run: mkdir -p artifact
    # 暗号化したULFから復号化したULFを取り出す
    - run: openssl aes-256-cbc -d -in Unity_v2019.x.ulf-cipher -k ${CYPHER_KEY} >> /Unity_v2019.x.ulf
      env:
        CYPHER_KEY: ${{ secrets.cypherkey }}
    # Unity起動 ULFを使ってライセンス認証
    - run: /opt/Unity/Editor/Unity -manualLicenseFile /Unity_v2019.x.ulf -batchmode -nographics -quit || exit 0
    # Unity起動 EditorModeTestの実行
    # 結果(results.xm;)をpath/to/artifact/に出力
    - run: /opt/Unity/Editor/Unity -batchmode -nographics -silent-crashes -logFile -projectPath . -runEditorTests -editorTestsResultFile artifact/results.xml || exit 0
    # 成果物をartifactディレクトリにアップロード
    - uses: actions/upload-artifact@master
      with:
        name: test-result
        path: artifact

このGithubActionsを実行すると以下のようにTestの結果を受け取ることが出来ます。

image.png

テストの時間と無料枠

1回のテストに3分半ほど掛かるようです。

image.png

Github Freeの場合2000分/月の無料枠です。このレベルのジョブで約570回実行できるという事になります。実用的か現段階では分からないです。

ちなみにGithubActionsの無料枠を使い切った場合は、単純に使えなくなるだけのようですね。

参考

ohbashunsuke
クリエイターとエンジニアの橋渡し役のUnityエンジニア。思いついたものが作れるようになるためにエンジニアやってます。紙デザイナー3年→Flashエンジニア5年(フルFlashサイト・アメーバピグ開発)→Unityゲーム開発8年。UI/UX含めて設計実装する事が得意。クライアントサイド畑ですが好き嫌いはありません。最近は意識的にサーバーサイドのソースに触れています。内容はあくまで個人の見解です
https://www.shibuya24.info/
unity-game-dev-guild
趣味・仕事問わずUnityでゲームを作っている開発者のみで構成されるオンラインコミュニティです。Unityでゲームを開発・運用するにあたって必要なあらゆる知見を共有することを目的とします。
https://unity-game-dev-guild.github.io/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした