🐼
モノレポで変更の入ったアプリケーションだけにjobを実行したかったのでpaths-filterを試した
モノレポで管理している各アプリケーションについて、変更が入ったアプリケーション単位でGithub Actionsのワークフローを起動させるようにしたいなーと思って色々考えていたら、 dorny/paths-filterというものがあったので試してみました。
以下のようなディレクトリ構成だったとして、 lambda-a
、lambda-b
のそれぞれで変更があった場合にその変更を検知。特定のワークフローを起動、という流れがやりたいことです。
.
├── .github/workflows/deploy.yml
└── lambda
├── lambda-a
├── lambda-b
└── lambda-c
ちなみに現状は最低限共通化してはいるものの、それぞれのアプリケーションごとのワークフローを個別に動かす形になっているので、アプリケーションの数に応じてgithub actionsのymlが増えている状態でした。
細かいことは省いて以下のような感じでやると良さそう。
-
filters
で変更差分に反応するかのフィルターを定義。この結果を後続のジョブが使用する - 変更差分を検出するjobの結果(
needs.detect-changes.outputs
)で指定しているフィルターがtrueになっていればjobを実行
jobs:
detect-changes:
runs-on: ubuntu-latest
permissions:
pull-requests: read
outputs:
lambda-a: ${{ steps.filter.outputs.lambda-a }}
lambda-b: ${{ steps.filter.outputs.lambda-b }}
lambda-c: ${{ steps.filter.outputs.lambda-c }}
steps:
- uses: actions/checkout@v4
- uses: dorny/paths-filter@v3
id: filter
with:
filters: |
lambda-a:
- 'lambda/lambda-a/**'
lambda-b:
- 'lambda/lambda-b/**'
ci-lambda-a:
needs: changes
if: ${{ needs.detect-changes.outputs.lambda-a == 'true' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: # 何かしらの処理
ci-lambda-b:
needs: changes
if: ${{ needs.detect-changes.outputs.lambda-b == 'true' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: # 何かしらの処理
lambda-bディレクトリだけに変更があった場合はこうなる
exampleにmatrixを使用する例があり、そちらを使うともう少しまとめられそうだが上記のやり方でそこまで困ってないのでここまで。
Discussion