你的 CI 全绿可能是假的:一条 process.exit(0) 骗了我们十三天
TL;DR
CI 全绿,本机连崩三轮——撒谎的是 CI。server close() 尾部一条无条件 process.exit(0):测试把 server 当「库」调用,close() 一执行击杀测试宿主进程;Linux CI 时序让断言没跑完进程先退,零退出码=假绿,掩盖 5 个潜伏缺陷十三天。修法:统一句柄登记表 + closeOnce() LIFO 排干 + 库层绝不 exit,修完本机 1037 个测试第一次真正全绿。
现场
Windows 本机:routes-* 四个测试连崩三轮(UV_HANDLE_CLOSING 断言);Linux CI:同一份代码全绿。红绿必有一假——你会先怀疑 Windows,而撒谎的是 CI。hmharness(MIT,github.com/swsgbl/hmharness)是开源鸿蒙开发智能体框架。
根因
close() 尾部的 process.exit(0):CLI 语境无害,库语境致命。它掩盖了 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。
三个自查信号
① 库代码里还有 process.exit 吗(库不配死)② 换台机器绿还绿吗(依赖时序的绿不是绿)③ 敢在本地全量对答案吗。
口径
npm @hmharness/cli 0.23.45;与华为/开放原子无隶属。GitHub:https://github.com/swsgbl/hmharness
更多推荐




所有评论(0)