Uninote
Uninote
用户根目录
brdr
common
programming
docs
tests
后端试题
问题讨论

Windows 自动更新与发布

支持范围与用户行为

  • 第一版支持 Windows x64 NSIS 安装版,使用 electron-builder 26 与固定版本 electron-updater 6.8.12。
  • 普通 pack、dist:win 测试产物、开发运行及 macOS 不开启更新。
  • 正式安装版启动 30 秒后检查,此后每 6 小时检查一次;多个窗口共享检查和下载任务。
  • 只接收更高版本的稳定版,不自动降级。
  • 发现新版后后台下载,完成后显示可点击通知。
  • 帮助菜单及命令面板提供“检查应用更新”和“重启并安装更新”。
    • app.checkUpdate:检查并自动下载,显示当前版本、下载进度或错误。
    • app.installUpdate:确认后保存会话、恢复稿并重启安装;尚未下载时说明当前状态。
  • 下载完成不代表立即安装,普通退出不会触发安装。
  • 更新前复用各窗口的 P2P、录音与恢复稿关闭流程。
    • 取消退出会撤销安装意图,保留已经下载的安装包。
    • 会话或恢复稿保存失败时中止更新,不自动选择丢弃草稿。
    • 等待后台清理、锁释放和日志落盘后才启动安装器。
    • 安装器启动失败时记录完整错误并重新打开当前应用;安装器启动后的失败由安装器报告。

差分下载

  • 每次发布完整安装包、对应 .blockmap 和 latest.yml。
  • updater 在条件满足时差分下载,再还原完整新安装包。
  • 旧安装包缓存不可用、Range 请求不受支持或差分失败时回退全量下载。
  • 安装仍使用完整 NSIS 安装包,不直接修补应用目录中的程序文件。
  • 初次接入自动更新的版本需要用户手动安装;旧版没有更新入口。

正式构建

准备条件

  • 在 Windows 上安装依赖,使用项目要求的 Node.js 版本。
  • 准备支持 HTTPS 与 HTTP Range 的静态存储或 CDN 目录。
  • 获取可信 Windows 代码签名证书;私钥、密码和上传凭证不能提交到仓库。
  • 配置 electron-builder 标准签名环境变量 CSC_LINK 和 CSC_KEY_PASSWORD。
  • 清除测试 CI 使用的 CSC_IDENTITY_AUTO_DISCOVERY=false,按签名提供方要求准备构建环境。
  • 从签名证书读取完整 Subject 字符串作为发布者身份,必须与 PowerShell 返回值完全一致。
    • 例如 Get-AuthenticodeSignature -LiteralPath '<已签名程序路径>' 的 SignerCertificate.Subject。
    • 证书更新时保持发布者 Subject;更改身份前必须设计迁移,不直接替换更新源中的签名身份。

构建命令

先更新 package.json 与锁文件中的版本号,再在 PowerShell 中执行:

$env:MYNOTE_UPDATE_URL = 'https://downloads.example.com/windows/x64/stable/'
$env:MYNOTE_PUBLISHER_SUBJECT = 'CN=实际发布者, O=实际组织, C=CN'
npm run dist:win:release
  • 上述域名和 Subject 是示例,必须替换成实际发布配置。
  • 发布脚本强制签名,配置缺失或没有可用签名身份时构建失败。
  • 更新源和发布者身份写入发布包元数据;页面不能修改更新源或传入执行路径。
  • updater 校验下载内容哈希,应用额外检查 Authenticode 签名可信性与完整发布者 Subject。
  • 缓存命中以及最终安装前也重新验签;PowerShell 不可用、验签超时、目录签名或身份不匹配均拒绝安装。
  • 正式包保持已有应用 ID、产品名、安装目录规则及用户数据位置。

上传顺序

  1. 在隔离测试环境完成两个版本的签名升级演练。
  2. 上传 dist 中的版本化 .exe 和 .blockmap,保留旧版本文件供差分请求使用。
  3. 检查 HTTPS、文件大小及 Range 响应;安装包使用不可变文件名并允许长期缓存。
  4. 最后上传 latest.yml,配置重新验证或禁止缓存,避免 CDN 长时间保留旧清单。
  5. 在已安装上一正式版本的机器上检查、下载并确认安装。

更新源采用静态文件,不需要修改或重启同步服务;客户端更新需要重启应用。 对象存储部署、CDN 配置和上传自动化由发布环境负责,本次不包含这些基础设施。

验证与故障处置

  • 自动化验证覆盖任务合并、下载失败及重试、无新版、禁用构建、签名拒绝、退出取消和安装时机。
  • npm run test:smoke:app-update 检查真实菜单及页面入口。
  • 发布前必须实测:
    • 两个真实签名 NSIS 版本之间的升级和重启。
    • 多窗口未保存笔记、设置、恢复稿和笔记库在升级后保留。
    • 差分下载流量、全量回退、断网恢复、无效签名与安装启动失败。
  • 测试日志支持 MYNOTE_TEST_DIAGNOSTICS=1;已知 libpng 警告继续由现有测试运行器过滤。
  • 出现问题时先撤回问题版本清单,再发布版本号更高的修复版本。
  • 不自动降级,也不回滚用户数据;保留可手动安装的旧包用于人工恢复。
  • 尚无真实签名证书和更新源时,仅能完成代码与测试包验证,不能视为正式升级链路验收通过。

voice-module-extraction-followup

README

点赞(0) 阅读(11) 举报
目录
标题