UnityのWebビルドをGiHubActionsで自動ビルドしてFirebase Hostingにデプロイする

初めに

以下の記事でGitHub ActionsでAndroidの自動ビルドのワークフローおよびFirebase App Distributionにバイナリーをアップロードするワークフローを作成しました。
今回は、ここにWebビルドをFirebase HostingにデプロイしてWebプラットフォームでも確認をできるようにしてみます

ayousanz.hatenadiary.jp

Repositoryは以下に公開しています

github.com

開発環境

  • Unity 6000.0.43f1

環境変数の設定

前回同様 Unityのメールアドレス・パスワード・licenseは登録されているものとします。

また Webのデプロイ用に FIREBASE_PROJECT_ID を追加します。firebaseの設定画面から プロジェクト ID をコピーします。

次に以下のように GitHubのシークレットキーに登録します

ワークフローの作成

プロジェクトは前回のものをそのまま使います (空プロジェクトなので、新規で作成しても問題ないです)

以下はWebビルドおよびデプロイのみのワークフローの内容です

name: Unity Build and Deploy

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
  workflow_dispatch:

env:
  UNITY_VERSION: '6000.0.43f1'
  FIREBASE_PROJECT_ID: ${{ secrets.FIREBASE_PROJECT_ID }}

jobs:
  build-webgl:
    name: Build and Deploy WebGL
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4.2.2

      # ディスク容量の確保
      - name: Free disk space
        run: |
          sudo swapoff -a && sudo rm -f /swapfile
          sudo rm -rf /usr/share/dotnet
          sudo rm -rf /opt/ghc /usr/local/.ghcup
          sudo apt-get remove -y google-cloud-cli || sudo apt-get remove -y google-cloud-sdk
          sudo apt-get autoremove -y && sudo apt-get clean
          docker system prune -af
          df -h

      - name: Clean up Docker space
        run: docker system prune --volumes -a -f

      - name: Cache Unity Library - WebGL
        uses: actions/cache@v4.2.0
        with:
          path: Library
          key: Library-WebGL-${{ hashFiles('Assets/**', 'Packages/**', 'ProjectSettings/**') }}
          restore-keys: |
            Library-WebGL-

      - name: Build WebGL App
        uses: game-ci/unity-builder@v4.3.0
        env:
          UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
          UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
          UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
        with:
          targetPlatform: WebGL
          buildsPath: build
          buildName: WebGL
          unityVersion: ${{ env.UNITY_VERSION }}

      - name: Upload WebGL Build Artifact
        uses: actions/upload-artifact@v4.6.0
        with:
          name: Build-WebGL
          path: build/WebGL
          retention-days: 14

      # ブランチ名からチャンネルIDを生成(PRでない場合のみ)
      - name: Generate Channel ID
        if: github.event_name != 'pull_request'
        id: channel
        run: |
          BRANCH_NAME="${GITHUB_REF#refs/heads/}"
          CHANNEL_ID=$(echo "$BRANCH_NAME" | tr '[:upper:]' '[:lower:]' | sed -e 's/[_\/]\+/-/g' -e 's/^-*//' -e 's/-*$//' -e 's/--*/-/g')
          CHANNEL_ID=$(echo "$CHANNEL_ID" | tr -cd 'a-z0-9-' | cut -c 1-36)
          if [[ "$BRANCH_NAME" == "main" ]]; then
            CHANNEL_ID="live"
          fi
          if [[ -z "$CHANNEL_ID" || "$CHANNEL_ID" == "-" ]]; then
            CHANNEL_ID="preview-${GITHUB_SHA::7}"
          fi
          echo "Generated Channel ID: $CHANNEL_ID"
          echo "CHANNEL_ID=$CHANNEL_ID" >> $GITHUB_ENV

      # Firebase CLI を使って Hosting にデプロイ(PRでない場合のみ)
      - name: Deploy to Firebase Hosting using CLI
        if: github.event_name != 'pull_request'
        run: |
          # Firebase CLI インストール
          if ! command -v firebase &> /dev/null; then
              echo "Firebase CLI not found, installing..."
              if ! command -v curl &> /dev/null; then sudo apt-get update && sudo apt-get install -y curl; fi
              curl -sL https://firebase.tools | bash
          fi
          firebase --version

          # サービスアカウントキー処理
          echo "${{ secrets.GCP_SA_KEY }}" | base64 --decode > service_account_webgl.json
          JSON_SIZE=$(stat -c %s service_account_webgl.json)
          echo "WebGL Service Account JSON size: $JSON_SIZE bytes"
          if [ "$JSON_SIZE" -lt 100 ]; then
            echo "Error: Failed to create valid WebGL service account file."
            cat service_account_webgl.json
            exit 1
          fi
          export GOOGLE_APPLICATION_CREDENTIALS="$(pwd)/service_account_webgl.json"

          # --- デプロイコマンド ---
          FIREBASE_PROJECT="${{ env.FIREBASE_PROJECT_ID }}"
          if [ -z "$FIREBASE_PROJECT" ]; then
            echo "Error: FIREBASE_PROJECT_ID env var is not set."
            exit 1
          fi

          DEPLOY_CHANNEL="${{ env.CHANNEL_ID }}"
          # ★ 公開するディレクトリ(ビルド成果物の場所)
          DEPLOY_CHANNEL="${{ env.CHANNEL_ID }}"
          # ↓↓↓ ★★★ 公開ディレクトリのパスを修正 ★★★ ↓↓↓
          PUBLIC_DIR="build/WebGL/WebGL"

          echo "Creating temporary firebase.json with headers..."
          echo '{
            "hosting": {
              "public": "'"$PUBLIC_DIR"'",
              "ignore": [
                "firebase.json",
                "**/.*",
                "**/node_modules/**"
              ]
            }
          }' > firebase.json
          echo "Generated firebase.json:"
          cat firebase.json
          
          echo "Deploying to project '$FIREBASE_PROJECT' on channel '$DEPLOY_CHANNEL'"

          # チャンネルに応じたデプロイコマンド (変更なし)
          if [[ "$DEPLOY_CHANNEL" == "live" ]]; then
             echo "Deploying to production (live) channel..."
             firebase deploy \
               --project "$FIREBASE_PROJECT" \
               --only hosting \
               --message "Deploy build ${{ github.run_number }} from commit ${{ github.sha }} (branch: ${GITHUB_REF_NAME})" \
               --force \
               --debug
          else
             echo "Deploying to preview channel: $DEPLOY_CHANNEL"
             firebase hosting:channel:deploy "$DEPLOY_CHANNEL" \
               --project "$FIREBASE_PROJECT" \
               --only hosting \
               --expires 7d \
               --debug
          fi
          echo "Firebase deployment command executed."

        env:
          FIREBASE_CLI_PREVIEWS: hostingchannels
          CI: true

Unityのビルド設定

Firebase HostingでWebビルドを動かすためには、圧縮設定を Disable にする必要があります。

Firebase側の画面の確認

Firebase側でURLや使用状況が以下のように確認することができます

また 使用しているストレージやダウンロード量なども確認することができます。

参考記事

zenn.dev