12. CI 的性能优化 1:并行化、矩阵构建与缓存策略

把 CI 时间从 30 分钟压到 5 分钟的方法论。

本章目标

把 CI 从“等半小时”优化到“几分钟出结论”:并行化、矩阵构建与缓存策略是三把最锋利的刀。

你会掌握

如何拆分流水线并行、如何用矩阵覆盖多版本/多平台、以及缓存 key/失效/命中率的设计方法。

真实收益

CI 更快意味着更少返工、更少上下文切换;更关键的是,团队更愿意遵守门禁,质量反而会更好。

CI 慢的本质不是“机器不够快”,而是“把本来可以并行的事情串行做了”。
你可以把 CI 想象成机场安检:如果所有旅客都排一个队,必然拥堵;如果按流程分流、按规则分组、重复检查可复用,速度会明显提升。
本章我们用三个杠杆把 CI 变快:并行矩阵缓存

1) 先定位:CI 时间都花在哪里?

常见耗时来源通常集中在:

优化顺序建议:先把“重复工作”缓存掉,再把“互不依赖的工作”并行化,最后用矩阵扩大覆盖面。
不要一上来就堆机器,否则你只是在更贵地做同样的低效事。

2) 并行化:把串行长链拆成并行短链

并行不是“多开几个 job”,而是先把任务拆成可以独立运行的块:

图 1:串行 → 并行的拆分(动态)

把“最长的那条链”剪短,CI 总时长往往就会明显下降。

Serial Parallel Install Build Tests Lint Unit Build Total Time ≈ max(job)

并行化的两个坑

3) 矩阵构建:用可控成本覆盖更多维度

矩阵构建解决的是“覆盖面”:多版本、多平台、多架构、多配置。典型例子:

图 2:矩阵覆盖面(动态)

矩阵不是越大越好:你要用它覆盖“真实风险维度”,并用分层策略控制成本。

OS linux / windows Lang py310/311/312 linux+310 linux+311 linux+312 win+310 win+311 win+312

4) 缓存:最容易收益最大,也最容易踩坑

缓存的核心问题只有一个:哪些东西值得复用?通常包括:

缓存 key 设计的基本公式

cache_key = OS + language_version + lockfile_hash + toolchain_version

其中最关键的是 lockfile_hash:依赖变化时缓存必须失效,否则你会得到“快但错”的 CI。

图 3:缓存命中/失效链路(动态)

缓存要“快且对”。命中率很重要,但比命中率更重要的是:失效规则必须正确、可解释。

Key OS + version + lock hash 决定是否命中 Cache Store restore / save 命中则省时间 Correctness lockfile changes → miss 快且对

5) 本章小结:让 CI 更快的“公式”

← 上一章:测试分层 下一章:CI 性能优化 2(增量/影响面)→