Skip to content

ci(release): 给 release-please 配 extra-files,并把"哪几处它改不到"写成机器标注 - #121

Merged
ReSerendipity merged 1 commit into
mainfrom
ci/release-please-extra-files
Sep 22, 2026
Merged

ReSerendipity merged 1 commit into
mainfrom
ci/release-please-extra-files

Conversation

@ReSerendipity

Copy link
Copy Markdown
Owner

背景

#114 让 release-please 恢复工作后,它自动开的 release PR(#115 → 现在这条 #120只改 3 个文件
pyproject.toml / CHANGELOG.md / manifest),而本仓有 10 处跟踪中的版本位 ——
那条 PR 一旦合进 main,test_all_version_sites_agree#113 加的闸)会把 main 判红。
我在 #115 上写过"要放行就得填 extra-files",这条就是去填 —— 但先查清它到底能填哪些,不照抄文档。

事实:RP 没有 regex 类型

schemas/config.jsonextra-files[].type 只接受
json | toml | yaml | xml | pom | generic,而 generic 要求那一行末尾带
# x-release-please-version 这种井号注释标记。于是:

版本位 能否交给 RP 原因
pyproject.toml 自动 python release-type 自带
version.json / desktop/package.json / tauri.conf.json 自动 json + $.version
config.yaml 自动 yaml + $.version
desktop/src-tauri/Cargo.toml 自动 toml + $.package.version
desktop/src-tauri/Cargo.lock 人改 归 cargo 生成,手写标记会被它重写掉
scripts/installer/setup.nsi 三处 人改 NSIS 注释符是 ;,用不了 generic 要的 # 标记
deploy/kubernetes/deployment.yaml 镜像 tag 人改 要跟 ghcr 上真存在的标签走,不该由版本号推导
scripts/installer/version.json 不列 .gitignore:436 的装配中间物,仓库里没有它

本条把能自动的 5 处写进 extra-files,剩下的不装作能自动化

把"哪几处要人补"变成失败信息的一部分

  • 新增 _RP_MANAGED,失败时逐条标 ← RP 自动 / ← 手工同步,并写明那几处为什么只能人补;
  • test_rp_managed_annotation_matches_the_actual_config:标注必须与 config 里的 extra-files 一致 ——
    指路信息自己漂掉比没有注释更坏
  • docs/release-governance.md §1 落同一张表。

验证

  • tests/test_version_consistency.py + tests/test_release_robustness.py12 passed
  • 变异自证:把 tauri.conf.json 改成 2.2.99 → 该条红,并把 10 处逐条标注(实测输出见 PR 评论前的 commit message);
  • scripts/check_spec_refs.pynew=0scripts/verify_cloud_native.py 全绿。

合掉之后我接着做的事(不再单独请示)

