你的 CI 全绿可能是假的?一条 process.exit(0) 骗了我们十三天

0 阅读2分钟

你盯着 CI 面板上一排绿色对勾,心里想的是「今天又能安全发版」。但如果那个绿色本身是假的呢?hmharness(开源鸿蒙开发智能体框架,MIT)上周就是这样:CI 全绿,本机全套测试却连崩三轮。同一份代码,红绿不可能同时为真——撒谎的是 CI。

根因只有一行:server 的 close() 尾部一条无条件 process.exit(0)。这篇讲它怎么骗过我们十三天、掩盖了什么、修完之后拿到了什么。你读完能带走三个自查信号,回去就能检查自己的 CI。

事故链:四步,绿变成假的

close() 尾部无条件 process.exit(0) → 测试把 server 当「库」用,close() 一执行宿主进程当场被杀 → Linux CI 时序让断言没跑完进程先退,零退出码 = 假绿 → 5 个潜伏缺陷被掩盖整整十三天。

掩盖了什么

10-18 拆分起的 5 个缺陷:port-0 回显、pair-rotate PRE-rotate 状态、两个守卫断言与产品合同不符、extension-status 环境依赖。它们不算深——但不用藏,因为裁判被收买了。

修法:让 close() 学会体面

统一句柄登记表、closeOnce() 按 LIFO 排干全部句柄、closed 门住 SSE 写入侧、库层绝不 process.exit、close 幂等。回归钉死合同:挂起的 SSE 连接被终止后进程必须活着。修完本机 1037 个测试第一次真正全绿——第一次。

势能:不是测试问题,是诚实问题

补用例救不了假绿——验证通道本身不可信。clean-room 发版验真自动化:官方源 tarball 双指纹 → 全新目录隔离安装 → 15 包钉版核验 → 关键路径实跑 → 工件脱敏归档,11 例接进 npm test,三次运行 11/11 PASS。绿色从此有据可查。

口径

npm @hmharness/cli 0.23.45;与华为、开放原子无隶属。GitHub:github.com/swsgbl/hmha… | 证据页:swsgbl.github.io/hmharness/e…

你的 CI 中招没?评论区说说你见过最离谱的假绿。

infographic-fakegreen.png