特定のリポジトリにアセットをpushしたタイミングでバリデーションを走らせたい場面があります。
例えばバリデーションに成功した後でpushするというルールを決めたとしても保証は出来ません。それらのアセットがバリデーション済みの保証はできません。
こういう手動に頼らないといけない部分は自動化を検討したいものです。
そこでGithubActionsを使った納品物(アセット)のバリデーションを確実に走らせるようにしてみます。
今回は【Unity】TestRunnerを使ったアセットバリデーションツールを最短経路で作ってみるで作成したアセットバリデーションをGithubActionsで実行できるようにしていきます。
先人に感謝
【Unity】GitHub Actions v2でUnity Test Runnerを走らせて、結果をSlackに報告する【入門】
基本はこちらの記事を参考に進めていってます。
とても参考になりました。ありがとうございます。
環境
- Unity2019.4.4f1
GithubActionsでTestRunnerを走らせるまでの準備
- ALFファイルの作成
- ULFファイルの取得
- ULFファイルの暗号化
GithubActionsでUnityを走らせるためにはライセンス認証が必要となります。
そのためにマニュアルアクティベーションを攻略していきます。
参考 : Offline / Manual Activation
1.ALFファイルの作成
先のワークフロー図のCreateALFプライベートリポジトリでの作業です。
- Unityを起動してALFファルを作成
- 成果物として出力
このような手順のyamlを作成してGithubActionsを実行します。
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が成果物としてダウンロードできるようになります。
自分はCI・GithubActions初学者なのでGithubActionsワークフローの構文について調査しておきます。
文法 | 内容 | 備考 |
---|---|---|
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
のの調査です。
- uses: actions/upload-artifact@master
with:
name: 2019.4.4f1
path: artifact
actions/upload-artifact
とはGithub公式が提供するビルドの成果物をアップロードするアクションです。引き渡すパラメータにname
とpath
をwithでセットしています。
name
とpath
の必要性の調べ方
本家のactions/upload-artifact
のソースを確認します。
https://github.com/actions/upload-artifact/blob/main/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(入力)にname
とpath
をパラメータとして必要としている事が分かります。pathはrequired: true
なので必須です。
CreateALF.yamlで定義したwith
の内容がactions/upload-artifact
の入力情報として渡されたという事が分かり、スッキリしました。
actions/upload-artifactの後ろの「@」について
@
をつけるとバージョンを指定できます。
- @ブランチ名
- @コミットハッシュ
という使い方が出来るようです。
参考 : バージョンされたアクションを使用する例
2.ULFファイルの取得
ULFとはUnityLicenseFileの事で、中身に認証情報が格納されています。
このファイルがオフライン認証を可能にするため重要なファイルです。このファイルを取得する方法です。
https://license.unity3d.com/manual にアクセスします。
キャプチャのように先程取得したALFファイルを突っ込んでNextボタンをクリックします。
ファイル命名バリデーションが存在する
Unity_v2019.4.4f1.alfでは命名で弾かれてしまいました。
正しくは、 Unity_v2019.4.4.alf
です。
ファイル命名に注意が必要です。
その後の質問に回答し、無事にULFファイルを取得できました。
ファイル名はUnity_v2019.x.ulf
です。
ULFファイルの暗号化
CreateULFプライベートリポジトリでの作業です。
先程取得したULFファイルをこのリポジトリのルートに配置します。
ULFファイル(Unity_v2019.x.ulf)はXMLなので中身が丸見えです。
参考サイトの通り、事前にopensslで暗号化して使用時に復号化して使うことにします。
事前にGithub上でパスワードを作成
Settings > Secrets
から暗号化に使うパスワードを作成します。
このようにKeyとValueをセットにした鍵を作成することが出来ます。GithubActions上で以下のようにValueのパスワードにアクセスすることが出来ます。
${{ secrets.Key名 }}
実際のコードでは${{ secrets.CYPHERKEY }}
でアクセスしています。
平文のULFファイルを暗号化するGithubActionsが以下です。
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
ワークフローが完了すると成果物として暗号化されたULFが取得できます。
ファイル名を分かりやすくUnity_v2019.x.ulf-cipher
としています。
GithubActionsでTestRunnerを実行する
TestRunnerWithGithubActionsパブリックリポジトリでの作業です。
https://github.com/baobao/unity-test-runner-with-github-actions
以前執筆した【Unity】TestRunnerを使ったアセットバリデーションツールを最短経路で作ってみるで作成したUnityプロジェクトをGithubActionsでEditorModeTestを走らせます。ソースを丸コピしています。
ちなみにローカルPCでコマンドラインからUnityのEditorModeを実行するコマンドは以下です。これをGithubActionsのジョブに組み込んでいきます。
'/Applications/Unity Hub/2019.4.4f1/Unity.app/Contents/MacOS/Unity' -runTests -projectPath /パス(省略)/プロジェクト名 -batchmode -testPlatform EditMode
以下の手順のジョブをyamlに書いてGithubActionsで実行してみます。
- 暗号化されたULFの復号化
- Unity起動 ULFを使ってライセンス認証
- Unity起動 EditorModeTestの実行
- 成果物をartifactディレクトリにアップロード
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の結果を受け取ることが出来ます。
テストの時間と無料枠
1回のテストに3分半ほど掛かるようです。
Github Freeの場合2000分/月の無料枠です。このレベルのジョブで約570回実行できるという事になります。実用的か現段階では分からないです。
ちなみにGithubActionsの無料枠を使い切った場合は、単純に使えなくなるだけのようですね。