From 387a9a5ce7cd3d1545541b6aa868ea75de83c481 Mon Sep 17 00:00:00 2001 From: ReSerendipity Date: Wed, 23 Sep 2026 08:04:48 +0800 Subject: [PATCH] =?UTF-8?q?docs(release):=20=E6=9B=B4=E6=AD=A3=E6=88=91?= =?UTF-8?q?=E8=87=AA=E5=B7=B1=E5=9C=A8=20=C2=A71=20=E5=86=99=E4=B8=8B?= =?UTF-8?q?=E7=9A=84=E4=B8=80=E4=B8=AA=E6=8E=A8=E8=AE=BA=20=E2=80=94?= =?UTF-8?q?=E2=80=94=20"=E5=8F=AA=E6=94=B9=E5=8F=91=E7=89=88=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E4=BB=8D=E4=BC=9A=20mint=20=E7=89=88=E6=9C=AC"?= =?UTF-8?q?=E8=A2=AB=E5=AE=9E=E6=B5=8B=E5=90=A6=E6=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #138 合入(1264b70,14:32:09Z)后 2 秒 RP 重跑,日志原文: ✔ Splitting 5 commits by path ❯ commits: 3 ✔ Considering: 3 commits ✔ No user facing commits found since 9125a3e6833e8000b8dceb9fc57c31402fe77576 - skipping 那条提交改的正是 `release-please-config.json`(外加 docs/tests),而 #138 的 PR body 与 §1 第 ② 条都由"`exclude-paths` 排不掉仓库根上的单个文件"推出过"所以只改发版配置仍会 mint 一个版本,#137 就是这么留下的"。**前半句是对的**(匹配式 `file.startsWith(entry + "/")` 决定根文件做不成条目),**后半句是错的**:类型侧还有一道闸,`ci:` 不算 user facing, `docs:` 才算 —— 当初 2.2.6 被开出来是因为内容是 Documentation,不是因为文件位置。 一句话里"排不掉 ⇒ 会发版"这步跳跃是我把两个独立机制当成了一个。 顺带补两条同批量到的账,下次动口径要用: 1. **收窄口径会留下"死信 release PR"**:RP 对已经开出、但内容不再算数的 PR 既不更新也**不关闭** (这一轮走的是 `skipping` 分支,#137 的 `updatedAt` 停在 14:03:51Z 没动),所以它要靠人关。 以后每次改 `exclude-paths` 或提交类型口径,都得去 `gh pr list --author app/github-actions` 清一次旧的。 2. **排除 `tests` 不是零代价**:v2.2.5 的 sdist 实测含 **138 个 `tests/` 文件**(wheel 里 0 个, `docs/`、`scripts/`、`.github/`、`release-please-config.json` 也都是 0)。"只改测试不发版" 是对 wheel(用户真正 pip 安装的东西)成立的判断,对 sdist 不成立 —— 是有意的取舍,写下来 免得下次有人以为它完全不影响产物。 产物侧的数一起进 `docs/DOD.md`:新增一条"v2.2.5 只做产物侧回读,没重跑本清单"的记录 —— wheel/sdist 的字节数、条目数(1065 / 1208)、三件套、双向对上的 sha256、 `run_startup_selfcheck(enforce=True)` = `16/16/0 skipped=0 manifest_signed=true`, 并写明**为什么不拿局部绿灯冒充 DoD 执行过**(运行时代码零改动 + 主工作树当时被另一个写者占着, "跑测试期间冻结工作树"这个前提不成立)。 验证:独立 worktree(`git worktree add`,不动主工作树 —— 那边此刻有另一个写者在改 38 项) 跑 `tests/test_version_consistency.py` + `tests/test_release_readiness_gate.py` = **13 passed**; `scripts/check_release_readiness.py --root .` 判"发版条件满足"(11 处版本位 = 2.2.5); `已发布最新 = v2.2.5` 那一行未动。 Signed-off-by: ReSerendipity --- docs/DOD.md | 12 ++++++++++++ docs/release-governance.md | 14 ++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/docs/DOD.md b/docs/DOD.md index 8c6b486..6eb7acc 100644 --- a/docs/DOD.md +++ b/docs/DOD.md @@ -99,6 +99,18 @@ 模板/静态资源,CI 的 `Playwright E2E Tests` 在该改动合入的 `777bfe1` 上是 success); 字体菜单/断网首屏/换页竞态三项**没重跑**(上次取证是 2026-09-19/20 的 v2.2.2 工作树); `Setup.exe` 真机安装与 26 GB 分卷仍未验收。 +- **v2.2.5 只做产物侧回读,没重跑本清单**(2026-09-22 22:3xZ)。这一版的内容是发布链路本身 + (docker 层缓存 `mode=min`+scope、`release-gate` commit status、DCO 按作者豁免、治理文档), + 运行时代码零改动,而且主工作树当时有另一个写者在改 38 项 —— 全量门禁的前提"跑测试期间冻结 + 工作树"不成立,所以**不拿局部绿灯冒充本清单执行过**。产物侧取证(RP 自己构建、挂上 Release 的那份): + wheel 28,381,932 B / **1065 条目** / `METADATA Version: 2.2.5`,sdist 28,337,605 B / + **1208 文件**(`app/` 1064 + `tests/` 138 + 根 6),两者的 sha256 与 Release 的 `SHA256SUMS` + 以及 GitHub 自算 `asset.digest` **双向对上**(`4eba3c28…` / `04d012b6…`);完整性三件套 + (清单 / `.sig.ed25519` / 公钥)在两个产物里都在;解包后**按包导入**跑 + `run_startup_selfcheck(enforce=True)` = `total=16 passed=16 failed=0 skipped=0 + manifest_signed=true`,rc=0(按文件路径加载会打断相对导入 → 假红,见 GOTCHAS #150)。 + 顺带一条分发面事实:**`tests/` 随 sdist 分发**(138 个),wheel 里则没有 —— + `release-please-config.json` 把 `tests` 放进 `exclude-paths` 的取舍依据就在这里(§1 第 5 条)。 - 上一次全量执行:2026-09-19,v2.2.2 工作树。机器侧佐证:全量 `pytest`(含 e2e、服务在线, `--cov=app/integrated_app`)**2084 passed / 40 skipped / 0 failed,8m14s**,覆盖率 51.94% (门禁 45%);mypy 103 = 基线;`tests/e2e/` 68 passed + 5 skipped(跳过的 5 条是视觉回归, diff --git a/docs/release-governance.md b/docs/release-governance.md index ea9d146..14883df 100644 --- a/docs/release-governance.md +++ b/docs/release-governance.md @@ -75,12 +75,22 @@ `file.startsWith(entry + "/")`,**不是 glob**): ① 写 `docs/**` 永不命中,只能用裸目录名 `docs`;RP 自己的测试用的也是 `['pkg3','pkg1']`; ② **仓库根上的单个文件排不掉**(那个 `+"/"` 让 `README.md`、`CHANGELOG.md`、 - `release-please-config.json` 都做不成条目)—— 所以"只改发版配置"这一类提交仍然会 - mint 一个版本,今天这条 #137 就是这么留下的; + `release-please-config.json` 都做不成条目)。**但"排不掉"不等于"会发版"** —— 我原先 + 由这一点推"只改发版配置仍会 mint 一个版本",#138 合入后被实测否掉:那条提交改的正是 + `release-please-config.json`,而 RP 的日志是 + `✔ No user facing commits found since 9125a3e… - skipping`。原因是类型侧还有一道闸: + `ci:` 不算 user facing(`docs:` 算,这才是当初 2.2.6 被开出来的原因)。 ③ 条目写成 `.` 会把**所有**提交排掉,RP 从此一声不响再也不发版(本仓踩过同形状的 "永远绿却什么都不做",见下面 v2.2.2 那段旧账)。 闸是 `test_exclude_paths_entries_are_all_actionable`:glob / `.` / 不存在的目录 / 清空列表 / 覆盖 `app/` 这 5 种写法都实测过会红。 + 另外两条例外的账要记着: + · **收窄口径会留下"死信 release PR"** —— RP 对已开出但内容不再算数的 PR 既不更新也 + **不关闭**(走 `skipping` 分支),#137 就是靠人关掉的。以后每次动 `exclude-paths` + 或提交类型口径,都要去 `gh pr list --author app/github-actions` 看一眼有没有旧的要清。 + · **排除 `tests` 不是零代价**:实测 v2.2.5 的 sdist 里有 **138 个 `tests/` 文件** + (wheel 里 0 个,`docs/`/`scripts/`/`.github/` 也都是 0)。所以"只改测试"不发版这条 + 是对** wheel(用户真正装的东西)**成立的判断,对 sdist 不成立 —— 是有意的取舍,别当成无影响。 2. 手工:`git tag -a` + `gh release create`(v2.2.2 / v2.2.3 / v2.2.4 走的就是这条)。 手工发版之后 RP 会在下一条 release PR 里把版本号再抬一格(它按 manifest 算), 所以手工发完要把 `.release-please-manifest.json` 一起抬到刚发的版本,否则两边在版本号上互踩。