[Unity]GitHubActionsで自動ビルドしてDeployGateで配布する

## 概要
無料の範囲でUnityプロジェクトをクラウドビルドしてテスター用に配布までしたい！　との思いからやってみました。

結果、GitHubにプッシュすると自動ビルドしてアプリの配布までしてくれるようになったので解説していきます。

※アプリの配布はDeployGateを使っています。

## 環境
Windows 11 Home
Unity2022.3.16f1（Personalライセンス）
SourceTree
GitHub
DeployGate（Individualプラン、メンバー3人まで。リンクによる配布は100人まで）

## UnityプロジェクトのGitHub管理
まずUnityプロジェクトをGitHubで管理できるようにしておきます。

私はSourceTreeを使いましたが、各自やりやすい方法でやってください。

SourceTreeを使う場合は下記の記事が参考になります。

https://qiita.com/TAKANEKOMACHI/items/e5a22f02cd571baebe70

## DeployGateのアカウント作成とAPIキーの確認
DeployGateのアカウントを作成します → https://deploygate.com/users/signup

アカウントを作ったら設定画面からAPI Keyを確認します。（後々使うので控えておいてください）
`アカウント設定 > プロフィール > API Key`にあります。

## ulfファイルの確認
下記の場所にulfファイルが存在するはずです。確認してみてください。（これも後々使います）

    Windows: C:\ProgramData\Unity\Unity_lic.ulf
    Mac: /Library/Application Support/Unity/Unity_lic.ulf
    Linux: ~/.local/share/unity3d/Unity/Unity_lic.ulf

## シークレット設定
GitHubリポジトリの`Settings > Secrets and variables > Actions`に移動します。

`New repository secret`ボタンをクリックしてシークレットを追加します。

Nameに`DEPLOYGATE_API_KEY`と入力し、Secretに先ほど確認したDeployGateのAPIキーを登録します。

同じように以下のシークレットも追加していってください。
* `DEPLOYGATE_USER_NAME`: DeployGateのユーザー名
* `UNITY_EMAIL`: Unityアカウントのメールアドレス
* `UNITY_PASSWORD`: Unityアカウントのパスワード
* `UNITY_LICENSE`: 先ほど確認したulfファイルの内容をコピペ

## パーソナルアクセストークンの作成
GitHubページ右上のプロフィールアイコンをクリックして`Settings`を選択します。

左側のメニューから`Developer settings`を選択し、その後`Personal access tokens > Tokens (classic)`を選択します。

「Generate new token」をクリックします。

トークンに名前を付け、スコープは`repo`と`workflow`を選択します

トークンを生成し、安全な場所に保存します。このトークンは一度しか表示されないので注意してください。

## GitHubリモートURLの更新
作成したパーソナルアクセストークンを使ってリモートURLを更新します。

#### SourceTreeを使っている場合
SourceTreeを開き、対象のリポジトリを選択します。

上部のメニューから`設定`を選択します。

「リモート」タブのパスを選択して`編集`をクリックします。

リモートURLを次の形式に更新します
~~~
https://ghp_yourgeneratedtoken@github.com/yourusername/yourrepository.git
~~~

#### SourceTreeを使っていない場合
ターミナルまたはコマンドプロンプトを開き、リポジトリのディレクトリに移動します。

次のコマンドを実行して、GitHubリモートURLを更新します。
~~~
git remote set-url origin https://ghp_yourgeneratedtoken@github.com/yourusername/yourrepository.git
~~~

## ymlの作成
Unityプロジェクトをビルドし、DeployGateにアップロードするためのワークフローを記述します。

リポジトリのルートに`.github/workflows`フォルダを作成し、フォルダ内に`build.yml`ファイルを作成してください。

この例ではAndroid用にビルドしています。

```build.yml
name: Build and Deploy to DeployGate

on:
  push:
    branches:
      - main # このブランチにプッシュされるとJobが実行される

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      
      - name: Remove unnecessary files
        run: |
          sudo rm -rf /usr/share/dotnet
          sudo rm -rf /usr/local/lib/android
          sudo rm -rf /opt/ghc

      - name: Cache Library folder
        uses: actions/cache@v3
        with:
          path: Library
          key: Library-$(hashFiles('**/Packages/manifest.json'))
          restore-keys: |
            Library-

      - name: Build for Android
        uses: game-ci/unity-builder@v4
        env:
          UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
          UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
          UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
        with:
          projectPath: .
          targetPlatform: Android
          buildName: build
          buildsPath: build

      - name: Upload to DeployGate
        env:
          DEPLOYGATE_API_KEY: ${{ secrets.DEPLOYGATE_API_KEY }}
          DEPLOYGATE_USER_NAME: ${{ secrets.DEPLOYGATE_USER_NAME }}
        run: |
          APK_PATH=$(find build -name "*.apk" | head -n 1)
          echo "Uploading $APK_PATH to DeployGate"
          curl -F "file=@$APK_PATH" \
               -F "token=$DEPLOYGATE_API_KEY" \
               -F "message=New build from GitHub Actions" \
               https://deploygate.com/api/users/$DEPLOYGATE_USER_NAME/apps
```

※ `on`セクションのブランチ名を`main`から`deploy`などに変えると、deployブランチにプッシュされたときのみビルド、配信がされるようにできます。用途に合わせて変更してください。

## プッシュする
変更をGitHubリポジトリにプッシュします。

GitHub Actionsが自動でビルドおよびDeployGateへの配信を行うか確認します。

DeployGateでアプリがアップロードされていたら成功です。できていなかったらGitHubリポジトリのActionsタブでエラーが出ていないか確認してみてください。

## 最後に
無料とは言いましたが、GitHub Actionsには使用枠の制限があります。

無料枠ではGitHub ActionsでJobを実行できる時間が月2000時間になっており、それを超えるとJobを実行できなくなります。勝手に課金されることはないみたいなのでそこは安心ですね。

現在の使用時間はアカウントの`Setting > Billing and plans`の`Actions`から確認できます。 

## 参考にしたサイト
https://qiita.com/makihiro_dev/items/03208a83d4c3a1fb426b

https://qiita.com/39ra8/items/fd26e68d00b61b922ca2