GitHub Actionsで特定のブランチから特定のブランチにアセットの差分のみを取り込むCIを構築する

初めに

今回は アセット環境における ブランチ間のアセット差分取り込みCIについて書いていきます。

今回は自動で以下のようなPRまでを自動で作ってくれるものを想定しています。

デモとして以下のRepositoryを用意しています。参考にしてください

github.com

背景

ゲーム開発等のコンテンツ制作では、アセットデータをGitHubで管理することがあります。しかし以下のような制作フローになることがあります

  • ブランチA : 正式なデータ
  • ブランチB : とりあえず入れておくデータ

この場合、ブランチAで動くことは保証できますが ブランチBはブランチAも取り込まないと動かない場合が想定されます。しかし、ブランチAのコミット履歴をそのまま取り込むと以下のような問題が起きる可能性があります

  • ブランチAとブランチBで同じファイルの差分があった場合にコンフリクトが起きる
  • ブランチBでは残したいが、ブランチAでは消したファイルが取り込みによってブランチBからも消えてしまう

やりたいこと

背景の問題があり、今回実現したいことは以下になります。

  • ブランチAとブランチBの更新差分(削除は含めない) をブランチA → ブランチBに取り込む

実現方法

今回は以下のような方法を取ります

  1. 環境をブランチBにする
  2. ブランチAのデータを取得する
  3. ブランチAのデータをブランチBに上書き保存する

Actionsでの実装

ymlファイルでは、ブランチA = main、ブランチB = testとしています。

特定のブランチの情報を取得する際に以下を実行します。このときに処理の高速化でdepth は1としています。

      - name: Fetch ${{ env.SOURCE_BRANCH }} branch
        run: |
          git fetch origin ${{ env.SOURCE_BRANCH }} --depth=1

次に特定のブランチからデータをarchiveとしてダウンロードをしてきます。このデータを上書き解凍します

      - name: Copy asset data from ${{ env.SOURCE_BRANCH }} without deleting files in ${{ env.TARGET_BRANCH }}
        run: |
          set -x
          # アセットデータのディレクトリを指定
          ASSET_DIR="."  # 必要に応じて変更してください

          # ${{ env.SOURCE_BRANCH }} ブランチからアセットデータを取得
          git archive --format=tar origin/${{ env.SOURCE_BRANCH }} $ASSET_DIR | tar -x --overwrite

最後にPRの作成をします

      - name: Create Pull Request
        uses: peter-evans/create-pull-request@v7.0.5
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          commit-message: "Update assets from ${{ env.SOURCE_BRANCH }} to ${{ env.TARGET_BRANCH }}"
          branch: update-assets-run-${{ github.run_id }}
          base: ${{ env.TARGET_BRANCH }}
          title: "Update assets from ${{ env.SOURCE_BRANCH }} to ${{ env.TARGET_BRANCH }}"
          body: |
            この自動生成されたプルリクエストは、`${{ env.SOURCE_BRANCH }}` ブランチから `${{ env.TARGET_BRANCH }}` ブランチにアセットデータを取り込みます。
            - `${{ env.TARGET_BRANCH }}` にのみ存在するファイルは削除されていません。
            - 競合が発生した場合、`${{ env.SOURCE_BRANCH }}` の内容が優先されています。
          labels: automated-update

これらによってブランチAからブランチBに対して更新差分だけを流してブランチBを最新にすることができるようになりました。

Actionsの設定

ActionsでPRを作成する場合、以下の設定をする必要があります。

まずは Settingを開き、Actions/General を開きます。

次に Workflow permissions を以下の画像のように設定します