用合并队列取代你的CI
摘要
本文认为传统CI对AI代理无效,并提出用合并队列取而代之:在合并前运行所有测试,让代理能在破坏构建之前修复问题。
<p><a href="https://lobste.rs/s/drtmhv/replace_your_ci_with_merge_queue">评论</a></p>
查看缓存全文
缓存时间: 2026/07/28 06:31
# 用合并队列取代你的 CI
来源:https://blog.exe.dev/replace-your-ci
当前 CI 的标准做法是,在代码合并到主分支后,于云端运行测试。这相当于给工程师上了一道双保险:你修改的代码,有没有遗漏某些测试环节?
CI 对人类是有效的。原因在于我们对代码库及其演变有着长期的理解。刚接触某个代码库的工程师知道自己是个新手,会更加谨慎(或者收到自动邮件,告知他们搞砸了 CI)。熟悉代码库的人在心里清楚自己工作时需要测试什么。
CI 的自动邮件之所以管用,是因为它并不常见——毕竟我们都是按人类的速度开发,HEAD 坏掉一会儿也无妨。有些团队会对 CI 故障进行自动回滚。这确实有效,但你会在反复重试中损失不少事后测试的价值。不过它依然可行,至少比夜间构建再二分查找肇事者要强。
但对智能体(agent)来说,这就不管用了——至少截至 2026 年 6 月是这样。
这里存在两个问题。首先,智能体对代码库永远是个新手。它们缺乏代码库专家的那些隐性知识,因此*无时无刻*不在破坏自己未曾关注的项目部分。用智能体配合 CI 进行开发,简直令人抓狂。你的智能体需要在开发过程中运行所有测试,以确保它理解环境。
第二个问题是,等到可怜的人类开发者收到自动邮件说搞砸了 CI 时,智能体的上下文窗口早就凉透了。智能体本应该悄无声息地解决这个问题,不让它成为别人的麻烦。只要不碍着任何人,它有的是时间。让计算机去驱动计算机吧。
因此,你需要让你的组织进入一个状态:智能体可以随时运行所有测试。有一个简单的办法:用合并队列取代你的 CI。
合并队列是一个脚本,运行它将代码推送到 `origin/main`(而不是像我们在全人工的 GitHub 时代那样使用 PR 界面)。
非常重要的是,你必须在合并队列中运行**所有**测试。不要有所谓的“慢速测试”留到每天跑一次。在智能体时代,那些测试*每天*都会挂掉。会有人每天花数小时追着别人的智能体擦屁股。团队里没有人想干这个活。事实表明,唯一比给别人收拾烂摊子更糟的是给别人的机器人收拾烂摊子。
当你有了一个可用的合并队列后,再创建第二个命令:运行合并队列,但不实际合并。把它交给你的智能体。
这样能确保:
1. 智能体的活跃上下文窗口可以在测试中运行,并在把 bug 强加给他人之前修复它们。
2. 无论是人还是机器,都不会破坏构建。
在人类时代,当 CI 很慢的时候,你可以为 CI 而非合并队列辩护。那些论点的依据是测试太慢,不适合放到合并路径中。但在 2026 年,这一点行不通了——为了使用智能体,测试必须快。现在 CI 已经行不通了。有了智能体,CI 就没用了,合并队列要优越得多。
你需要昂贵的计算机来支撑你的合并队列。但这笔投入是值得的。
相似文章
AI编码使CI成为瓶颈,因此我们重新设计了CI流水线以跟上步伐
Linear重新设计了他们的CI流水线,以应对AI编码带来的瓶颈,在优化速度和成本的同时扩大测试覆盖范围。
我两个代理的 git 工作树的干净合并,但它自身的测试失败了
作者描述了一个实验,其中合并两个 AI 代理的 git 工作树导致了测试失败,尽管合并是干净的,突显了在没有相互意识的情况下并行代理开发的挑战。
大家如何在CI中处理代理回归测试而不抓狂?
作者讨论了在CI/CD中由于LLM的非确定性,AI代理工具调用自动化回归测试面临的挑战,并寻求社区关于有效设置和痛点的见解。
我们在108个由智能体编写的拉取请求上启用了自动合并。只有一个合并了。
一项使用AI智能体在108个拉取请求上启用自动合并的实验显示,由于CI运行器饱和,只有一个合并成功,这表明智能体的吞吐量在未考虑合并容量的情况下无法转化为实际代码落地。
AI编程代理是否应被允许合并自己的PR?
文章探讨了关于AI编程代理是否应拥有自主合并Pull Request权限的争论,重点区分了软件工作流中的代码生成与部署决策。