[GitHubActions] 自動でUnityPackageをアップロードしてリリースする
かめふぃです。
今回、自作のUnityPackageを公開するためにUnityPackageファイルのエクスポートからGitHubのリリースを作成するまでの一連の作業を簡単ではありますがGithub Actionsを使って自動化しました。
環境
- Unity 2020.1.0f1
大まかな流れ
- Unityのアクティベート用のライセンスを登録
- UnityPackageを出力するスクリプトの作成
- GitHub Actionsのワークフローを作成
- ワークフローの実行
Unityのアクティベート用のライセンスを登録
GitHub Actionsにて、GameCIを利用する上で必要な作業になります。
- GitHubで使用するためのアクティベーションファイルをリクエストする。
- そのファイルを使用してライセンスを取得します。
- ライセンスを秘密として設定する。
GameCI で Unity の CI 環境を GitHub Actions で構築する
こちらの記事がかなり分かりやすく解説されているので参考にしてみてください。
自作UnityPackageの構成
自作のUnityPackageを作成するときの構成です。
ProjectRoot/
┣ Assests/
┃ ┗ Editor/
┃ ┗ PackageExporter.cs パッケージ出力スクリプト
┗ Packages/
┗ CustomPackage/ 出力したいカスタムパッケージ
上記のCustomPackageの位置に作成したカスタムパッケージを用意します。
パッケージ内のディレクトリ構成については、
公式ドキュメントの パッケージレイアウト が参考になりました。
UnityPackageを出力するスクリプトの作成
GitHub Actionsから呼び出すためのクラスを用意します。
UnityEditorにて Assets/Editor/
以下に以下のスクリプトファイルを作成します。
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public class PackageExporter
{
// Packages以下を指定する場合フォルダパスではなく Packages/{パッケージ名} なので注意
private static readonly string PackagePath = "Packages/com.kameffee.unity-package-test";
[MenuItem("Tools/ExportPackage")]
// 必ずstaticにする
private static void Export()
{
// 出力ファイル名
var exportPath = "./UnityPackageTest.unitypackage";
var exportedPackageAssetList = new List<string>();
foreach (var guid in AssetDatabase.FindAssets("", new[] { PackagePath }))
{
var path = AssetDatabase.GUIDToAssetPath(guid);
exportedPackageAssetList.Add(path);
}
AssetDatabase.ExportPackage(exportedPackageAssetList.ToArray(),
exportPath,
ExportPackageOptions.Recurse);
}
}
パッケージに含めるアセット/ファイルの検索
AssetDatabaseFindAsset で1点注意。
// 引っかからない
AssetDatabase.FindAsset("Packages/CustomUnityPackage/")
// pacakges.json のパッケージ名を指定する必要がある
AssetDatabase.FindAsset("Packages/com.your.packagename")
Packages以下を検索に引っかけるときは、Packagesフォルダに直接置かれていたとしても
では引っかからないので注意が必要です。
また、Packages 以下ではなく Assets 以下に構築している場合は、以下の指定で大丈夫です。
AssetDatabase.FindAsset("Assets/CustomUnityPackage/")
パッケージの出力
AssetDatabase.ExportPackage(exportedPackageAssetList.ToArray(),
fileName,
ExportPackageOptions.Recurse);
先程、FindAssetsでかき集めたアセットのファイル群を渡してパッケージを生成します。
出力先は、Assetsフォルダなどが置いてある プロジェクトのルート からの相対パスになります。
GitHub Actionsのワークフローを作成
- Actionsタグを選択する。
- [New workflow] を選択する。
- Skip this and set up a workflow yourself を選択してスキップする。
- エディタ画面が表示されるのでymlファイルを編集する。
name: Release-test
on:
workflow_dispatch:
inputs:
version:
description: "Version: eg. v1.0.2"
required: true
env:
FILE_NAME: "UnityPackageTest_${{ github.event.inputs.version }}.unitypackage"
VERSION_NAME: ${{ github.event.inputs.version }}
# Expoterから出力されるファイルパス
EXPORT_FILE: "./UnityPackageTest.unitypackage"
jobs:
# パッケージ出力
create-package:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
# キャッシュ設定
- uses: actions/cache@v2
with:
path: Library
key: Library-UnityPackageTest-StandaloneLinux64
restore-keys: |
Library-UnityPackageTest-
Library-
# 関数を叩いてUnityPackage作成
- name: Export unitypackage
uses: game-ci/unity-builder@v2.0-alpha-6
env:
UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
with:
projectPath: .
githubToken: ${{ secrets.GITHUB_TOKEN }}
unityVersion: 2020.1.0f1
targetPlatform: StandaloneLinux64
buildMethod: PackageExporter.Export
# Releaseを切る
- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: "${{ env.VERSION_NAME }}"
release_name: "${{ env.VERSION_NAME }}"
body: "https://github.com/kameffee/UnityPackageTest.git#${{ env.VERSION_NAME }}"
draft: true
prerelease: false
# アップロード
- name: Upload UnityPackage
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: "${{ env.EXPORT_FILE }}"
asset_name: "${{ env.FILE_NAME }}"
asset_content_type: application/octet-stream
トリガー
on:
workflow_dispatch:
inputs:
version:
description: "Version: eg. v1.0.2"
required: true
workflow_dspatch は手動トリガーの設定です。
Actions画面で任意のタイミングでワークフローを実行することが可能になります。
「タグやブランチがプッシュされたら」というのをトリガーにするといったことでもできます。
気になる方は、公式ドキュメントの ワークフローをトリガーするイベント を参考にするとよいと思います。
パッケージ出力
- name: Export unitypackage
uses: game-ci/unity-builder@v2.0-alpha-6
env:
UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
with:
projectPath: .
githubToken: ${{ secrets.GITHUB_TOKEN }}
unityVersion: 2020.1.0f1
targetPlatform: StandaloneLinux64
# 「.unitypackageの出力スクリプトの作成」で作ったメソッドを呼び出す指定
buildMethod: PackageExporter.Export
buildMethod: に先ほど作成したスクリプトの クラス名.メソッド名
を指定するとGameCIが実行してくれます。
Releaseの作成
- name: Create Release
# 後でアーティファクトをダウンロードする時に使う
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
# タグ名
tag_name: "${{ env.VERSION_NAME }}"
# リリース名 (v1.0.0など)
release_name: "${{ env.VERSION_NAME }}"
# 説明欄
body: "https://github.com/kameffee/UnityPackageTest.git#${{ env.VERSION_NAME }}"
# ドラフトのフラグ
draft: true
# プレリリースのフラグ
prerelease: false
ワークフローの実行
- Actionsタブを選択する。
- 左側のworkflow一覧から作成したワークフローを選択する。
- [Run workflow] 選択する。
- 実行対象ブランチの選択やバージョンを入力する。
- [Run workflow] からワークフローを実行する。
結果
エラーなくワークフローが終了した後、
Release から確認するとDraft状態でリリースが作成されています。
※draft状態: 下書きのようなもので公開はされていない状態。
Releaseを公開
リポジトリトップの Releases からリリースをの一覧を開くとworkflowによって作成されたリリースが並んでいるはずです。
あとは、✏️ボタンから編集画面を開き、説明欄を編集などした後、
[Publish Release] でリリースを公開できます。
この工程をスキップして、ワークフロー時にそのまま公開したい場合は、
リリース作成Stepを draft: false
にすることで可能です。
# Releaseを切る
- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: "${{ env.VERSION_NAME }}"
release_name: "${{ env.VERSION_NAME }}"
body: "https://github.com/kameffee/UnityPackageTest.git#${{ env.VERSION_NAME }}"
draft: false # falseにするとdraftにならずにそのまま公開される
prerelease: false
最後に
リリース時の面倒な一連の作業をGitHub Actionsで手軽に自動化できるのでとても便利に感じました。
GameCIには、今回使用しなかったテストの実行やビルドなどもあるので、リリース前にTestRunnderを走らせてチェックを行うことも可能なので組み合わせるとよいと思います。
Discussion