ワークフローの定義(CI設定のファイル)を直すPRをmainにマージしても、ほかのPRのワークフローを再実行(re-run)するだけでは、修正後の定義で動かないことがあります。再実行は、最初の実行と同じコミットをそのまま使うためです。

この記事でわかること

  • 分かれ目は、修正がmainに入ったのか、そのPR自身のブランチに入ったのかです
  • mainに入った修正を効かせるには、再実行ではなく、PRのブランチを更新します
  • 赤いままなら、修正を疑う前に、実行ログに出るベース側のコミットSHAを見ます
この記事の目次(5節)
  1. 再実行は元のイベントのコミットを使う
  2. pull_requestイベントのマージブランチ
  3. 「直したのに赤いまま」の原因を取り違えかけた
  4. 手順は2つ
  5. よくある質問

再実行は元のイベントのコミットを使う

再実行では、元のイベントと同じGITHUB_SHA(コミットSHA)とGITHUB_REF(ref。Gitでブランチなどを指す名前)が使われます。1

pull_requestイベントのマージブランチ

pull_requestイベントでは、GITHUB_REFはマージブランチ(refs/pull/PULL_REQUEST_NUMBER/merge)になります。GITHUB_SHAは、そのブランチ上の最後のマージコミットです。2

マージコミットは、PRのブランチとベースブランチ(多くはmain)を仮にマージしてできるコミットです。あとから定義の修正をmainにマージしても、ほかのPRの実行が使っていたマージコミットは変わりません。そのため再実行では、最初の実行時のコミットと、そこにある修正前の定義が使われます。

再実行とブランチ更新の違い 01 再実行 当時のコミットを使う main(修正前) PR ブランチ 当時のマージコミット 修正前の定義 修正前の定義で実行 赤いまま 定義の修正を main にマージしても、再実行は当時のマージコミットを使う ブランチの更新(「Update branch」ボタンか push)で、新しいマージコミットが作られる 02 ブランチの更新 新しいコミットを作る main(修正後) PR ブランチ(更新後) 新しいマージコミット 修正後の定義 修正後の定義で実行 通る
再実行は当時のマージコミットと、そこにある修正前の定義をそのまま使います。修正後の定義が読まれるのは、ブランチを更新して新しいマージコミットが作られたときです。

図の上の段は、再実行で使われる当時のマージコミットを示しています。ブランチを更新すると、下の段のように、修正後のmainを含む新しいマージコミットが作られ、ワークフローが新たに実行されます。そこで修正後の定義が読まれます。

確かめた時点の状態があとで変わる問題は、並行して動くAIエージェントとTOCTOUで扱っています。

「直したのに赤いまま」の原因を取り違えかけた

再実行しても赤いままというだけでは、修正が効いていない証拠になりません。 このサイトを運営するシステムで、定義の不具合を直すPRをmainにマージしました。そのあと、ほかのPRのワークフローを再実行しても赤いままでした。一度は「修正が効いていない」と取り違えかけました。

実行ログに出ているベース側のコミットSHAを見ると、修正前のコミットのままでした。そのPRのブランチを更新する(mainの変更を取り込む)とワークフローが新たに実行され、新しいベース側のコミットSHAで、直した検査が通りました。

例えば、定義の誤りで、開いているPRのワークフローがすべて失敗したとします。修正をmainにマージしてから各PRで再実行しても、失敗のままのことがあります。ブランチを更新すれば、修正後の定義で動かせます。

操作使うコミット読まれる定義
再実行元のイベントと同じコミット(変わらない)最初の実行時の定義
ブランチの更新・新しいpush新しく作られるマージコミットいまのベースブランチとPRのブランチを合わせた定義

画面ではどちらも実行をやり直す操作に見えますが、修正後の定義が読まれるのは下の行だけです。

手順は2つ

  1. 定義を直すPRをmainにマージしたら、修正を効かせたいほかのPRは、ブランチを更新します。再実行では足りません
  2. 再実行しても赤いままなら、実行ログのチェックアウトの手順に出るマージコミット(「Merge 〜 into 〜」)の、ベース側のSHAを確かめます。修正前のSHAなら、修正が効いていないのではなく、修正前の定義で動いただけです

修正をそのPR自身のブランチにpushしたのであれば、ワークフローが新たに実行されるので、この問題は起きません。問題が起きるのは、修正がmainに入り、ほかのPRのワークフローを内容を変えずにやり直す再実行のときです。 定義の修正に限らず、コードの修正でも同じです。

検査対象をわざと壊して、検査が本当に効くかを確かめる手順は、故障注入を完了条件にするで扱っています。

よくある質問

Q. なぜ再実行は修正前の定義のまま動くのですか。
再実行の目的は、同じ入力でもう一度動かし、結果が再現するか、一時的な失敗だったかを確かめることです。実行のたびに定義が変わると、この確認が成り立ちません。

Q. すべてのイベントで同じ動きになりますか。
この記事で確かめたのは、pull_requestイベントの動きです。GITHUB_REFの設定はイベントの種類で違うので、ほかのイベントはそれぞれの仕様を確かめてください。

Q. mainへのpushで動くワークフローでも、同じ問題は起きますか。
pushイベントは、pushされたブランチのrefを直接使います。修正を含むコミットをそのブランチにpushすれば、以降の実行は修正後の定義で動きます。今回の問題は、修正がmainに入り、PRのブランチは変わっていないpull_requestイベントに特有です。

出典

  1. Re-run workflows and jobs — GitHub Docs(参照 2026-08-14)
  2. Events that trigger workflows — GitHub Docs(参照 2026-08-14)

任せる

AI秘書に任せる

問い合わせの受付から請求書の作成までの業務を、AIで自動化します。

できることを見る 相談する(初回無料・30分)