chore(release): v2.2.4 —— 引擎直切 503 与 onclick 注入修复 + 发布链路收口 - #129
Conversation
按 owner 指示走手工发版(关掉 RP 的 #120)。理由不是 #120 内容有问题,而是它拿不到 CI: GITHUB_TOKEN 产生的提交不级联触发 workflow,所以 5 类手工同步位不会在 release PR 上红, 只会红在发布之后的 main 上。手工路径可以一次把 9 处版本位改齐并在打 tag 前跑完闸。 本次改动: - 9 处版本位 2.2.3 -> 2.2.4:pyproject.toml、config.yaml、version.json(含 changelog 与 release_date 两个手工位)、desktop/package.json、tauri.conf.json、Cargo.toml、Cargo.lock、 deploy/kubernetes/deployment.yaml(两处 image tag)、scripts/installer/setup.nsi (OutFile / APP_VERSION / VIProductVersion) - .release-please-manifest.json 同步抬到 2.2.4,避免 RP 在下一条 release PR 上把版本号再抬一格 - CHANGELOG 新增 [2.2.4] 段:两处用户可见修复(#84 直切 503、#99 onclick 属性注入)+ 发布链路收口(#118 性能门禁判据与三级基线存储、extra-files 的 yaml 副作用、release PR 无 CI、 §7b 复算账、治理文件 LF 与 mailmap 的 249 个提交)+ 版本语义 + 已知未覆盖四条 - docs/release-governance.md §1 的"已发布最新"跟到 v2.2.4 本地门禁:tests/test_version_consistency.py + test_dependency_consistency.py + test_integrity_selfcheck_packaging.py = 31 passed;ruff check 通过、ruff format --check 404 files already formatted。scripts/installer/version.json(gitignore 的装配中间物)按 assemble_release_staging.ps1 的行为从根 version.json 同步了一份,否则本地那条"若在场则必须等于源"会红。 Signed-off-by: ReSerendipity <zengyangc@outlook.com>
真机验收结果(打 tag 之前跑的,与 CI 并列)1. 全量测试(非 e2e,与 CI 同口径
|
| 步 | 目标引擎 | load 前空闲 | HTTP | 耗时 | 服务端报已用 |
|---|---|---|---|---|---|
| 1 | voxcpm2 | 2266 MiB | 200 ok | 32.2 s | 6177 MiB |
| 2 | indextts2 (2.5) | 2108 MiB | 200 ok | 36.9 s | 6799 MiB |
| 3 | indextts20 (2.0) | 886 MiB | 200 ok | 33.9 s | 7090 MiB |
| 4 | voxcpm2(切回) | 609 MiB | 200 ok | 33.0 s | 6178 MiB |
第 2–4 步的"load 前空闲"都低于目标引擎的占用量 —— 旧行为就是在这里 503。
一次没有 503,也没有 status=error。
3. 切完的引擎是能出声的,不只是"加载成功"
POST /api/generate/voxcpm_design(文本 + 音色描述)→ HTTP 200,返回 htmx 片段
(content-type: text/html,里面 <audio src="/api/audio/voxcpm_design_1790074448.wav">),
按片段引用回读音频:206,580 B,头 b'RIFF'。与历史基线同量级(voxcpm2 一段约 230 KB)。
这里我第一版也写错了判据:拿
len(content) > 10 KB判裸音频,
结果 783 B 的 HTML 片段被判"合成失败"。真实契约是片段 +/api/audio/...回读。
4. 显存卫生(收尾核实)
POST /api/model/unload -> 200 {"status":"ok","message":"Model unloaded, VRAM released"}
nvidia-smi used: 9489 MiB -> 3344 MiB (服务端报 vram_used = 32 MiB)
停服务后:7869 无 LISTENING、无 app_server 进程、used 2790 MiB / free 9155 MiB
5. #99 那一面(persona/历史接线)
- 本 PR 不改模板/JS,所以 CI 的
Playwright E2E不触发(它的 paths 只认templates/**、
static/**、routes/**);它在该改动合入的那次 push 上跑过并成功:
777bfe1→Playwright E2E Tests: completed/success。 - 我这轮的独立读数:服务端吐出的
command_palette.js里gotoTab(1 处、activateTab(0 处;
仓库内onclick=拼接 JS 变量的写法 0 处(grep三种形状:+ var、${}、{{ }})。
6. 顺手挖出来的一件事,已立账不塞进这个版本
{{ }} 那一类里查出 7 处服务端模板在 onclick 属性内用 HTML 转义保护 JS 字符串
(tabs/persona.html:108、tabs/history.html:119-122、partials/error_message.html:7、
partials/post_processing.html:21)。这不是推论:Jinja 渲染出 'a'-alert(1)-'b',
而属性值在解析时会被解回 ' —— 单引号数从 2 变 4,字符串字面量被截断。
persona 名是用户敲的,所以有真实控制点。
模板改动会进被 tag 的产物,且这类改动要浏览器侧验收,所以没有塞进 v2.2.4:
→ issue #130(含可复现探针与两种修法,其中 |tojson 的用法有个反直觉的顺序要求)。
结论
CI 28 项通过(Docker 两条在途,非必需检查)+ 本地全量 2131 passed + 真机四向直切全 200 +
音频回读 206,580 B + 显存与进程收尾核实。按这个验收口径放行打 tag。
v2.2.4 已发布(手工路径,按 owner 指示)
release-please 与手工发版没有互踩(这次是量出来的)main 上 也就是 RP 认了这个手工 tag,没有再往 2.2.5 抬、也没有开新的 release PR。 顺带挖到一条独立的账验收 |
v2.2.4 手工发版提交
owner 指示:关掉 #120 走手工路径。#120 的内容是健康的(合 #121 后 RP 第一次在真 release PR 上
被验,重新 groom 的 diff 是
7 files, +17/−6,config.yaml的整份重写已消失),关它的唯一理由是release PR 拿不到 CI(
gh pr checks 120是空数组;GitHub 固定行为:GITHUB_TOKEN产生的提交不级联触发 workflow)—— 于是 5 类手工同步位不会在 PR 上拦,只会红在发布之后的 main 上。
手工路径能在打 tag 之前把 9 处一次改齐并跑完闸。
版本位:9 处 + 1 处本地装配物
pyproject.toml/desktop/package.json/tauri.conf.json/Cargo.toml/version.json的$.versionconfig.yamltype: yaml有副作用,已在 #123 摘掉)desktop/src-tauri/Cargo.lockdeploy/kubernetes/deployment.yamlimage:scripts/installer/setup.nsiOutFile/APP_VERSION/VIProductVersion三条version.json的changelog+release_date$.version).release-please-manifest.jsonscripts/installer/version.json(gitignore 的装配中间物)assemble_release_staging.ps1的行为从根version.json同步一份每处替换都要求恰好命中预期次数(
config.yaml1、k8s 2、nsi 各 1…),不满足就一个文件都不写。version.json的新changelog明确写了"不含 26 GB 分卷与增量包、NSIS 真装未验收",因为壳的
updater.rs会把这行显示给用户。CHANGELOG
[2.2.4]段按本仓口径写:两处用户可见修复(#84 直切 503 的先清场再预检、#99 的 onclick属性注入改事件闭包 + 同源裸插值收口)、发布链路收口(#118 判据换 median 单向 50% 与
三级基线原本三条都不通、
extra-files的 yaml 整份重写、release PR 无 CI、§7b 复算账、治理文件 LF + mailmap 补 249 个提交)、版本语义(约定式提交算下来也是 patch)、
以及已知未覆盖四条。
已经跑过的 / 还没跑完的
已跑:
test_version_consistency+test_dependency_consistency+test_integrity_selfcheck_packaging= 31 passed;
ruff check通过;ruff format --check404 files already formatted;pre-commit(ruff / trailing / eof / ast / secrets / engine specs / capabilities / integrity sync /
structure guard)与 pre-push(ruff、format、mypy 棘轮 103 不变)全过。
合并前还要看完:全量 pytest(含 e2e,本地后台跑,数字贴在本 PR 最后一条评论)与这条 PR 的 CI。
两样没同时绿之前不打 tag。
产物侧验收计划(合并之后,与 v2.2.3 同形)
git tag -a v2.2.4指向合并后的 main(注解 tag,不 GPG 签名 ——GPG_PRIVATE_KEY这个secret 不存在,与本仓历史一致)→ push;
python -m build→ wheel + sdist,twine check双过,生成SHA256SUMS.txt;gh release create挂轻资产(不含 26 GB 分卷 / 增量包 / Setup.exe);METADATA的Version: 2.2.4、解到临时目录后run_startup_selfcheck(enforce=True)给16/16/0/signed=True(v2.2.3 就是靠这一步才发现并修好缺口的,这次继续按产物验收而不是按声明)。docker-publish.yml是否为v2.2.4产出:2.2.4镜像 —— 本机这个 token 看不到ghcr(匿名 403、
gh api packages404),所以这条只能报"流水线是否绿",不能报"镜像已在"。