GitHubのブランチには保護設定をすることができます。
例えばmaster
ブランチにマージするためには指定したCIが通っていなければいけない、などの仕組みが作れます。
また、GitHub Actionsによるワークフローではon.pull_request.paths
で「特定のディレクトリの変更があった場合のみワークフローを回す」といったことが可能です。
では、次のようなワークフローtest
を用意して、かつマージの可能条件にtest
が通ったことを指定したらどうなるでしょうか?
name: test
on:
pull_request:
paths:
- "dir/**"
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: echo "You have to pass this test before merging."
PullRequestがディレクトリdir/
配下の変更を含むものであれば、そのPullRequestはマージできます。
しかし、例えば/README.md
への追記などdir/
外の変更であればそもそもワークフローtest
が発火しないのでマージ可能条件を満たしません。
保護を無視して強制マージをする、などのふるまいによってこの問題は解決できますがスマートではありません。
そこで、次のようなワークフローをもう一つ用意することで解決しましょう。
name: test
on:
pull_request:
paths-ignore:
- "dir/**"
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: echo "But you can ignore the test when changes are out of dir/"
ワークフローに同じtest
という名前をつけてon.pull_request.paths-ignore
にdir/**
を指定することで、PullRequestがどんな変更であっても必ずワークフローtest
が実行されるようになります。
on.pull_request.paths-ignore
はon.pull_request.paths
と逆の動きをするものです。つまり、そこに指定した箇所のみの変更があった場合はワークフローが動きません。
テストが通るように、ignore用のワークフローは必ず成功する内容にしましょう。
これで、指定した箇所の変更ではCIが回ってくれるし、それ以外の変更では自動でsuccessになって保護ブランチへのマージ可能条件を満たしてくれます。
ただしこの方法だと、PullRequesstがpathsに指定した箇所の変更とそれ以外の変更とを同時に含む場合にワークフローが2つとも実行されてしまうので少し格好悪いんですよね......。