From 20c6682202f04be344f8f73bd9e007d6c5e63a16 Mon Sep 17 00:00:00 2001 From: zijunchiang Date: Fri, 18 Sep 2026 03:10:15 +0800 Subject: [PATCH] =?UTF-8?q?test(release):=20=E9=80=90=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=A0=B8=E5=AF=B9=E3=80=8C=E5=8F=91=E5=B8=83=E5=8C=85=20=3D=3D?= =?UTF-8?q?=20=E6=89=93=E6=A0=87=E7=AD=BE=E7=9A=84=E6=A0=91=E3=80=8D?= =?UTF-8?q?=EF=BC=88T-WIN-025=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 「发布包 == 打标签的树」此前只抽查几个文件,必然会漏。新增 build/check-tracked-release.py(纯标准库,直接读 LZMA zip):对包内**每一个**文件 按路径决定基准 —— OpenDance.exe / OpenDance.pck 比工作树 build/windows/ 的导出结果, 其余文件比 git show :<路径>;内容不一致 / 包内多余 / 构建产物缺失都会列出并退出 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/ 导致误报「工作树缺失」; 现在区分「以 / 结尾的目录前缀」与「精确文件名」两种键。 --- build/accept-release.sh | 16 +++ build/check-tracked-release.py | 182 +++++++++++++++++++++++++++++ build/package-release.sh | 3 +- tasks/025-tracked-release-check.md | 58 +++++++++ 4 files changed, 258 insertions(+), 1 deletion(-) create mode 100755 build/check-tracked-release.py create mode 100644 tasks/025-tracked-release-check.md diff --git a/build/accept-release.sh b/build/accept-release.sh index e666f80..5282782 100755 --- a/build/accept-release.sh +++ b/build/accept-release.sh @@ -56,6 +56,22 @@ log "期望版本:$EXPECTED" log "工作目录:$WORK_DIR" mkdir -p "$WORK_DIR" +# ---- 0. 逐文件核对:发布包 == 打标签的树(T-WIN-025)---- +# 「发布包里的东西必须等于打标签的那棵树」此前只靠抽查几个文件,必然会漏。 +# 本步骤对包内**每一个**文件核对:源码/文档比 tag,构建产物(exe/pck)比工作树导出结果。 +CHECKER="$PROJECT_DIR/build/check-tracked-release.py" +if [ -f "$CHECKER" ] && command -v git >/dev/null 2>&1 && [ -f "$TARGET" ]; then + TAG="v$(basename "$TARGET" .zip | sed 's/^opendance-windows-v//')" + if git -C "$PROJECT_DIR" rev-parse --verify "${TAG}^{commit}" >/dev/null 2>&1; then + log "逐文件核对:发布包 == tag $TAG" + python3 "$CHECKER" "$TARGET" --tag "$TAG" || fail "发布包与 tag $TAG 不一致" + else + log "跳过逐文件核对(仓库里没有 tag $TAG;打标签后可手工跑 $CHECKER)" + fi +else + log "跳过逐文件核对(缺 checker / git / 目标是已解压目录)" +fi + # ---- 1. sha256 + 解压 ---- if [ -f "$TARGET" ]; then # SHA256SUMS 里是**裸文件名**,所以校验时要把 cwd 切到包所在目录; diff --git a/build/check-tracked-release.py b/build/check-tracked-release.py new file mode 100755 index 0000000..74977c9 --- /dev/null +++ b/build/check-tracked-release.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python3 +"""发布产物 × 打标签的树:**逐文件**核对(T-WEB-018) + +## 为什么需要 + +「发布包里的东西必须等于打标签的那棵树」这条规则此前是靠人手工抽查几个文件 +(README、contracts/VERSION…)来确认的 —— 而抽查必然会漏。本轮实测就发现 +两个认知错误: + +* Web 的发布包**包含** `web-server/test/**`(33 个文件)而我此前以为不含, + 于是 `test/**` 的改动是否影响产物从来没被检查过; +* 发布包里另有构建产物(`OpenDance.exe` / `OpenDance.pck`)与 git 无关, + 必须与工作树的导出结果比 —— 只比源码文件是不够的。 + +本脚本把这条规则变成**可重复的全量核对**: + +对发布包里的**每一个**文件,按路径决定比较基准: + +| 路径 | 比较基准 | +|--|--| +| 构建产物(见 `BUILD_OUTPUTS`) | 工作树里对应的构建输出 | +| 其余文件 | `git show :<路径>`(打标签的树) | + +任何一处不一致 / 包内多余(既不在 git 也不在构建输出)/ 缺失都会列出并以非 0 退出。 + +## 用法(在仓库根目录执行) + + python3