はじめに
モノレポでのプロジェクトの際に、ファイルの変更差分に合わせてビルドやデプロイ先の指定がしたいケースがあると思います。 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
所感
ちょっと泥臭いので、もっとスマートなやり方できないか模索中。