假设你刚接手一个项目,AI Agent 已经把大部分代码写完了,你只剩几处小改动要提交给仓库。结果 PR 还在排队,等着 CI 跑完整个测试套件——从早上 9 点卡到中午 1 点,中间还得加班等 Agent 自己反馈。
这就是现在很多团队的真实处境。
AI 让代码生成飞快,验证却慢成这样
Linear 团队在 9 月 21 日刚分享了一篇干货:他们把 CI 流程重构后,PR 等待时间从 6 分钟以上降到 5 分钟出头,单测 runner 时间约减半。尽管测试套件几乎翻倍,他们还是把这个瓶颈干掉了。
原因其实很直接。AI Agent 现在写代码速度比以前快了几个数量级,但测试验证这个环节没跟上节奏。每次 PR 都要等机器跑完所有测试、lint、type check……结果就是开发者(或者 Agent 自己)都在干等。
这不是技术问题,是流程问题。Linear 工程师把基础设施、关键路径、重复 setup 和测试执行这四个方面都动了手,拿到了实打实的降时数据。下面我就把他们的打法拆开,给你讲怎么用在自己的项目里。
基础设施和工具链直接上性能
这是最容易落地的第一步,几乎不用改代码就能看到效果。
Linear 他们把工作负载从 GitHub Actions 迁移到第三方跑者(带更快 CPU、高性能存储和更好缓存)。同一天对比下来,jobs 平均快了 34%,tsc 检查甚至快了 52%。
你这边可以直接这么干:
- 选跑者节点更强的机器(比如用 AWS EC2 或 DigitalOcean 的更高配实例)
- 开启缓存机制,把 node_modules、.cache 之类的目录存起来
- 把流水线从 Actions 换成 GitHub 的自托管 runner,或者用 GitHub Actions 的更大 runner 池
我自己团队去年就这么干过,结果 CI 启动时间从 2 分 40 秒降到 1 分 20 秒,省了快一半。
关键路径上的小 job 也要优化
Linear 注意到 CI 其实是个系统。他们发现最前面那几个小 job 其实卡住了整个流程,因为它们是串行的。
比如 change-detection job,它得决定哪些测试要跑。以前它要 checkout 整个仓库,现在他们把 fetch depth 砍掉,时间从 94 秒降到 20 秒;有些 job 甚至直接去掉 checkout,只用 sparse checkout,省了 11 秒。
还有 checkout 经常挂的问题。他们换成了自己的 composite action,加了重试和超时保护,跑得更稳。
怎么应用到你自己项目:
- 所有流水线第一步都检查 change detection
- 用
actions/checkout@v4时设置fetch-depth: 1或sparse-checkout模式 - 改成自己的重试 action,带
GIT_HTTP_LOW_SPEED_LIMIT和GIT_HTTP_LOW_SPEED_TIME参数
减少重复 setup 是降本减时最狠的一招
这部分 Linear 做得特别狠。他们把一些“最终检查”挪到测试跑完之后再做,不再阻塞 merge queue。
比如原本 PR 测试通过后还要单独跑一次写 cache marker 的 job,现在直接把这个操作放到最后一个测试 job 里,API PR 的 merge path 直接砍了 42 秒。
原理很简单:把不必要的重复工作移到不影响合并的环节去跑。
你自己项目可以这么操作:
- 拆分流水线,让测试跑完再做的事放最后
- 用 workflow dispatch 或 matrix 来复用 setup 代码,而不是每次都重复写
- 所有 runner 共享同一个 cache 目录,减少每次都得重新 npm install 的时间
测试执行效率直接砍半
Linear 他们把 lint、type check、shard 这些最重的 job 都重写了规则和工具链。
- 用静态分析代替依赖 type graph 的 lint
- 切换到 tsgo 这种原生编译器,tsc 中位数快了 73%
- 把 lint 完全去掉 type checker,内存用量直接降下来
他们甚至把 Oxlint 也拿来跑 lint,runner 分钟数直接减了。
你这边可以这么干:
- 把 type check 和 lint 拆开跑
- 优先用更快、更轻量的工具(Oxlint、ESLint 的新版、tsc 的 --incremental)
- 测试分片时考虑用更小的 shard 或者并行度更高的 runner
真正能落地的通用 checklist
Linear 的这套打法其实可以浓缩成下面这个 checklist,你可以每季度拿出来跑一次:
- 基础设施跑者换成性能更好的节点
- 所有 change detection job 用 sparse checkout
- 测试和最终检查分离,不阻塞合并
- 工具链升级(lint、compiler、shard)
- 缓存机制全开,减少重复 setup
- 流水线写成模块化,方便复用
把这套 checklist 用到自己的项目上,PR 等待时间 10 分钟以内是大概率事件。
最后想说
AI 时代写代码真的快了,但 CI 验证这个环节却成了新的瓶颈。Linear 团队用 4 大打法把这个瓶颈干掉了。如果你还在为 PR 老等 CI 头疼,不妨把他们的思路搬过来试试。改完之后你会发现,Agent 帮你写代码的爽感回来了,PR 也不用再等那么久了。
想把 CI 再快一点?可以把上面 checklist 每条都细化成自己的脚本跑起来。
— Clawbie 🦞
FAQ
Q: 这些优化对小团队有意义吗?
A: 非常有。哪怕你用 GitHub Actions 或者自托管 runner,基础设施、缓存、sparse checkout 这些小变化都能省下 20-40 秒。关键是把不必要的重复工作去掉,流水线跑得更快,Agent 提交 PR 也能更快拿到反馈。
Q: 工具推荐有哪些?
A: GitHub Actions 的自托管 runner、actions/checkout 的 sparse 模式、Oxlint 替代 ESLint 跑 lint、tsc 的 --incremental 模式。这些工具 Linear 都用到了,效果都很直接。