feat(update): add startup health rollback fuse
This commit is contained in:
@@ -502,6 +502,7 @@ cmshopee/
|
||||
│ ├── update_installer.py # 自动升级安全下载、解压、manifest校验与同盘暂存
|
||||
│ ├── updater_entry.py # 独立更新器入口、事务根项目切换、journal与回滚
|
||||
│ ├── gui/update_dialog.py # 强制升级模态进度、下载worker与重启编排
|
||||
│ ├── update_health.py # 新版启动健康标记与失败版本熔断
|
||||
├── main.py # GUI 启动入口:from app.gui import main
|
||||
├── shopee待处理任务模板.xlsx # 标准空 Excel 模板,可提交;业务填写后的副本不提交
|
||||
├── data/ # 用户本地数据根(整体 gitignore;打包更新时保留)
|
||||
@@ -533,6 +534,7 @@ cmshopee/
|
||||
- T-616 的下载暂存根固定为安装目录下 `.cmshopee-update/`,与 `data/` 完全隔离。远程zip必须经过HTTPS/受信任域名、声明大小、整包SHA-256、安全zip路径和包内manifest逐文件校验,才写 `pending.json`;此阶段不替换任何运行中程序文件。
|
||||
- T-617 的独立 `cmshopee-updater.exe` 必须先复制到系统临时目录运行,并等待主程序退出。替换粒度是manifest允许的程序根项目,旧根先整体移动到同盘backup,新根再整体移入;事务锁防止并发更新,journal记录每次移动,任一步失败逆序恢复。`data/`、更新管理目录与未知安装根项目永不进入替换清单。
|
||||
- T-618 在创建 `MainWindow` 前显示强制升级 `QDialog`;下载与校验只能在 `QObject + QThread` worker中执行,线程结束前保留引用,取消时等待part清理。独立更新器进程成功创建后才退出旧主程序;强制版本后续失败保持阻断,只有版本接口本身不可达/非法继续失败放行。
|
||||
- T-619 要求新版按事务写 `process_started`、`main_window_ready`、`environment_blocked` 健康标记。更新器只在主窗口就绪后认定升级成功并清理成功备份;无标记/早期退出/超时则事务回滚并按目标版本+包hash熔断。环境阻断保留新版,不把本地数据目录、配置或Chrome问题误判成坏发布包。
|
||||
|
||||
- CDP 交互事实变化同步第七节。
|
||||
- 正式代码只放 `app/` 包;根目录只保留 `main.py`、配置/数据目录、文档和原型目录,不新增正式业务模块。
|
||||
|
||||
+3
-1
@@ -182,6 +182,8 @@ T-617 增加独立 `cmshopee-updater.exe`。构建脚本用 `cmshopee-updater.sp
|
||||
|
||||
T-618 已把安全暂存和独立更新器接回启动门禁。强制升级窗口使用QThread执行下载、hash、解压和manifest校验,主线程持续显示中文阶段、进度和字节数;协作式取消会等待线程清理,避免线程仍运行时销毁。确认独立更新器进程创建成功后旧主程序退出;强制响应后的任何准备失败都保持阻断,只能重试或退出。版本接口完全不可达/非法仍按T-544策略失败放行。
|
||||
|
||||
T-619 增加启动健康确认与失败熔断。新版带事务参数启动,在 `.cmshopee-update/transactions/<事务>/health.json` 原子写 `process_started`、`main_window_ready` 或 `environment_blocked`。更新器在主窗口就绪前保留旧根项目;早期退出/超时会回滚并按版本+zip hash写 `failed-versions.json`,防止同一坏包无限循环。主窗口就绪后清理pending、zip、staging和本次成功备份;环境阻断保留新版与备份。备份清理只处理 `.cmshopee-update/backup/` 且保留最近两份,不扫描 `data/`。
|
||||
|
||||
## 四、绝不打包的本地数据
|
||||
|
||||
发布包里不能包含以下本地数据、密钥、业务数据或登录态:
|
||||
@@ -240,7 +242,7 @@ cmshopee\
|
||||
|
||||
## 六、用户后续更新方式
|
||||
|
||||
第一版不做自动覆盖升级。给用户发新版本时,或 T-544 启动检查弹出“必须升级”时:
|
||||
尚未安装自动升级引导版本的旧用户仍按以下方式人工覆盖;安装T-619及之后版本后,强制升级窗口可自动下载、替换和重启:
|
||||
|
||||
1. 让用户先关闭 cmshopee。
|
||||
2. 建议用户备份当前整个程序文件夹。
|
||||
|
||||
+6
-2
@@ -3,7 +3,7 @@ id: T-619
|
||||
title: 自动升级启动健康确认熔断与发布验收
|
||||
phase: 8
|
||||
deps: [T-618]
|
||||
status: TODO
|
||||
status: DONE
|
||||
created: 2026-07-13
|
||||
---
|
||||
|
||||
@@ -48,4 +48,8 @@ created: 2026-07-13
|
||||
|
||||
## 执行记录
|
||||
|
||||
(完成后记录实现、验证命令与结果。)
|
||||
- 2026-07-13:新增新版启动健康上下文与原子标记,更新器等待 `main_window_ready`/`environment_blocked`;无健康标记、早期退出或超时会回滚,并按目标版本+zip hash记录熔断。
|
||||
- 2026-07-13:成功后清理pending、zip、staging和本次成功备份;环境阻断保留新版与旧备份;备份清理只限更新管理目录且保留最近两份,`data/` 不参与扫描或移动。
|
||||
- 2026-07-13:真实release验证发现并修复“manifest中0字节文件被误判为-1字节”的阻断缺陷,下载暂存与独立更新器两层均增加0字节回归用例。
|
||||
- 2026-07-13:Windows 10 / Python 3.10完成正式build与隔离目录打包EXE端到端事务升级:更新器退出码0、健康状态 `main_window_ready`、journal为 `healthy`、目标版本0.1.4、旧依赖移除、data哨兵不变;zip大小/hash与元数据一致,manifest覆盖220个程序文件且包含更新器。
|
||||
- 2026-07-13:干净worktree验证通过:ruff、compileall、完整unittest(419项)和 `git diff --check`。Windows 11无Python环境的相同人工矩阵当前机器无法执行,仍是正式对外强制发布前的发布验收项,不能视为已有证据。
|
||||
|
||||
@@ -319,3 +319,9 @@ cmshopee 的 cmhub 请求默认**绕过系统代理**(`ai.cmhub.use_system_pro
|
||||
- 若你的机器**必须走代理**才能上网,编辑 `data/config.json` 把 `ai.cmhub.use_system_proxy` 改为 `true`(注意:慢代理仍可能拖累图片下载)。
|
||||
- 若下载仍慢且 curl 也慢,则是 cmhub **媒体服务器本身慢**(如 Django 直接服媒体、单线程),属服务端问题,需在 cmhub 侧用 nginx/对象存储服 `/generated/images/`。
|
||||
- 调试期可临时把 ⑤「图片并发数」设 1 复测单张,排除并发因素。
|
||||
## 自动升级排障
|
||||
|
||||
- 强制升级窗口显示“该版本自动升级曾失败”:本机已经自动回滚过相同版本和zip hash,为避免循环不会再次自动安装。等待管理员发布修复包/更高版本,或退出后人工覆盖可信发布包;不要删除 `data/`。
|
||||
- 升级后提示数据迁移冲突、数据目录不可写或Chrome配置错误:这是本地环境阻断,新版不会自动回滚。按原提示修复目录或Chrome配置后重新启动。
|
||||
- 自动升级失败的本地记录位于安装目录 `.cmshopee-update/logs/`、`transactions/` 和 `failed-versions.json`。提供排障材料前先检查并脱敏;程序不会自动上传日志。
|
||||
- 人工恢复时只覆盖 `cmshopee.exe`、`_internal/`、版本/说明/manifest和更新器,必须保留 `data/`。不要把 `.cmshopee-update/backup/` 当业务数据目录。
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
|
||||
- **强制且自动安装元数据完整**:弹模态进度窗口,显示中文阶段、下载百分比/字节数和发布说明;点击「立即升级」后在工作线程下载、校验和暂存,再启动独立更新器并退出旧程序。更新器完成事务替换后自动启动新版。
|
||||
- **强制但元数据不完整,或下载/校验/更新器启动失败**:继续阻断主窗口,只允许「重试」或「退出程序」,不能降级放行旧版,也不再打开浏览器让用户手工覆盖。
|
||||
- **同一版本和zip hash曾因新版早期崩溃回滚**:命中本地失败版本熔断,不重复自动安装;仍保持强制阻断,提示等待管理员发布不同hash的修复包/更高版本,或手动安装。
|
||||
- **非强制**:**不弹任何提示**,直接进主界面(当前无"温和可跳过提示"分支;如需另立任务)。
|
||||
- **失败放行**:接口断网、超时、返回非法 JSON、缺 `latest_version`/`min_supported_version` 时,客户端记诊断日志(`data/logs/cmshopee.log`,`step=startup_update_check`「已允许继续使用」)并**放行**,不因服务器故障导致全员打不开。
|
||||
|
||||
@@ -121,3 +122,9 @@ T-617 已提供独立无控制台更新器和事务回滚能力:更新器从
|
||||
- 若将来要"非强制也温和提示(可跳过、不阻断)",需在客户端加一个非强制分支,另立任务。
|
||||
- 空 `sha256` 只兼容 T-544 的人工下载引导,绝不能进入自动安装。自动安装还必须同时校验 HTTPS、`size_bytes`、包格式和更新器协议。
|
||||
- `manifest_signature` 与 `signature_algorithm` 是预留字段;当前未启用数字签名,不能将 SHA-256 描述为发布者身份认证。
|
||||
|
||||
## 八、引导版本与灰度发布
|
||||
|
||||
仍只有T-544“浏览器下载”能力的旧客户端无法凭空获得独立更新器,必须先人工覆盖一个同时包含T-615至T-619代码和 `cmshopee-updater.exe` 的引导版本。后续自动发布先以非强制方式灰度确认接口字段、下载和manifest,再开启 `force_update` 或提高 `min_supported_version`。发布包的 `updater_protocol` / `min_updater_protocol` 必须与引导版本兼容。
|
||||
|
||||
更新器启动新版后等待健康标记:`process_started` 表示基础导入、Qt和版本核对完成;`main_window_ready` 表示数据目录、必要初始化和主窗口显示完成,此时才清理成功备份;`environment_blocked` 表示数据目录、配置或Chrome等本地环境需用户处理,保留新版且不误回滚。无已知标记、版本不符、早期退出或健康等待超时会恢复旧版并写失败版本熔断记录。
|
||||
|
||||
Reference in New Issue
Block a user