feat(auto-update): 实现全流程自动更新功能与配套界面

- 新增主进程更新服务,支持GitHub官方源与加速源兜底的检查、下载、安装全流程
- 新增独立更新日志页面,支持查看更新说明与更新全流程管理
- 实现更新状态持久化,重启应用可恢复上次未完成的下载进度
- 完善版本管理与构建元数据脚本,优化CI发布流水线
- 补充VersionCard的构建信息展示与更新页跳转逻辑
- 新增更新相关IPC接口、类型定义与全局状态管理
- 清理旧的无用配置项,升级相关依赖包
This commit is contained in:
2026-08-30 20:19:15 +08:00
parent b404ffaef8
commit 4d3e43394c
26 changed files with 2280 additions and 98 deletions
+60 -12
View File
@@ -1,11 +1,11 @@
# Koring Launcher 自动更新方案(v1 规划稿)
> 状态:**M1 完成(2026-08-28**M2 待开始
> 状态:**M1 完成;M2 主进程更新模块完成(2026-08-28UI 待做**
> 目标平台:**Windows 优先**NSIS exe 安装包),macOS/Linux 后续复用同一套架构
> 决策记录:
> - 安装器模式:**保持 assisted 安装器(`oneClick: false` + 可改安装目录)→ 每次更新整包下载**
> - 更新托管:**GitHub Releases**
> - 当前交付:**M1 基础设施已完成**electron-updater 依赖 + publish 配置 + 1.2.0 打包验证)
> - 当前交付:**M1 基础设施 + M2 主进程更新模块(GitHub 优先 + 加速源兜底)已完成**
---
@@ -292,20 +292,68 @@ src/
**触发方式**Actions 页面 → Run workflow,仅手动触发(不再使用 tag 触发)。
- `mode``beta`(测试,发布为 GitHub prerelease/ `run`(正式,发布为普通 release
- `version`:基础版本号(如 `1.2.0`
- `ref`:构建来源分支/tag/commit(留空 = 默认分支
- `sign`:是否使用 SignPath 签名
- **无 `version` 输入**base 自动读 `package.json`(版本单一事实源,消除本地/CI 版本双轨)
**版本号与 BUILD ID**
- BUILD ID = Action 运行的 **UTC 时刻**,格式 `YYMMDDHHMM`(如 `2608280224`
- 最终版本 = `{version}-{BUILD ID}`(如 `1.2.0-2608280224`),tag = `v{version}-{BUILD ID}`
electron-builder 产物 = `koring-launcher-{version}-{BUILD ID}-setup.exe``latest.yml` 同步更新
**版本号与 BUILD ID2026-08-30 起改为 GitHub Run Number**
- BUILD ID = `github.run_number`(严格递增、无分钟级冲突
- 最终版本 = `{base}-{buildId}`(如 `1.2.0-12`),tag = `v{base}-{buildId}`
electron-builder 产物 = `koring-launcher-{base}-{buildId}-setup.exe``latest.yml` 同步更新
- 构建元数据(commit / buildId)由 `scripts/gen-build-info.js` 写入 `src/lib/buildInfo.ts`
打包进渲染层,VersionCard / 关于页显示**构建来源 commit**(`scripts/version.js build ci` 负责统一设版本)
**发布内容**`gh release create`,中文正文由 `scripts/release-notes.ps1` 生成):
- `# Koring Launcher Releases {version}` + 版本信息(当前版本 / 编译状态 BETA/RUN
- `# Koring Launcher Releases {base}` + 版本信息(当前版本 / 编译状态 BETA/RUN / 签名状态 / **构建来源 commit**
- `## 更新了什么内容`:自上个 `v*` tag 以来的提交记录,每条默认折叠
`<details><summary>·Commit 1cf906d</summary>…</details>`
- 上传产物:setup.exe + latest.ymlelectron-updater 更新清单)
- 上传产物:setup.exe + latest.yml + release-notes.mdelectron-updater 更新清单)
**⚠️ 版本语义注意(electron-updater**
- `{version}-{BUILD ID}` 属 semver prerelease:同格式版本之间可正常升级(BUILD ID 更大者胜)
- 若未来发布**不带** BUILD ID 的稳定版本(如 `1.2.0`),稳定版用户不会自动升级到带 BUILD ID 的构建
- 同一分钟内重复触发会产生相同 BUILD ID → tag 冲突,`gh release create` 会失败,稍候重试即可
- `{base}-{buildId}` 属 semver prerelease:同格式版本之间可正常升级(buildId 更大者胜)
- 若未来发布**不带** buildId 的稳定版本(如 `1.2.0`),稳定版用户不会自动升级到带 buildId 的构建
- **迁移注意**:从时间 ID`2608271921`)切换到 Run Number 后,旧格式数值更大(`2608271921 > 12`),
老用户不会自动升级到新格式——切换时应同时提升 base(如 `1.3.0-12 > 1.2.0-2608271921`
## 14. M2 主进程更新模块(2026-08-28UI 待做)
**新增/改动**
- `electron/updater.ts` — 更新服务:electron-updaterGitHub provider)优先,失败后加速源兜底;
状态机 idle/checking/available/not-available/downloading/downloaded/error,进度事件,`quitAndInstall`
- `electron/handlers/update.ts` — IPC`update:check` / `update:download` / `update:quitAndInstall` / `update:getState`
状态变化广播 `update:status` 到所有窗口
- `electron/main.ts` — 注册 handler + 启动后 12s 延迟静默检查(开发模式自动跳过)
- `electron/preload.ts` + `src/types/electron.d.ts` — 暴露更新 API(UI 未接,待 M3)
**加速源兜底(实测)**
- GitHub 直连在本机网络不可用;`gh.ddlc.top` 已实测可代理 `releases/download`latest.yml + 102MB 安装包)与 `/releases/latest` 页面
- 发现机制(无需 GitHub API):`{镜像}/https://github.com/{owner}/{repo}/releases/latest` 页面 HTML 提取 tag →
`autoUpdater.setFeedURL({ provider: 'generic', url: '{镜像}/.../download/{tag}/' })` → 检查/下载
- 镜像列表可用环境变量 `UPDATE_MIRRORS` 覆盖;后续建议自建 OSS/CDN(generic 直连镜像根目录)
**状态机与 IPC 契约**(前端 M3 实现时使用):
```
idle → checking → available → downloading → downloaded → quitAndInstall()
└─not-available→ idle └─ error → idle(可重试)
```
`update:status` payload`{ state, manual, version?, currentVersion?, percent?, transferred?, total?, bytesPerSecond?, source?, error? }`
## 15. 更新日志独立页面(2026-08-28
- **独立路由页面** `src/pages/update/index.tsx`route key `update`),不使用设置页 layout
- 顶栏(TitleBar)在 sub 模式下**只显示「返回」+ 页面标题「更新日志」**(routeStore 新增 `titleInBar`
其余页面仍显示品牌名)
- 页面内容:顶部 `VersionCard`,下方 Markdown 渲染当前版本发布说明
(主进程 `update:getReleaseNotes`:GitHub 直连优先 + 加速源兜底,读 release 附件 `release-notes.md`
当前版本无发布说明时回退最新版本并标注)
- **入口**:除 OOBE 与更新日志页本身外,所有 VersionCard 的「检查更新」按钮点击后**跳转到本页**;
在本页内点击则直接执行检查
- **完整下载流程(2026-08-30)**:底部遮罩驱动 —— 检查更新 → 「下载版本更新」→
进度条(百分比/已下载/总大小/速度)+ **暂停/继续/取消**(基于 electron-updater CancellationToken)→
「安装更新」(先写入 installing 状态并 flush 配置,再 quitAndInstall
- **发布说明切换**:默认显示当前版本;检测到可用更新后自动切到最新版本(`getReleaseNotes(v{version})`),
退出重进回到当前版本
- **进度持久化**:每次状态/进度变化写入 `Koring.yml``update`
state/version/percent/transferred/total/source/error);应用启动时清理上次的进行中状态
- 配套改动:发布流水线 `gh release create` 上传 `release-notes.md` 附件
(旧版本发布的 release 无此附件,页面会显示回退/空态)