📂

GitHub Actions paths フィルタの代替策

2024/08/16に公開

GitHub Actions を利用していると指定のディレクトリ/ファイルパスに差分があるときのみ、また差分がないときのみにトリガーしたかったり、トリガーしたくなかったりということがある。結論から述べれば、paths または paths-ignore フィルタを使うことで実現できるのだが、後述する仕様上の問題があり、これへの対策についてメモ。

paths, paths-ignore フィルタ

on.<push|pull_request|pull_request_target>.<paths|paths-ignore> で設定できる。
詳細については公式ドキュメントを参照。

コミット、差分ファイル最大数の制限

仕様として、フィルタを設定していても次の条件に当てはまるときワークフローは常に実行される:

  • 1000 を超えるコミットをプッシュしたとき
  • GitHub が差分生成にタイムアウトしたとき

また差分は 300 ファイルに制限されており、フィルタ適用後最初の 300 ファイルに一致しない差分のあるファイルがあるとき、ワークフローは実行されない。詳細については公式ドキュメントを参照。

対策

上述の制限に引っかかるような運用が前提としてある場合は、下記のようにして自前で diff をとる。例えば、owner/repo リポジトリにおける master ブランチの contents ディレクトリ以下に差分があるときに限りステップ x を実行したいときなど。

jobs:
  j:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
            repository: owner/repo
            path: repo
            ref: master
            fetch-depth: 0
      - name: check diff
        id: check_diff
        continue-on-error: true
        run: |
          cd "$GITHUB_WORKSPACE"/repo
          git checkout develop
          git diff --quiet --exit-code \
            develop master contents
      - name: x
        if: ${{ steps.check_diff.outcome == 'failure' }}
        run: echo diff exists

ここでは git diff --exit-code により差分があると exit code 1 が設定される。これを利用して後続のステップの実行有無を制御している。もっと良い方法があれば随時改修/追記の予定。

Discussion