
问题场景: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 时配额被吃空。
三步完成,立即生效。
更多交流点击入群






