🐼

モノレポで変更の入ったアプリケーションだけにjobを実行したかったのでpaths-filterを試した

に公開

モノレポで管理している各アプリケーションについて、変更が入ったアプリケーション単位でGithub Actionsのワークフローを起動させるようにしたいなーと思って色々考えていたら、 dorny/paths-filterというものがあったので試してみました。

以下のようなディレクトリ構成だったとして、 lambda-alambda-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を使用する例があり、そちらを使うともう少しまとめられそうだが上記のやり方でそこまで困ってないのでここまで。

https://github.com/dorny/paths-filter?tab=readme-ov-file#examples

Discussion