ci(gates): 接线 test-coverage 覆盖率总闸(FAIL 语义),并修三处已成假话的门禁文档
用户裁定 2026-10-24:缺 mscoverage 组件时**失败**,不做 skip。于是 P1 之后那个 "钩子只挂 16/28 套"的缺口关闭了。 为什么挂这一根而不是补 12 根 per-module 钩子:本闸跑**全部 28 套**,并且守 "已覆盖行只增不减"的基线台账。这是 per-module 钩子结构性做不到的——删掉一套 测试,它那根钩子只会因为"没有文件要检查"而静默跳过(Skipped 不等于失败)。 实测接线代价:45 s(28 套,含 28 次 MSVC 编译与插桩运行)。 FAIL 语义已按本仓"合成自证"的纪律验证(不是只测绿的那一半):把 DTU_MS_COVERAGE 指到一个不存在的文件 → 钩子 Failed、脚本退出码 2、并打印可 执行的 [ENV] 提示(说明该 exe 装在哪、怎么覆盖)。脚本对显式环境变量刻意 "不做自动探测回退",所以指错会被点名,而不是悄悄换一份工具跑出另一本账。 顺手修掉三条**现在已经不成立**的文档说法(门禁文档最贵的就是骗人): - 口径 §7 第 8 条:原写"只有 BuildTools 且没勾代码覆盖率工具的机器会退出码 2"。 实测本机 Community 18.10 与 BuildTools 18.9 **两份安装都自带**该 exe(mtime 2026-09-15 02:30 / 2026-09-05 16:17,都是各自安装当日,不是后来补勾)→ VS 18 的 BuildTools 默认就带它。真实风险面只剩:裸 MSVC 无 VS 的机器、环境变量指错、 以及靠 PATH 兜底的环境。 - 门禁说明 host-unit-tests.md 盲区第 4 条:原写"没有对应钩子的模块 = 零回归"—— 如今 12 套新模块由总闸兜住,这句话已经不成立,改成两种口径并写清触发面。 - 同篇第 6 条:原写"无覆盖率统计"。行/函数覆盖**已有**度量(本闸出 Cobertura 并 守基线),仍无的只是分支覆盖——那是用户裁定 2026-10-23 记下的**已接受缺口**, 不是待办,改口时把这个区分写清楚。 钩子计数同步(新增 1 根 → 声明 40 根 / pre-commit 阶段 39 根 + commit-msg 的 gitlint,已用脚本核对,不是手数):AGENTS.md(总数、枚举、索引表)、 pre-commit使用说明.md(66 / 91 / 234 三处,含清点日期)、门禁说明 README (正文与索引标题,另加一行索引指向口径文档——23 篇不变,同一事实不在两处维护)、 门禁说明 gitlint.md(--no-verify 跳过的"其它 38 个"→39)、并行任务工作树方案。 自查:end-of-file-fixer 与 trailing-whitespace 复跑 Passed(首轮 --all-files 只 因末行空行红过一次,已按钩子自身规范化);doc-links --all --sections-strict 通过 (178 个文档);id-check --strict 零台账外新账;8 个改动文件 U+FFFD = 0、无 CRLF。 零代码改动,故未跑 @build。未 push。
This commit is contained in:
+18
-9
@@ -1,6 +1,6 @@
|
||||
# 主机单测覆盖率口径(覆盖率脚本 / 基线 / 盲区)
|
||||
|
||||
> **状态**:✅ 已落地(脚本 + 基线 + 口径),⏸ 未挂 pre-commit(理由见 §8);
|
||||
> **状态**:✅ 已落地,并**已挂 pre-commit**(`test-coverage` 总闸,2026-10-24 接线,缺组件按裁定 FAIL);
|
||||
> **分支覆盖**:本机可实测拿到(§2.1 的 gcc/WSL 路),但**用户裁定 2026-10-23 不引入第二条工具链**
|
||||
> → 本文把它记为**已接受缺口**,不是待办
|
||||
> **日期**:2026-10-23
|
||||
@@ -152,8 +152,16 @@
|
||||
(全量跑时以"模块未跑到"判 REGRESS),子集运行明确降级(§5)。
|
||||
7. **头文件里的代码归 `.h`。** 统计面含 `.h`(静态内联与被展开的行落在头文件上);当前 16 套
|
||||
几乎没触及 `.h`,表里看不到它们——不要以为头文件"天生 100%"。
|
||||
8. **依赖 VS 的可选组件。** 只有 BuildTools 且没勾"代码覆盖率工具"的机器会退出码 2;
|
||||
CI runner 与本机同一台(`docs/CI/README.md`),但**换机先跑 `--list` 再跑全量**。
|
||||
8. **依赖 `Microsoft.CodeCoverage.Console.exe`。** 探测顺序:`DTU_MS_COVERAGE`(设了就必须
|
||||
有效、**不静默回退**)→ 各 VS 安装根的 `Common7\IDE\Extensions\Microsoft\CodeCoverage.Console\` →
|
||||
PATH;找不到即退出码 2(**不是 0**)。2026-10-24 起该结果直接红掉 `test-coverage` 钩子(用户裁定
|
||||
FAIL 语义),并已合成自证:把 `DTU_MS_COVERAGE` 指到一个不存在的文件 → 钩子 Failed、脚本退出码 2、
|
||||
打印可执行的 `[ENV]` 提示。
|
||||
⚠ **更正本文旧说法**(原写"只有 BuildTools 且没勾代码覆盖率工具的机器会退出码 2"):实测本机
|
||||
Community 18.10 与 BuildTools 18.9 **两份安装都自带**该 exe(mtime 2026-09-15 02:30 / 2026-09-05
|
||||
16:17,都是各自安装当日,不是后来补勾)→ VS 18 的 BuildTools 默认就带它。真实风险面只剩:没有
|
||||
VS 只有裸 MSVC 的机器、`DTU_MS_COVERAGE` 指错、以及靠 PATH 兜底的环境。CI runner 与本机同一台
|
||||
(`docs/CI/README.md`);**换机仍先跑 `--list` 再跑全量**。
|
||||
9. **并集口径下"单套百分比"没有意义。** 同一文件被多套触及很常见(`sha256.c` 被 `sha256` 与
|
||||
`ftp_auth` 都编译),所以对外只报**并集**,单套只报"触及几个文件 / 多少行"。
|
||||
|
||||
@@ -161,7 +169,8 @@
|
||||
|
||||
**已落地**:脚本、基线台账、口径(本文)、`scripts/ci_local.py --coverage` 一条入口。
|
||||
|
||||
**未挂 pre-commit**,三条理由(不是忘了):
|
||||
**接线状态:已挂**(2026-10-24,`test-coverage` 落在 `.pre-commit-config.yaml` 第 8 节,用户裁定 **FAIL** 语义)。
|
||||
接线前的三条理由连同它们的现状一并留档,免得后人重问同一件事:
|
||||
|
||||
1. 39 个钩子里已有 16 个主机单测钩子(每套各编译各跑),再加一份"全量插桩"在**当时**确实是同一
|
||||
件事做两遍,还要多约 25 s;
|
||||
@@ -171,9 +180,10 @@
|
||||
全部模块)目前只被 `ci_local.py`(L0.5 自动发现)与 `check_test_coverage.py` 跑到,
|
||||
**不在提交钩子里**。所以现状不是"重复两遍",而是**有一遍没做**。
|
||||
|
||||
仍未挂,只剩第 2 条那一个原因:必须先定"缺 VS 组件时 skip 还是 FAIL"——那是留给用户裁定的事
|
||||
(选 skip 等于造一根会静默失效的门禁,与 `always: true 已失效` 那条同类坑)。与其悄悄挂一根
|
||||
可能假绿的钩子,不如把缺口写在这里。
|
||||
当时唯一没解的是第 2 条:必须先定"缺 VS 组件时 skip 还是 FAIL"——那是要用户裁定的事(选 skip
|
||||
等于造一根会静默失效的门禁,与 `always: true 已失效` 同类)。**2026-10-24 用户选 FAIL,本闸已挂**,
|
||||
缺口关闭。接线时的两个实测数:全闸跑完 **45 s**(28 套;本文别处写的"约 25 s"是只有 16 套时
|
||||
的值,已过时);缺组件时钩子 **Failed**、脚本退出码 2 并打印 `[ENV]` 提示(合成自证)。
|
||||
2. 它依赖 VS 可选组件(§7 第 8 条)。挂之前必须先定"缺组件时 skip 还是 FAIL"——
|
||||
选 skip 就是一个会静默失效的门禁(与 `AGENTS.md` 里那条 `always: true 已失效、必须靠 files: 覆盖`
|
||||
是同一类坑);
|
||||
@@ -182,8 +192,7 @@
|
||||
不会假报回退(首版会,已修:并集口径下子集必然变小,所以 `--module` 子集跑跳过全部回退判定)。
|
||||
真实事件(某次改动真把覆盖行弄少了)仍待观察。
|
||||
|
||||
真到接线那天,片段形状如下(这份 YAML 由接线者写进 `.pre-commit-config.yaml`,说明写进
|
||||
`docs/门禁说明/` 对应那篇,不在本文维护):
|
||||
落库的就是下面这份(`.pre-commit-config.yaml` 第 8 节,与文件里逐字一致,只多不少);`docs/门禁说明/README.md`
|
||||
|
||||
```yaml
|
||||
- repo: local
|
||||
|
||||
Reference in New Issue
Block a user