🔥

Unity x SteamのCI上のデプロイで自動バージョン付与でバグトラッキング精度を向上する

に公開

GitHub Actionsを活用したUnity製アプリのSteamの自動デプロイ

前回の記事「Github ActionsでUnity製アプリをSteamにアップロードする」で、GitHub ActionsとGameCIを活用したSteamへの自動デプロイ環境を構築しました。この記事では、その環境をベースに、CI上でビルドごとに自動的にバージョン番号を付与し、バグトラッキングの精度を向上させる方法を紹介します。

CIでの自動バージョン付与

バグ報告を受けた際に、どのバージョンで発生したバグなのかを特定できると、問題の切り分けが効率的になります。GitHub Actionsでビルドする際に、Gitのコミットハッシュを利用して自動的にバージョン番号を付与することで、各ビルドを一意に識別できるようにします。

上記の画像のように、アプリケーション起動時にバージョン情報を表示することで、ユーザーからのバグ報告時に確実にバージョンを特定できます。また、展示会や試遊台などで複数のデバイスにデプロイしている場合にも、各デバイスのバージョンを目視で確認できるため、最新ビルドが正しくデプロイされているかを素早くチェックできます。このバージョン情報は、CI上でビルド時に自動的に生成・埋め込まれます。

前回の記事で紹介したGitHub Actionsの設定に、以下のようなバージョン付与の処理を追加します。

バージョンフォーマット

生成されるバージョン情報は以下のような形式になります:

Ver. 1.0.0 2025/10/10 17:02:58 2674fa9
  • 1.0.0: Gitタグから取得したバージョン番号
  • 2025/10/10 17:02:58: ビルドが実行された日時(JST)
  • 2674fa9: コミットハッシュの短縮形(7文字)

この情報により、いつ、どのバージョンをベースに、どのコミットでビルドされたかを一目で把握できます。

GitHub Actionsの設定

name: Upload to Steam

on:
  push:
    tags: # タグ作成で自動発火
      - '*'

jobs:
  build: # Unity製アプリのビルドフロー
    runs-on: ubuntu-latest
    outputs:
      buildVersion: ${{ steps.buildStep.outputs.buildVersion }}
      artifactName: ${{ steps.buildStep.outputs.artifactName }}
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          fetch-tags: true # バージョンに含めるためにタグ情報も取得

      - name: Set build version
        id: buildStep
        run: |
          # 参照するコミットSHA
          if [ "${{ github.event_name }}" = "pull_request" ]; then
            EVENT_SHA="${{ github.event.pull_request.head.sha }}"
          else
            EVENT_SHA="${{ github.sha }}"
          fi
        
          # 最新タグを取得(タグがない場合は fallback)
          if LATEST_TAG=$(git ls-remote --tags --refs origin \
            | awk -F/ '{print $3}' \
            | sort -V \
            | tail -n1); then
            BASE_VERSION="$LATEST_TAG"
          else
            BASE_VERSION="0.1.0"
          fi
          
          # JST日時
          export TZ=Asia/Tokyo
          DATE_JST="$(date +'%Y/%m/%d %H:%M:%S')"
          
          # 短SHA(小文字)
          if SHORT_SHA="$(git rev-parse --short "$EVENT_SHA" 2>/dev/null)"; then :; else
            SHORT_SHA="$(echo "$EVENT_SHA" | cut -c1-7)"
          fi
          SHORT_SHA="$(echo "$SHORT_SHA" | tr '[:upper:]' '[:lower:]')"
          
          # バージョンフォーマット ex.) Ver. 1.0.0 2025/10/10 17:02:58 2674fa9
          FULL_VERSION="Ver. ${BASE_VERSION} ${DATE_JST} ${SHORT_SHA}"
          echo "buildVersion=${FULL_VERSION}" >> "$GITHUB_OUTPUT"
          
          # アーティファクト名は安全文字に置換(: / \ < > " | ? * を '-'、スペースは '_')
          SAFE_VERSION="$(echo "$FULL_VERSION" | sed -E 's/[:\/\\<>\"|\?\*]+/-/g' | tr ' ' '_' )"
          ARTIFACT_NAME="Build-${SAFE_VERSION}"
          echo "artifactName=${ARTIFACT_NAME}" >> "$GITHUB_OUTPUT"

      - uses: actions/cache@v3
        with:
          path: Library
          key: Library-${{ hashFiles('Assets/**', 'Packages/**', 'ProjectSettings/**') }}
          restore-keys: |
            Library-
          
      - name: Run the Windows build
        uses: game-ci/unity-builder@v4
        env:
          UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
          UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
          UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
        with:
          targetPlatform: StandaloneWindows64
          unityVersion: 2022.3.62f2
          versioning: Custom # SemanticVersion以外を指定するためにCustom指定
          version: ${{ steps.buildStep.outputs.buildVersion }} # バグトラッキングのためのバージョン情報を指定
          
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: ${{ steps.buildStep.outputs.artifactName }}
          path: build

  deploy: # Steamへのデプロイフロー
    needs: [build]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          
      - name: Download Artifact
        uses: actions/download-artifact@v4
        with:
          name: ${{ needs.build.outputs.artifactName }}
          
      - uses: game-ci/steam-deploy@v3
        with:
          username: ${{ secrets.STEAM_USERNAME }}
          configVdf: ${{ secrets.STEAM_CONFIG_VDF }}
          appId: ${{ secrets.STEAM_APP_ID }}
          buildDescription: ${{ needs.build.outputs.buildVersion }}
          rootPath: StandaloneWindows64
          depot1Path: .
          depot1InstallScriptPath: ./install_script.vdf
          releaseBranch: ${{ github.event.inputs.environment }}

