GitHub Actions fail-fast 陷阱:我的矩阵任务被团灭始末

GitHub Actions fail-fast 陷阱

问题场景:12 个矩阵任务被「团灭」

用矩阵策略跑 12 个测试组合,一个组合失败了,另外 11 个正在运行的任务全部被 GitHub Actions 强制取消,白跑了 40 分钟。

这不是网络波动,是 fail-fast 默认行为在起作用。矩阵任务之间默认「一人翻车,全队撤退」,知道这个机制的人不多,知道怎么关掉它的人更少。

fail-fast 机制解析

fail-fast 是矩阵任务的内置逻辑:任意一个任务失败时,同时取消所有尚未完成的其他任务。

在 jobs 层级加一行 fail-fast: false 即可关闭它:

jobs:
  test:
    runs-on: ubuntu-latest
    fail-fast: false
    strategy:
      matrix:
        python: [3.9, 3.10, 3.11, 3.12]
        db: [mysql, postgres, redis]
        exclude:
          - python: 3.9
            db: postgres

关闭后,所有矩阵组合跑完再决定 CI 成败,不中间取消,留足时间排查。

为什么超过 10 个组合要关掉它

GitHub Actions 文档里没写,但实战经验是:矩阵组合超过 10 个时,fail-fast 几乎必然误伤。

一个组合的单元测试失败,不应该影响其他 11 个独立组合的测试执行。关掉 fail-fast 后,12 个组合全部跑完,总耗时 22 分钟——比「失败后重跑一整轮」省了一次完整 CI 的时间。

结合 concurrency 控制资源争抢

关掉 fail-fast 后另一个问题:频繁 push 时多个 CI 并发跑,消耗配额。用 concurrency 让新 push 自动取消旧 workflow:

jobs:
  test:
    runs-on: ubuntu-latest
    fail-fast: false
    concurrency:
      group: ${{ github.workflow }}-${{ matrix.python }}-${{ matrix.db }}
      cancel-in-progress: true

同组的新触发会自动取消旧任务,避免无意义地同时跑两套 CI。

现在你可以做什么

第一步:打开你的 .github/workflows/*.yml,找到 jobs.<name>.strategy: 块。

第二步:在 strategy: 下面加一行 fail-fast: false,在 jobs 层级也加一行 fail-fast: false

第三步:矩阵组合超过 10 个时,在 jobs 层级加 concurrency 配置(参考上方第二个代码块),防止频繁 push 时配额被吃空。

三步完成,立即生效。

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享