📂
GitHub Actions paths フィルタの代替策
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