このように設定することで、以下のメリットが得られます:

  • 一意なバージョン識別: Gitタグ、ビルド日時、コミットハッシュの組み合わせで各ビルドを一意に識別可能
  • トレーサビリティ: コミットハッシュから該当のコミットを特定し、変更内容を即座に確認可能
  • デバッグ効率の向上: バグ報告時にビルド日時とコミットを紐付けて、問題箇所を迅速に調査可能
  • 展示会・試遊台での運用: 複数デバイスのバージョンを目視確認でき、最新ビルドのデプロイ状況を把握可能

GitHub Actionsでの実行

GitHub Actionsを実行すると、以下のように各ステップでバージョン情報が活用されます:

  1. バージョン生成: Gitタグ、ビルド日時(JST)、コミットハッシュから Ver. {バージョン} {デプロイ日時} {コミットハッシュ} 形式のバージョン文字列を生成
  2. Unity ビルド: versioning: Customversion パラメータにより、生成したバージョン情報をUnityビルドに埋め込み
  3. アーティファクト保存: Build-Ver._{バージョン}_{デプロイ日時}_{コミットハッシュ} 形式でGitHub Actionsのアーティファクトとして保存
  4. Steam デプロイ: Steamworksのビルド説明に Ver. {バージョン} {デプロイ日時} {コミットハッシュ} を含めてアップロード

これにより、Unity アプリ内、GitHub Actions、Steamworks の全てで同じバージョン情報を参照でき、バグ報告時にどのビルドで問題が発生したかを即座に特定できるようになります。

実行ログ ビルド

注記: サンプルプロジェクトのGitHub Actionsでは、Steamworksに対象のプロダクトが設定されていないためデプロイステップでエラーが発生しますが、Steamworksに正しくプロダクトとDepotが設定されていれば、デプロイは成功します。ビルドステップでのバージョン付与の仕組み自体は正常に動作しています。

まとめ

この記事では、GitHub ActionsとGameCIを使ったUnity製アプリのSteam自動デプロイにおいて、Gitタグ、ビルド日時、コミットハッシュを組み合わせた自動バージョン付与の方法を紹介しました。

Ver. 1.0.0 2025/10/10 17:02:58 2674fa9 という形式でバージョン情報を自動生成することで、以下のような運用上のメリットが得られます:

  • 一意性の確保: 各ビルドを一意に識別できる
  • トレーサビリティ: コミットハッシュから変更内容を即座に追跡可能
  • 効率的なデバッグ: バグ報告時にビルド日時とコミットを紐付けて調査可能
  • 実機運用の支援: 展示会や試遊台で最新ビルドのデプロイ状況を目視確認可能

特に複数のブランチで開発を進めている場合や、頻繁にビルドをリリースする場合、また展示会などで複数デバイスを運用する場合に有効です。

今回の記事で紹介した実装は、前回の記事のサンプルプロジェクトSteamDeploySampleに含まれています。実際のGitHub Actionsの実行ログや設定ファイルも確認できますので、ぜひ参考にしてください。

リファレンス

GitHubで編集を提案

Discussion