GitHub Actionsでコードの差分からデプロイ先を指定する

はじめに

モノレポでのプロジェクトの際に、ファイルの変更差分に合わせてビルドやデプロイ先の指定がしたいケースがあると思います。 GItHub Actionsでどのように表現するか、備忘として記録します。 turborepoでの構成を例に書いていきます。 turbo.build

リポジトリ構成

.
├── .github
│   └── workflows
│       └── deploy.yml
├── apps
│   ├── app1
│   └── app2
├── node_modules
├── package.json
├── packages
│   └── tsconfig
├── turbo.json
└── yarn.lock

deploy.ymlファイル

ファイルの変更差分はactions/checkoutパッケージを利用します github.com

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          fetch-depth: 2

      - name: Set Git Diff
        id: diff
        run: |
          echo "APP1_DIFF=$(git diff --name-only HEAD~ HEAD --relative ./apps/app1 | wc -l)" >> $GITHUB_OUTPUT
          echo "APP2_DIFF=$(git diff --name-only HEAD~ HEAD --relative ./apps/app2 | wc -l)" >> $GITHUB_OUTPUT
          echo "ALL_DIFF=$(git diff --name-only HEAD~ HEAD --relative ':!./apps'| wc -l)" >> $GITHUB_OUTPUT

      - name: ALL Deploy
        if: ${{ steps.diff.outputs.ALL_DIFF != '0' }}
        run: |
          [app1, app2 deploy command]

      - name: App1 Deploy
        if: ${{ steps.diff.outputs.ALL_DIFF == '0' && steps.diff.outputs.APP1_DIFF != '0' }}
        run: |
          [app1 deploy command]

      - name: App2 Deploy
        if: ${{ steps.diff.outputs.ALL_DIFF == '0' && steps.diff.outputs.APP2_DIFF != '0' }}
        run: |
          [app2 deploy command]

ポイント

fetch-depth

ファイル変更差分を取得したいので fetch-depth: 2 を指定。ここは運用やデプロイルールにも依存するところかもしれませんが、 mergeをトリガーにdeployする場合はマージコミットが取りたいので 1. HEAD, 2. HEAD~ でdepth: 2を指定しています

GitHub - actions/checkout: Action for checking out a repo

git diffの差分結果をGITHUB_OUTPUTに出力パラメータとして設定

コマンド結果を$GITHUB_OUTPUTとして指定しておくと、以降のstepで参照する事ができます。 ${{ steps.diff.outputs.xxxx }} https://docs.github.com/ja/actions/using-workflows/workflow-commands-for-github-actions

ちなみに本件とは直接関係ないですが、::set-output を用いた出力パラメータの記載方法もありますが、利用が非推奨となっているので、 本稿記載の方法がおすすめです github.blog

所感

ちょっと泥臭いので、もっとスマートなやり方できないか模索中。