🐙

[GitHubActions] 自動でUnityPackageをアップロードしてリリースする

2022/02/06に公開

かめふぃです。
今回、自作のUnityPackageを公開するためにUnityPackageファイルのエクスポートからGitHubのリリースを作成するまでの一連の作業を簡単ではありますがGithub Actionsを使って自動化しました。

環境

  • Unity 2020.1.0f1

大まかな流れ

  1. Unityのアクティベート用のライセンスを登録
  2. UnityPackageを出力するスクリプトの作成
  3. GitHub Actionsのワークフローを作成
  4. ワークフローの実行

Unityのアクティベート用のライセンスを登録

GitHub Actionsにて、GameCIを利用する上で必要な作業になります。

GameCI - Activation

  1. GitHubで使用するためのアクティベーションファイルをリクエストする。
  2. そのファイルを使用してライセンスを取得します。
  3. ライセンスを秘密として設定する。

GameCI で Unity の CI 環境を GitHub Actions で構築する
こちらの記事がかなり分かりやすく解説されているので参考にしてみてください。

自作UnityPackageの構成

自作のUnityPackageを作成するときの構成です。

ProjectRoot/
  ┣ Assests/
  ┃   ┗ Editor/
  ┃       ┗ PackageExporter.cs パッケージ出力スクリプト
  ┗ Packages/
      ┗ CustomPackage/ 出力したいカスタムパッケージ

上記のCustomPackageの位置に作成したカスタムパッケージを用意します。

パッケージ内のディレクトリ構成については、
公式ドキュメントの パッケージレイアウト が参考になりました。

UnityPackageを出力するスクリプトの作成

GitHub Actionsから呼び出すためのクラスを用意します。
UnityEditorにて Assets/Editor/ 以下に以下のスクリプトファイルを作成します。

PackageExporter.cs
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

AssetDatabase.ExportPackage(exportedPackageAssetList.ToArray(),
            fileName,
            ExportPackageOptions.Recurse);

先程、FindAssetsでかき集めたアセットのファイル群を渡してパッケージを生成します。
出力先は、Assetsフォルダなどが置いてある プロジェクトのルート からの相対パスになります。

GitHub Actionsのワークフローを作成

  1. Actionsタグを選択する。
  2. [New workflow] を選択する。
  3. Skip this and set up a workflow yourself を選択してスキップする。
  4. エディタ画面が表示されるのでymlファイルを編集する。
release.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画面で任意のタイミングでワークフローを実行することが可能になります。

「タグやブランチがプッシュされたら」というのをトリガーにするといったことでもできます。
気になる方は、公式ドキュメントの ワークフローをトリガーするイベント を参考にするとよいと思います。

パッケージ出力

GameCIBuilder を使用します。

      - 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

ワークフローの実行

  1. Actionsタブを選択する。
  2. 左側のworkflow一覧から作成したワークフローを選択する。
  3. [Run workflow] 選択する。
  4. 実行対象ブランチの選択やバージョンを入力する。
  5. [Run workflow] からワークフローを実行する。

結果

エラーなくワークフローが終了した後、
Release から確認するとDraft状態でリリースが作成されています。

※draft状態: 下書きのようなもので公開はされていない状態。

Releaseを公開

リポジトリトップの Releases からリリースをの一覧を開くとworkflowによって作成されたリリースが並んでいるはずです。
あとは、✏️ボタンから編集画面を開き、説明欄を編集などした後、
[Publish Release] でリリースを公開できます。

この工程をスキップして、ワークフロー時にそのまま公開したい場合は、
リリース作成Stepを draft: false にすることで可能です。

release-test.yml
      # 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