🐛

GitHub Actions の paths 条件による予期せぬ挙動を発見

に公開2

こんにちは、ThaddeusJiang です。今回は GitHub Actions の paths 条件を使った際に発生する、思わぬ挙動についてご紹介します。

経緯

リポジトリで CI/CD を構築するために GitHub Actions を導入しました。設定したワークフローには、特定のパスでのみ test チェックを実行するようにしていました。

観察した現象

最初のコミットでは、PR のステータスは 1 failing, 1 successful checks となり、test チェックが失敗していることが正しく表示されていました。

最初のコミット時のPRステータス

その後、test エラーを修正しないまま、paths の対象外のファイルだけを更新してコミットを追加すると、なんと PR のチェックが 1 successful check となり、エラーが解消されたかのように見えてしまいました。

testエラー未修正時のPRステータス

さらに、Pull Request 一覧画面でも ✅(成功)のアイコンが表示されます。

PR一覧画面での表示

原因の推測

GitHub Actions の ‎paths オプションを使っている場合、対象外のファイルのみが変更されたコミットでは、該当ワークフロー自体がスキップされます。そのため、前回のチェック結果が上書きされず、最新のコミットでは「失敗」したチェックが存在しない状態となり、PR 全体としては「成功」とみなされるようです。

まとめ

  • paths 条件付きの GitHub Actions では、対象外ファイルだけのコミットでワークフローがスキップされる
  • その結果、以前の失敗チェックが無効となり、PR 全体が「成功」扱いになる
  • CI の品質やレビューの信頼性を保つため、paths 条件の利用には注意が必要

同じような構成で GitHub Actions を運用している方は、一度自分のリポジトリでも挙動を確認してみてください。

再現する現場

https://github.com/thaddeusjiang-demo/github-actions-on-paths-issues/pull/2

Discussion

rakiraki

Privateになってるからか再現する現場のリポジトリが見えてないみたい。)

仕様どおりなので内容についてはアレだけど、しいて言えばCIでテストを回すワークフローを実行する条件(今回で言えばpaths)で設定するのは正直あんまりよくない。
そもそもテストをスキップしてマージしていいわけないので、テストはPRの更新都度確実に行うべき(on.push で常に回す)だし、どうしてもテストを実行したくないとかならラベルを使うなどして実行しない条件を設定するのが正だと思う。