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、产品名、安装目录规则及用户数据位置。
上传顺序
- 在隔离测试环境完成两个版本的签名升级演练。
- 上传
dist中的版本化.exe和.blockmap,保留旧版本文件供差分请求使用。 - 检查 HTTPS、文件大小及 Range 响应;安装包使用不可变文件名并允许长期缓存。
- 最后上传
latest.yml,配置重新验证或禁止缓存,避免 CDN 长时间保留旧清单。 - 在已安装上一正式版本的机器上检查、下载并确认安装。
更新源采用静态文件,不需要修改或重启同步服务;客户端更新需要重启应用。 对象存储部署、CDN 配置和上传自动化由发布环境负责,本次不包含这些基础设施。
验证与故障处置
- 自动化验证覆盖任务合并、下载失败及重试、无新版、禁用构建、签名拒绝、退出取消和安装时机。
npm run test:smoke:app-update检查真实菜单及页面入口。- 发布前必须实测:
- 两个真实签名 NSIS 版本之间的升级和重启。
- 多窗口未保存笔记、设置、恢复稿和笔记库在升级后保留。
- 差分下载流量、全量回退、断网恢复、无效签名与安装启动失败。
- 测试日志支持
MYNOTE_TEST_DIAGNOSTICS=1;已知 libpng 警告继续由现有测试运行器过滤。 - 出现问题时先撤回问题版本清单,再发布版本号更高的修复版本。
- 不自动降级,也不回滚用户数据;保留可手动安装的旧包用于人工恢复。
- 尚无真实签名证书和更新源时,仅能完成代码与测试包验证,不能视为正式升级链路验收通过。
