🚧

paths フィルターを使うときの注意点 [GitHub Actions]

2022/05/13に公開約1,500字

概要

paths フィルターはとても便利ですが落とし穴があります。

保護ブランチ

保護ブランチでステータスチェックの Required 対象にしている場合、paths の条件を満たさずスキップされると成功扱いにならずマージがブロックされてしまいます。

ワークアラウンド 1

https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks

ドキュメントでは常に成功する paths-ignore を指定したワークフローと組み合わせるように記載されています。

ただ、paths に含まれるファイルと含まれないファイルの両方が PR に存在していた場合どちらのワークフローも走ってしまいます。
両方の結果を待ち片方が失敗していた場合はブロックされるようなのでブランチ保護としては機能するようですが同名のステータスが 2 つできてしまうのが気持ち悪いです。

また、ワークフローが 2 つになって保守性も下がります。
(自動生成するワークフローを作ってもいいのかもしれませんが…)

ワークアラウンド 2

Checks API を使用して判定できるのではないかと思っています。
検証中なのでそのうち記事にするかもしれません。

https://docs.github.com/ja/rest/guides/getting-started-with-the-checks-api
https://docs.github.com/ja/rest/checks/runs#list-check-runs-for-a-git-reference

300 ファイルを超える差分

PR の差分が 300 ファイルを超えると実行されないことがあります。

Diffs are limited to 300 files. If there are files changed that aren't matched in the first 300 files returned by the filter, the workflow will not run.

https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#git-diff-comparisons

詳しくはこちらを参考にしてください。

https://zenn.dev/yudoufu/articles/35880b971d9818

ワークアラウンド

paths を使用せずに自前で判定をするか、上の記事に記載してあるようにソート時に上の方に来るようなファイルを用意するかになると思います。

自前で判定する場合はこのあたりが使えるかと思いますが未確認。

https://github.com/dorny/paths-filter
https://github.com/lykahb/paths-filter

Discussion

ログインするとコメントできます