AI代理提速了写代码,却把CI拖成新瓶颈
2026年9月21日,项目管理工具公司Linear的工程师Mufeez Amjad发表长文,复盘了CTO Tuomas年初派给他一张「CI costs are high.」工单后的改造过程。他写道,AI编码代理让交付代码变得指数级更快,但验证这些改动的速度没有跟上:每个合并请求仍要穿过CI,于是CI成了瓶颈,推高了基础设施成本,也让开发者和代理等反馈等得更久。Linear给出的量化结果是,尽管测试套件自年初以来接近翻了两番,合并请求的等待时间从6分钟出头降到了5分钟出头,而每个测试消耗的runner时间大约减半。
工具链换血:原生编译器与脱离GitHub Actions
最早的一批收益几乎没动CI本身。Linear把工作负载从GitHub Actions搬到第三方runner,换上更快CPU、更高性能存储和更好的缓存设施,同样的流水线跑在更快的机器上。工具链现代化也见效:改用原生TypeScript编译器tsgo后,tsc检查的周中位数下降73%,大到把类型检查从瓶颈位置上移走。Lint是另一个早期目标,几条依赖类型信息的自定义规则原先每次都要构建完整类型图,是内存最密集的环节之一;重写为基于抽象语法树的静态分析后,ESLint得以完全脱离TypeScript,API lint时间下降68%,全仓库lint时间下降55%。
关键路径上的改造同样细致。多个工作流开头的变更检测任务原先要检出整棵工作树,其实只需要一小部分;限制fetch深度后,最慢的那个门控从94秒降到20秒,完全不需要工作树的任务则把检出环节从27秒压到7秒。对需要比对路径的推送与合并队列事件,稀疏且不含blob的检出加上有限历史就够了,又省下约11秒;变更检测任务的中位时长从26秒降到8秒,p90从31秒降到12秒,最慢的一次从138秒降到37秒。网络稳定性也被单独处理:第三方runner位于GitHub网络之外,服务商把偶发挂起追查到直连IP链路的间歇性劣化,团队用自写的复合action替换了actions/checkout,带回退重试,并设置GIT_HTTP_LOW_SPEED_LIMIT与GIT_HTTP_LOW_SPEED_TIME两个参数,让停滞连接约30秒后中止而不是无限挂起,同时用检出缓存在粘性磁盘上保留持久git镜像。
重复设置的削减带来连锁反应。API测试分片原先每次花7到8秒用apt装同一个Postgres客户端,团队把它放进含Node和该客户端的小型CI基础镜像;之后又把原生构建头文件补进镜像,因为下载它们偶尔会挂起。安装范围也收窄:Linear是pnpm工作区管理的monorepo,API测试工作流原本装整个工作区,限制为只装API包及其依赖后,pnpm install从44到73秒降到16到18秒。团队还测试了缓存node_modules,发现重算反而更快——缓存键依赖频繁变动的锁文件,即便命中也要约28秒恢复,而过滤安装只要约7.5秒。三项合计把每个分片的设置时间从110到140秒降到67到73秒,降幅约44%;数据库设置从回放全部迁移历史改为加载生成的schema快照与引导文件,从约12秒降到1到2秒。
固定成本打下来,分片才摊得平
最有意思的一步是把七个各自启动runner、检出仓库、装依赖却只做几秒钟正事的独立检查合并成两个任务,七个任务在其中并发执行,于是同样设置开销的支付次数从七次降到两次。按6月用量算,这一项每月省下约87000个runner分钟,相当于Linear总CI用量的11.8%。固定成本降下来之后分片才摊得平:以每个分片110到140秒的设置成本,八个分片光设置就要花15到19分钟的runner时间,比测试本身还多;设置降到约40秒后,八个分片的总设置时间反而比从前四个分片还少,同时把测试并行度翻倍。另一处容易被忽略的是关键路径本身:原先缓存标记写在合并前的最终检查里,意味着测试都通过了合并请求还得在队列里干等;团队把这次写入挪到不门控任何任务的位置,给每个API合并请求和合并队列入口在合并路径上省下42秒。
测试执行层面,Linear用的是Vitest,它按文件而非单个测试时长分发工作,少数特别大的测试文件会拖住整个分片。团队拆分了这些大文件,并把API套件从今年早些时候的三个分片提到四个再提到八个,首次基准测得关键任务快约19%、便宜约19%,一周后最慢分片从5.25分钟降到4.33分钟。更大的一步是引入isolate取值为否的可选项目,让安全文件在同一worker内共享模块注册表,省掉每个分片重建entity、GraphQL与装饰器图的开销——这是单项最大的性能改进,在其体量下约值每月17%的节省,最慢分片从约300到379秒降到约195秒,API分片每次的总runner时间从约32.8分钟降到22分钟。因为现在多数测试由代理编写,团队还更新了对应的agent技能,让生成的测试默认遵循这套隔离约束。
Amjad在文末给了一笔总账:若不是今年刻意改造,以目前的代码增速,今天的测试套件要跑约11分钟,接近开发者现在等待时间的两倍。Linear每周新增约2000条测试,保持CI快是持久战,可照着抄的顺序是:先换机器、再砍固定成本、最后谈并行度。