Skip to content

CI: plugin-audit#test 在托管 runner 上确定性静默挂起(零输出 exit 1)——始于 #3045 落地后,main 侧问题 #3071

Description

@os-zhuang

现象

Test Core@objectstack/plugin-audit#test 仅在 GitHub 托管 runner 上失败,已三次完全一致地复现:

签名:vitest 连 RUN 头都未输出(整个任务组零输出),进程疑似挂起约 5 分钟、待任务图其余部分全部完成后才 exit 1(其 pnpm 的 ELIFECYCLE Test failed 散落在最后一秒的相邻日志组里)。turbo 汇总仅 Failed: @objectstack/plugin-audit#test

⚠️ main 当前的"绿"是假象:90f0a56/330ceba 等后续提交是纯文档/资产变更,被 filter job 的路径过滤跳过——main 的 Test Core 自 4f8c2d1 起实际处于未验证状态,任何触碰代码的 PR 都会撞上本问题(#3037 为等它绿灯耗费了 4 轮诊断,最终由维护者管理员合并)。

已排除(全部在 #3037 分支的合并树上验证)

假设 实验 结果
分支代码问题 main 4f8c2d1 独立复现;PR 未触及 plugin-audit 排除
Node 版本 本地 Node 20.20.2 与 22.22.2 各跑 38/38 排除
时区/locale/CI env TZ=UTC LANG=C.UTF-8 CI=true GITHUB_ACTIONS=true 38/38 排除
并发 OOM --concurrency=4 上限后同签名失败(该上限已随 #3037 保留,无害) 排除
命令差异 本地精确复现 TURBO_SCM_BASE=330ceba turbo run test --affected --concurrency=4:129/129 全过 排除
vitest 配置/依赖缺失 vitest devDep + .bin 均在;裸 vitest run --passWithNoTests 正常 排除
未 unref 定时器挂事件循环 #3045 的 TTL memo 是时间戳比较,无定时器 排除

时间线关联

问题首现于 #3045(plugin-audit 本地化摘要 + 新增 102 行测试)落地后的首次真实 CI 执行。其自身 CI 被后续推送取代(cancelled),从未绿过。

建议的下一步(一轮 CI 即可拿到真凭据)

在任一分支加临时诊断步骤单独执行:

pnpm --filter @objectstack/plugin-audit exec vitest run --reporter=verbose --no-file-parallelism

配合 timeout -s QUIT 120(SIGQUIT 触发 Node 打印各线程堆栈)可直接看到挂起点。怀疑方向:vitest forks 池在受限 cgroup 上的 worker 启动挂起,或 #3045 引入的模块图在 runner 环境的导入期死锁。

相关:#3060(plugin-dev 满负载偶发超时,另一个 CI 专属问题)。

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions