GitHub Actions の matrix で 1 件失敗すると他のジョブが実行できない
matrix の strategy.fail-fast は既定で true のため、1 つのジョブが失敗すると進行中・待機中の他ジョブはすべてキャンセルされる。
fail-fast: false で全件完走させるか、continue-on-error で特定ジョブの失敗を許容する。
#github-actions#matrix#fail-fast#strategy#workflow
公開:
要約
matrix で 1 件のジョブが失敗したとき他のジョブが途中で止まるのは、strategy.fail-fast が既定で true だからです。
fail-fast が有効だと、matrix 内のどれか 1 つが失敗した時点で、進行中・待機中の残りのジョブはすべてキャンセルされます(公式ドキュメント)。
全組み合わせの結果を見たい場合は fail-fast: false を明示します。
よくある原因
- fail-fast の既定値:
strategy.fail-fastは未指定だとtrue。
Node.js 18/20/22 のような matrix で 1 つが落ちると、残りは結果を残さずキャンセルされる。 - 実験的ジョブの失敗が波及: 次期バージョンなど「落ちても構わない」ジョブに
continue-on-errorを付けていないと、その失敗が matrix 全体を止める。 - failed と cancelled の混同: キャンセルされたジョブには失敗の原因情報が無い。
調べるべきは最初に failed になった 1 件だけ。 - concurrency による別系統のキャンセル: 同じ
concurrencyグループにcancel-in-progress: trueがあると、新しい push が古い実行を止める。
matrix の問題と見分けが必要。
解決策
1. fail-fast を無効化して全件実行する
jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node-version: [18, 20, 22]全組み合わせが最後まで実行され、どのバージョンで失敗するかを一覧で確認できます。
2. 特定ジョブだけ失敗を許容する
strategy:
fail-fast: true
matrix:
node-version: [20, 22]
experimental: [false]
include:
- node-version: 24
experimental: true
continue-on-error: ${{ matrix.experimental }}continue-on-error: true のジョブは失敗してもジョブ自体が成功扱いになり、fail-fast のキャンセルを誘発しません(matrix の公式ガイド)。
3. 調査対象を最初の失敗に絞る
実行サマリーで「Failure」になっているジョブを探し、その 1 件のログだけを読みます。
「Cancelled」のジョブは fail-fast の巻き添えであり、そこに原因はありません。