test(release): 逐文件核对「发布包 == 打标签的树」(T-WIN-025)

「发布包 == 打标签的树」此前只抽查几个文件,必然会漏。新增
build/check-tracked-release.py(纯标准库,直接读 LZMA zip):对包内**每一个**文件
按路径决定基准 —— OpenDance.exe / OpenDance.pck 比工作树 build/windows/ 的导出结果,
其余文件比 git show <tag>:<路径>;内容不一致 / 包内多余 / 构建产物缺失都会列出并退出 1。
已接入 build/accept-release.sh(第 0 步)与 build/package-release.sh 的提示。

实测(已发布的 v0.2.5 资产重新下载后):
  包内 13 个文件:源码/文档 11(与 tag v0.2.5 比)+ 构建产物 2(与工作树导出比)
  ✓ 逐文件一致:0 处不一致 / 0 处多余 / 0 处缺失
反向验证:把包内 README.txt 追加一行后用 7z 重打成 LZMA zip →
  ✗ 内容不一致 1 处(README.txt),退出码 1。

踩坑:脚本第一版把 BUILD_OUTPUTS 的键一律当目录前缀(rel[len(prefix):]),
而本仓产物是单文件,拼出 build/windows/OpenDance.exe/ 导致误报「工作树缺失」;
现在区分「以 / 结尾的目录前缀」与「精确文件名」两种键。
This commit is contained in:
2026-09-18 03:10:15 +08:00
parent cc8b6ba729
commit 20c6682202
4 changed files with 258 additions and 1 deletions
+58
View File
@@ -0,0 +1,58 @@
# T-WIN-025:逐文件核对「发布包 == 打标签的树」
- **状态**: done
- **依赖**: T-WIN-018(发布包级验收)
- **文档**: v1.6 §5.3 / §7.7
- **契约**: 不涉及
## 为什么需要
「发布包里的东西必须等于打标签的那棵树」此前只靠**抽查**几个文件
(README、`contracts/VERSION`…),而抽查必然会漏。上一轮实测暴露两个认知错误:
* Web 的发布包**包含** `web-server/test/**`(33 个文件),而我此前以为不含;
* 发布包里另有**构建产物**(本仓是 `OpenDance.exe` / `OpenDance.pck`)与 git 无关,
必须与工作树的导出结果比。
## 实现
`build/check-tracked-release.py`(纯标准库,`.zip` 直接读,LZMA 也支持):
对包内**每一个**文件按路径决定比较基准
| 路径 | 比较基准 |
|--|--|
| `OpenDance.exe` / `OpenDance.pck`(`BUILD_OUTPUTS`) | 工作树 `build/windows/` 下的导出产物 |
| 其余全部 | `git show <tag>:<路径>` |
任一**内容不一致** / **包内多余**(既不在 git 也不是声明的构建产物)/
**构建产物在工作树缺失** 都会列出并以非 0 退出。已接入 `build/accept-release.sh`
(第 0 步;目标须是 `.zip` 且仓库里有对应 tag)与 `build/package-release.sh` 的提示。
## 实测(**已发布**的 v0.2.5 资产重新下载后跑)
```
[accept] 逐文件核对:发布包 == tag v0.2.5
包内 13 个文件:源码/文档 11(与 tag 比)、构建产物 2(与工作树构建比)
✓ 逐文件一致:0 处不一致 / 0 处多余 / 0 处缺失
```
**反向验证**:把包内 `README.txt` 追加一行后用 7z 重新打成 LZMA zip →
```
✗ 内容不一致 1 处:· README.txt(与 v0.2.5 的内容不一致)
✗ 发布包与打标签的树不一致 退出码=1
```
## 踩坑
脚本第一版把 `BUILD_OUTPUTS` 的键一律当**目录前缀**处理(`rel[len(prefix):]`),
而本仓与 Android 的产物是**单文件**(键不带 `/`),于是拼出
`build/windows/OpenDance.exe/` 这种路径,误报「构建产物在工作树缺失」。
现在区分两种键:以 `/` 结尾的是目录前缀,否则是精确文件名。
## 与「产物内开发残留检查」的区别
| 检查 | 回答的问题 |
|--|--|
| `list-pck.gd`(T-WIN-023) | 产物**内部**(pck 里)有没有混进开发/验收工具 |
| 本脚本(T-WIN-025) | 产物**对着仓库**看有没有多、少、被改过的文件 |