RP 会 groom 下一条 release PR(#120,2.2.4)。那时去读它生成的 diff,看在真实 PR
yaml / toml 更新器到底怎么写 config.yamlCargo.toml(保留引号还是写成裸值、
$.package.version 有没有落对位置)——写歪就回退对应条目,而不是留一个"看起来配好了"的配置。
这算是我在 #114/#115 里承诺过的"必须在一次真实 release PR 上验"。

Refs: #114(RP 真修)、#120(下一条 release PR)、#115(我留下"要填 extra-files"结论的那条)

#114 让 release-please 恢复工作后,它自动开的 release PR(#115#120)只改 3 个文件
(pyproject / CHANGELOG / manifest),而本仓有 10 处跟踪中的版本位 —— 那条 PR 一旦合进 main,
`test_all_version_sites_agree` 会把 main 判红。我在 #115 上写过"要放行就得填 extra-files",
这条就是去填;但先查清了它到底能填哪些,不是照抄文档。

RP 没有 regex 类型:`schemas/config.json` 的 `extra-files[].type` 只接受
json | toml | yaml | xml | pom | generic,且 `generic` 要求行尾跟
`# x-release-please-version` 这种井号注释标记。于是:

- 能自动(本条写进 extra-files 的 5 处 + pyproject):version.json、config.yaml(yaml/$.version)、
  desktop/package.json、desktop/src-tauri/tauri.conf.json、Cargo.toml(toml/$.package.version);
- 只能人改:Cargo.lock(归 cargo 生成,手写标记会被重写掉)、
  setup.nsi 的 OutFile/APP_VERSION/VIProductVersion(NSIS 注释符是 `;`,用不了 `#` 标记)、
  deploy/kubernetes/deployment.yaml 的镜像 tag(要跟 ghcr 上真存在的标签走);
- 不列:scripts/installer/version.json(.gitignore:436 的装配中间物,仓库里没有)。

剩下的不装作能自动化,但把"哪几处要人补"变成失败信息的一部分:
- `_RP_MANAGED` 常量 + 失败时逐条标「← RP 自动 / ← 手工同步」并写明原因;
- 新增 `test_rp_managed_annotation_matches_the_actual_config`:标注必须与 config 里的 extra-files
  一致 —— 指路信息自己漂掉,比没有注释更坏;
- `docs/release-governance.md` §1 落同一张表。

验证:`test_version_consistency.py` + `test_release_robustness.py` 12 passed;
变异自证(把 tauri.conf.json 改成 2.2.99 → 红并逐条标注);
`check_spec_refs.py` new=0;`verify_cloud_native.py` 全绿。

合掉之后 RP 会 groom 下一条 release PR(#120 / 2.2.4),那时就能在**真实 PR** 上看见
yaml/toml 更新器到底怎么写 config.yaml 与 Cargo.toml(保留引号还是裸值)。写歪了就回退对应条目,
而不是留着一个"看起来配好了"的配置。

Signed-off-by: ReSerendipity <zengyangc@outlook.com>
@ReSerendipity
ReSerendipity merged commit 0d9a2c1 into main Sep 22, 2026
30 checks passed
ReSerendipity added a commit that referenced this pull request Sep 22, 2026
#121 把 5 处版本位挂进 release-please-config.json 后,RP 立刻刷新了 #120。真 PR 上的
diff 证明 `type: yaml` 不是"改一个字段":它 parse 完再 dump,把 config.yaml 的 232 行
改成 160 增 / 160 删,注释全灭(model_source_mode 选型说明、SSL 怎么打开、
vram_safety_margin_gb 的算式),连 "127.0.0.1" 的引号也被规范化。同一批里
json/toml 四条都是干净的 1 行 —— 破坏性只属于 yaml 写入器。

- release-please-config.json:删掉 config.yaml 那条(回到手工同步)
- tests/test_version_consistency.py:
  * _RP_MANAGED 去掉 config.yaml,注释里留下这次实测的账
  * 新增 test_extra_files_entries_are_all_actionable:类型只允许 json|toml|generic,
    并逐条走 jsonpath 确认"当前值就是 canonical 版本号"(配错 key / 文件搬家 / 字段改名
    都当场红,而不是发版当天发现 RP 静默少抬一处),generic 则要求行内标记在场
  * 新增 test_bundled_changelog_describes_its_own_version:RP 只抬 version.json 的
    $.version,不抬 changelog/release_date,而壳的 updater.rs 会读它展示给用户 ——
    拦住"自称 2.2.4、说明写着 2.2.3"的包
- docs/release-governance.md:§1 改成"自动位 5 条 + 手工位 4 类"并写清为什么 yaml 不能用;
  手工发版步骤补上"发完把 manifest 抬到刚发的版本"(否则两边在版本号上互踩);
  把两处已经过时的"release-please.yml 是结构性空转"改掉
- docs/agents/GOTCHAS.md #147:教训是"能不能命中 ≠ 副作用大小",新配 extra-files
  必须等一条真 release PR 看 diff 行数

门禁:test_version_consistency 8 passed(含 3 次变异复验——加回 yaml 条目 / 把 jsonpath
写成 $.package.versions / 只抬 version.json 的版本号,每次都红在对应的闸上);
test_release_robustness + test_integrity_selfcheck_packaging 合计 24 passed;
ruff check 通过;check_spec_refs.py 退出码 0。

Signed-off-by: ReSerendipity <zengyangc@outlook.com>
@ReSerendipity
ReSerendipity deleted the ci/release-please-extra-files branch September 23, 2026 07:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant