diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 9485046..3a3df6f 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "2.2.3" + ".": "2.2.4" } diff --git a/CHANGELOG.md b/CHANGELOG.md index abae178..1148029 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,62 @@ ## [Unreleased] +## [2.2.4] - 2026-09-22 + +两处用户可见修复,其余是**发布与 CI 链路的收口**(这个版本存在的理由之一:v2.2.3 之后 main 上 +攒了一批"门禁本身错了"的修复,需要一次可安装的锚点)。 + +### Bug Fixes + +* **engines:** 12GB 显存档**直切引擎必 503**(#84)—— 切换路径先做显存预检再清场,于是预检永远 + 看见"上一个引擎还占着"。现在先清场再预检,报错文案给可操作下一步(哪个引擎占了多少、要释放到多少)。 +* **security:** persona / 历史卡片把数据拼进 `onclick="…"` 属性(#99)—— 名字里带 `'` 就能逃出 + 属性上下文。改为事件闭包接线(数据进 JS 闭包,不进 HTML 属性),信息面板的**同源裸插值**一并收口。 + +### CI / 发布链路(不改运行时行为,但改"能不能信这条流水线") + +* **性能门禁**(issue #118)判据从 `--benchmark-compare-fail=mean:20%` 换成 + **`median` 单向 > 50%**,逐条打印对比表而不是整段重定向到 step summary;同代码在 runner 间的 + 实测摆动是 **17%–80%**,而旧判据方向也不对(被它判成"回退"的五个例子**全是变快**)。 +* 更深的第二层:门禁的"三级基线存储"**三条都不通** —— L1 `actions/cache` 在 + **10.23 GB / 配额 10 GB** 下两小时就被驱逐(main 存的基线,同一天 PR 侧 `Cache not found`)、 + L2 那两步的 `if startsWith(github.ref,'refs/tags/')` 在现有触发器下**永不成立**(三个已发布 + Release 的资产里确实没有基线文件)、L3 `benchmarks/baseline.json` 是 **0 条占位且无人读**。 + 现在对比按 L1 → L3 退让、空占位单独 `::warning::`(不把"没数据"过成"通过")、读取器同时认 + storage 顶层与 `{"benchmark":{…}}` 两种 JSON 形状,L3 用 main 真 run 的 artifact 填了 5 条 median。 +* **release-please 的 `extra-files`** 第一次在真 release PR 上被验:`type: yaml` 不是"改一个字段", + 而是 parse 后整份重排 —— `config.yaml` 被改成 **160 增 / 160 删、注释行 96 → 0**。已摘掉该条目 + (`config.yaml` 归手工同步),并加闸:类型只允许 `json|toml|generic`、逐条走 jsonpath 确认 + "今天确实命中"、以及拦"RP 抬了 `$.version` 却没抬同文件里的 `changelog`/`release_date`"。 +* 记录一条会咬人的机制:**release PR 上看不到任何 CI 检查**(GitHub 固定行为:`GITHUB_TOKEN` + 产生的提交不再级联触发 workflow)。所以手工同步位不会红在 release PR 上,只会红在发布之后的 + main 上 —— 合 release PR 前必须本地跑版本位一致性。v2.2.4 因此走手工路径(#120 关闭)。 +* **§7b 依赖复算**跑完 ①②③:候选锁与真锁**不同源**(97 vs 92 条、一致 74、16 条版本变、 + 7 条 huggingface-hub 的 extras 链来历未定、2 条新增)。`transformers` 复算给 4.52.4 会让 + 引擎血统闸红,`protobuf` 直接给到 7.36.2 但 gencode 兼容要到 import 期才暴露。 + **候选锁未采纳**,真锁继续手工钉;④ 的 GB 级真装仍待验收。 +* 治理文件:`.gitattributes` 给 `/.gitattributes`、`/.mailmap`、`Dockerfile` 锁 LF; + `.mailmap` 补上此前漏掉的 `TTS MultiModel Dev` 两个变体(**249 个提交**,shortlog 上原本 + 多出第三个"贡献者");`CODEOWNERS` 指向真实路径(注意:`require_code_owner_reviews` 未开启, + 它目前**拦不住任何合并**)。 + +### 版本语义 + +按约定式提交算也是 patch(`fix:` / `docs:` / `ci:` / `chore:`,无 `feat:`)。 +`.release-please-manifest.json` 随本次一起抬到 2.2.4,避免 release-please 在下一条 release PR +上把版本号再往抬一格(手工与自动两条路互踩,见 `docs/release-governance.md` §1)。 + +### 已知未覆盖(比 v2.2.3 多两条) + +* 资产仍是 **wheel + sdist + SHA256SUMS**:不含 26 GB 便携分卷(core/torch/model)与桌面增量包, + `Setup.exe` 的**真机安装验收**也没做过(该链路无任何 workflow 覆盖)。 +* `ghcr.io/.../tts-multimodel:2.2.4` 是否真的产出,本机无从核对:匿名拉 manifest 得 403、 + `gh api packages` 得 404(token 无 `read:packages`)。镜像由 `docker-publish.yml` 在 + `v*` tag push 时按 `type=semver` 产出,且被 Trivy HIGH/CRITICAL 阻断逻辑把关。 +* §7b 的 ④(复算锁真装 + 三引擎复验)未做,#89/#90/#91 三条 dependabot PR 因此仍挂着。 +* 上面那条"合 release PR 前必须本地跑版本位闸"目前只是**文档 + 手工动作**,不是机器闸; + 要变机器闸需要一个能对 release 分支 head SHA 报 commit status 的作业(权限决策)。 + ## [2.2.3] - 2026-09-22 补丁版,只为把一处**随包分发缺口**送进可安装的产物:它修在 main 上,但晚于 v2.2.2 的 tag, diff --git a/config.yaml b/config.yaml index e3f6278..1703060 100644 --- a/config.yaml +++ b/config.yaml @@ -1,4 +1,4 @@ -version: "2.2.3" +version: "2.2.4" server: host: "127.0.0.1" diff --git a/deploy/kubernetes/deployment.yaml b/deploy/kubernetes/deployment.yaml index 0e68823..1ebcba6 100644 --- a/deploy/kubernetes/deployment.yaml +++ b/deploy/kubernetes/deployment.yaml @@ -37,7 +37,7 @@ spec: # P0-1:subPath 挂载要求 PVC 内子目录预先存在(kubelet 不会自动创建)。 # 用主镜像(离线可用、自带 python)在可写的 data 卷上预建全部运行时目录。 - name: init-dirs - image: ghcr.io/reserendipity/tts-multimodel:2.2.3 + image: ghcr.io/reserendipity/tts-multimodel:2.2.4 imagePullPolicy: IfNotPresent command: ["python3.12", "-c", "import os; [os.makedirs(f'/mnt/data/{d}', exist_ok=True) for d in ['data','outputs','logs','cache','lora','personas']]; print('init-dirs ok')"] @@ -58,7 +58,7 @@ spec: memory: "256Mi" containers: - name: tts - image: ghcr.io/reserendipity/tts-multimodel:2.2.3 + image: ghcr.io/reserendipity/tts-multimodel:2.2.4 imagePullPolicy: IfNotPresent ports: - containerPort: 7869 diff --git a/desktop/package.json b/desktop/package.json index 56f27b4..9d1323b 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -1,6 +1,6 @@ { "name": "tts-multimodel-desktop", - "version": "2.2.3", + "version": "2.2.4", "private": true, "description": "TTS MultiModel 桌面应用壳", "scripts": { diff --git a/desktop/src-tauri/Cargo.lock b/desktop/src-tauri/Cargo.lock index b04c696..8f978b4 100644 --- a/desktop/src-tauri/Cargo.lock +++ b/desktop/src-tauri/Cargo.lock @@ -4750,7 +4750,7 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tts-multimodel-desktop" -version = "2.2.3" +version = "2.2.4" dependencies = [ "anyhow", "base64 0.22.1", diff --git a/desktop/src-tauri/Cargo.toml b/desktop/src-tauri/Cargo.toml index c3feb3f..4316a5b 100644 --- a/desktop/src-tauri/Cargo.toml +++ b/desktop/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tts-multimodel-desktop" -version = "2.2.3" +version = "2.2.4" description = "TTS MultiModel 桌面应用壳" authors = ["TTSMultiModel"] edition = "2021" diff --git a/desktop/src-tauri/tauri.conf.json b/desktop/src-tauri/tauri.conf.json index e3304bc..5d512a1 100644 --- a/desktop/src-tauri/tauri.conf.json +++ b/desktop/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "TTSMultiModel", - "version": "2.2.3", + "version": "2.2.4", "identifier": "com.ttsmultimodel.desktop", "build": { "beforeDevCommand": "", diff --git a/docs/release-governance.md b/docs/release-governance.md index 5eaf755..5d4eb7d 100644 --- a/docs/release-governance.md +++ b/docs/release-governance.md @@ -8,7 +8,7 @@ ## 1. 版本号规范 -- 遵循 SemVer `MAJOR.MINOR.PATCH`。**已发布最新 = v2.2.3(2026-09-22)**。 +- 遵循 SemVer `MAJOR.MINOR.PATCH`。**已发布最新 = v2.2.4(2026-09-22)**。 版本号出现在 11 处(`version.json`/`pyproject.toml`/`config.yaml`/`desktop/*`/`scripts/installer/setup.nsi`), 但只有 tag + GitHub Release 同时存在才算发出去;核对:`gh release view v<版本>`。 > 其中 `desktop/package-lock.json` 在 `.gitignore` 里(不是仓库内的版本位);仓库内跟踪的 9 处 diff --git a/pyproject.toml b/pyproject.toml index cdc85c8..4b4fee6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "tts-multimodel" -version = "2.2.3" +version = "2.2.4" description = "TTS MultiModel - Multi-engine Text-to-Speech platform with voice cloning, voice design, and LoRA fine-tuning" readme = "README.md" license = "Apache-2.0" diff --git a/scripts/installer/setup.nsi b/scripts/installer/setup.nsi index 82ea2ef..466b090 100644 --- a/scripts/installer/setup.nsi +++ b/scripts/installer/setup.nsi @@ -5,7 +5,7 @@ Unicode true !include "LogicLib.nsh" Name "TTSMultiModel 桌面版" -OutFile "TTSMultiModel-Setup-v2.2.3.exe" +OutFile "TTSMultiModel-Setup-v2.2.4.exe" InstallDir "$LOCALAPPDATA\Programs\TTSMultiModel" InstallDirRegKey HKCU "Software\TTSMultiModel" "InstallDir" RequestExecutionLevel user @@ -13,7 +13,7 @@ SetCompressor /SOLID lzma CRCCheck on BrandingText "TTSMultiModel" -!define APP_VERSION "2.2.3" +!define APP_VERSION "2.2.4" !define DATA_PREFIX "TTSMultiModel-Data.7z" !define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\TTSMultiModel" !define APP_ICON "${__FILEDIR__}\..\..\desktop\src-tauri\icons\icon.ico" @@ -135,7 +135,7 @@ Section "TTSMultiModel 桌面版" SEC_APP SectionEnd ; ---------- 版本信息 ---------- -VIProductVersion "2.2.3.0" +VIProductVersion "2.2.4.0" VIAddVersionKey "ProductName" "TTSMultiModel 桌面版" VIAddVersionKey "LegalCopyright" "Copyright (C) 2026 TTSMultiModel" VIAddVersionKey "ProductVersion" "${APP_VERSION}" diff --git a/version.json b/version.json index 54be9e9..1ccd5da 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { - "version": "2.2.3", + "version": "2.2.4", "release_date": "2026-09-22", "minimum_shell_version": "2.2.2", - "changelog": "2.2.3:修复随包分发缺口 —— wheel 此前没打进完整性自检清单三件套(清单/签名/公钥),而 enforce 默认开启,导致 pip 安装出来的环境里 P0 完整性保护一条都没执行却写着在强制运行;现在三件随包走,且 enforce 开着而清单缺失会拒绝启动。另含 2.2.2 的发布前置回归(干净环境缺 einops/addict、镜像 apt 索引就绪守卫、CSRF 硬失败与 0600、IndexTTS 预热并发崩溃修复)。资产为 wheel + sdist + SHA256SUMS;不含 26 GB 便携分卷与增量包。" + "changelog": "2.2.4:两处用户可见修复 —— 12GB 显存档直切引擎不再 503(先清场再预检),persona/历史里的 onclick 字符串拼接改为事件闭包(消除属性注入面,同源裸插值一并收口)。其余是发布与 CI 链路收口:性能门禁改判 median 单向 50% 且基线改从仓内 L3 取、release-please 的 extra-files 摘掉会整份重写 config.yaml 的 yaml 类型、版本位新增『每条自动位今天真能命中』的闸、§7b 依赖复算结果落成账。资产为 wheel + sdist + SHA256SUMS;不含 26 GB 便携分卷与桌面增量包,NSIS 安装包真装未验收。" }