そもそもGitHub Actionsってなに
CI/CD ツールの一種で、GitHub上で色々と設定すれば、自動でビルドとかしてくれるサービスです
-
そもそもCI/CDとは
用語としては
継続的インテグレーション (Continuous Integration)
継続的デリバリー (Continuous Delivery)
この二つの略称です。
ゲーム (Unity) におけるCI
簡単に言えば継続的に自動でビルドをすること
ゲーム (Unity) におけるCD
たぶんソシャゲとか継続的にリリースするやつで使うはず...
厳密に知りたい人はこれみてね
GitHub Actions 便利ポイント
みんな大好きyamlで書ける (jsonみたいなやつ)
ふだん使っているGitHubで自動化も出来るようになる
実際にやってみた
これから先は実際にGitHub ActionsでUnityのビルドをやってみます
GitHub上の環境構築
まず良い感じのUnityプロジェクトのリポジトリを用意します
このとき正常にビルドできることを確認したプロジェクトを選んだ方が
今後問題の特定がしやすいので良いと思います
用意したリポジトリを開き、画面上部の Actions タブを開きます
開くとこのような画面になるので、この中の set up a workflow yourself → をクリックします
-
この画面内にある他のタブって何?
有名なサービスや言語などは、公式がテンプレートを出していたりする
概要はそれぞれ見出しに書いてあるので、
自身の作成する予定のGithub Actionsのフローがテンプレートにある場合は、
それを使うのもアリだと思います
そして表示された画面で、GitHub Actionsの内容を書いていくことになります
ローカル (vscode) で作成したい人向け
https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-github-actions
Self-HostedRunnerの構築 (GitHub上での操作)
Self-HostRunnerだったりSelf-HostedRunnersだったりすることもあります
そもそもSelf-HostedRunnerとは
自身で用意した、GitHub Actionsの実行に使う環境のこと
↓ Self-HostedRunnerについての資料
ほとんど英語だけど、公式のリファレンス
デフォルトのGitHubが提供する環境ではなく、Self-HostedRunner使う理由としては、
- Unityなどの特殊な環境を利用するから
- 外部Assetなどを利用している際の処理が楽だから
- 無料で利用出来る分が決まっているから
- 使う事の出来るOSやマシンのスペックが決まっているから
- 大規模開発の場合、料金の節約になるから
これらの理由が挙げられると思います
まず用意したリポジトリを開き、画面上部の Settings タブを開きます
そして画面左側のサイドバーから Actions の Runners タブを開きます
そして右上の New self-hosted runner 押します
するとこの画面になるので、使う環境に合わせたOSとプロセッサーアーキテクチャを選択します
私はWindowsのノートPCで作成するので、Windowsとx64を選択します
次の流れとしてはこれらのコマンドを実行していきます
それぞれのコマンドが何をするかは、英語ですがコメントが入っています
Self-HostedRunnerの構築 (ローカルPCでの操作)
今回は直接PowerShellにコマンドを打ち込まずに、PowerShell Scriptsとbatファイルで作成します
それぞれのコマンド詳細は解説しません
ランナーのダウンロードと解凍
ダウンロードなので作成時しか使用しませんが、PowerShell Scriptsを利用しています
学習目的なので…許してほしいです
# ランナーのダウンロード
Invoke-WebRequest -Uri https://github.com/actions/runner/releases/download/v2.319.1/actions-runner-win-x64-2.319.1.zip -OutFile actions-runner-win-x64-2.319.1.zip
# ダウンロードしたファイルのチェックサムを確認
if((Get-FileHash -Path actions-runner-win-x64-2.319.1.zip -Algorithm SHA256).Hash.ToUpper() -ne '1c78c51d20b817fb639e0b0ab564cf0469d083ad543ca3d0d7a2cdad5723f3a7'.ToUpper()){ throw 'Computed checksum did not match' }
# パスの変数を設定
$currentDir = (Get-Location).Path
$zipDir = "$currentDir\actions-runner-win-x64-2.319.1.zip"
# ランナーの解凍
Add-Type -AssemblyName System.IO.Compression.FileSystem ; [System.IO.Compression.ZipFile]::ExtractToDirectory($zipDir, $currentDir)
上のPowerShell Scriptsをbatファイル又は、PowerShell上で実行します
ランナーの構成設定
ここのtoken部分とurlの部分を同じディレクトリ内のテキストファイルに記述して、べた書きしないようにしています
二つのコマンドの内、上のランナーの設定のみを行います
# 環境変数の取得と設定
Get-Content env.txt | ForEach-Object {
$parts = $_ -split '='
if ($parts.Length -eq 2) {
[System.Environment]::SetEnvironmentVariable($parts[0], $parts[1])
}
}
# ランナーを作成し、構成を開始する
./config.cmd --url $env:GITHUB_REPOSITORY_URL --token $env:GITHUB_ACCESS_TOKEN
ランナーの実行
PowerShell上で下記のコマンドを実行するか、エクスプローラーからrun.cmdを実行すると
ランナーが待機状態になります
./run.cmd
UnityのCLI(Command Line Interface)ビルド
Unity公式のCLIを利用して、Unityを開かずにビルドを実行することが出来ます
必要な手順として、
- C#でビルドスクリプトを書く (BuildSettingsやコマンドライン引数などを読み込むため)
- Editorのpathを調べる
- コマンドを実行する
それぞれ解説します
C#でビルドスクリプトを書く
公式のリファレンスも用意されているので、メソッドの詳細などはそれぞれ確認してください
ビルドスクリプトではビルド設定を行っていて、それぞれの処理はコメントを参照してください
※ ビルドスクリプトのclass名とメソッド名はCLIでのビルド時に使用するので、分かりやすい名前にしてください
C#ビルドスクリプト
using UnityEditor;
using UnityEngine;
using System.Linq;
public class BuildCommand
{
[MenuItem("Assets/Build Application")]
public static void Build()
{
//プラットフォーム、オプション
var isDevelopment = true;
var platform = BuildTarget.StandaloneWindows;
// 出力名とか
var exeName = PlayerSettings.productName;
var ext = ".exe";
string outpath = default;
// ビルド対象シーンリスト
var scenes = EditorBuildSettings.scenes
.Where(scene => scene.enabled)
.Select(scene => scene.path)
.ToArray();
//コマンドライン引数をパース
//NOTE: iOSはプロジェクトが生成されるだけなので、別途処理する
var args = System.Environment.GetCommandLineArgs();
for (var i = 0; i < args.Length; i++)
{
switch (args[i])
{
case "-projectPath":
outpath = args[i + 1] + "\\Build";
break;
case "-devmode":
isDevelopment = args[i + 1] == "true";
break;
case "-platform":
switch(args[i + 1])
{
case "Android":
platform = BuildTarget.Android;
ext = ".apk";
break;
case "Windows":
platform = BuildTarget.StandaloneWindows;
ext = ".exe";
break;
case "WebGL":
platform = BuildTarget.WebGL;
PlayerSettings.WebGL.decompressionFallback = true; //動かない環境があるのでチェック入れる
ext = "";
break;
case "Switch":
platform = BuildTarget.Switch;
ext = "";
break;
}
break;
}
}
//ビルドオプションの成型
var option = new BuildPlayerOptions
{
scenes = scenes,
locationPathName = outpath + "\\" + exeName + ext
};
if (isDevelopment)
{
//optionsはビットフラグなので、|で追加していくことができる
option.options = BuildOptions.Development | BuildOptions.AllowDebugging;
}
option.target = platform; //ビルドターゲットを設定. 今回はWin64
// 実行
var report = BuildPipeline.BuildPlayer(option);
// 結果出力
if (report.summary.result == UnityEditor.Build.Reporting.BuildResult.Succeeded)
{
Debug.Log("BUILD SUCCESS");
EditorApplication.Exit(0);
}
else
{
Debug.LogError("BUILD FAILED");
foreach(var step in report.steps)
{
Debug.Log(step.ToString());
}
Debug.LogError("Error Count: " + report.summary.totalErrors);
EditorApplication.Exit(1);
}
}
}
Editorのpathを調べる
pathを調べる方法としては、
UnityHubから → インストール → 使用するUnityバージョンの右端の歯車から、エクスプローラーで表示
そして自動化のためにbatファイルなどにビルドコマンドを記述して実行します
@echo off
@REM 環境変数の定義
set UNITY_VERSION=2022.3.5f1
set UNITY_EDITOR_PATH=UnityEditorのpath
set PROJECT_PATH=UnityProjectのpath
@REM 出力フォルダを処理のたびに削除する
if exist "%PROJECT_PATH%\Build" (
rmdir /s /q "%PROJECT_PATH%\Build"
)
@REM Unityビルドコマンドを実行する
@REM -executeMethodの引数は自身が作成したビルドスクリプトのclass名とメソッド名にしてください
"%UNITY_EDITOR_PATH%%UNITY_VERSION%\Editor\Unity.exe" -batchmode -quit -projectPath "%PROJECT_PATH%" -executeMethod BuildCommand.Build -platform Windows -devmode true -outputPath "%OUTPUT_PATH%"
pause
GitHub Actionsを作成してみる
今回はSelf-HostedRunnerでUnityをビルドするという記述しかしません
今回書いたGitHub ActionsのWorkflowです
# このGitHub Actionsの名前定義
name: Unity Build
# このGitHub Actionsが実行されるトリガーを定義
on:
# 手動のみで実行する場合はworkflow_dispatchを指定
workflow_dispatch: {}
jobs:
build:
# Self-hosted runnerを使用時にはruns-on: self-hostedを指定する
runs-on: self-hosted
steps:
- name: Checkout
# このGitHub Actionsが実行される前に必要なアクションを指定 (今回はチェックアウトを行うアクション)
uses: actions/checkout@v2
with:
# クローンする際にローカルリポジトリをクリーンにするかどうかを指定
clean: false
# LFSを使用するかどうかを指定
lfs: false
- name: Build
# 指定したcmdファイルを実行する
run: "Unityビルドするbatファイルなどのpath"
このWorkflowでは、二つの処理を行っています
- 実行時に選択したブランチをチェックアウトする
- Unityビルドを実行する
これを実行することで指定したpathにビルド成果物が生成されていると思います!
動かないときのチェックシート
Self-HostedRunner編
- tokenは正しいですか? ページを開きなおしたりすると更新されている場合があります
- テキストファイルなどに定義した環境変数の名前は一致していますか?
- PowerShell Scripts内のコマンド間に余分な空白などは入っていませんか?
- そもそもその空白は半角ですか?
- pathは正しいですか?
UnityCLIビルド編
- そもそもUnityでコンパイルエラーやビルドエラーはありませんか?
- ビルド実行するマシンに足りていないアセットなどはありませんか?
- EditorやProjectのpathは正しいですか?
- Projectのバージョンは指定したバージョンと一致していますか?
- ビルドスクリプトのclass名とメソッド名がCLIのビルドコマンドの引数と一致していますか?
参考資料
GitHub Actions
UnityCLI
self-hosted runner