できない.dev

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 を明示します。

よくある原因

  1. fail-fast の既定値: strategy.fail-fast は未指定だと true
    Node.js 18/20/22 のような matrix で 1 つが落ちると、残りは結果を残さずキャンセルされる。
  2. 実験的ジョブの失敗が波及: 次期バージョンなど「落ちても構わない」ジョブに continue-on-error を付けていないと、その失敗が matrix 全体を止める。
  3. failed と cancelled の混同: キャンセルされたジョブには失敗の原因情報が無い。
    調べるべきは最初に failed になった 1 件だけ。
  4. 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 の巻き添えであり、そこに原因はありません。

この記事は役立ちましたか?