macOS 版本用 Sparkle 2。启动时以及每天一次,App 会检查挂在最新非预发布 GitHub Release 上的一个 XML appcast。appcast 声明了可用版本和可下载的产物
一条公开的源
https://github.com/tristan666666/agent-island/releases/latest/download/appcast.xml
GitHub 会把这个稳定地址重定向到最新公开版本上的 appcast 资源。这样已安装的版本就不必依赖某个带版本号的地址
签名才是那条边界
光有一个下载地址是不够的。Sparkle 用 App 内置的公钥对每一次更新做 EdDSA 签名校验。没有配套的私钥,被重定向或被替换掉的地址产生不出一个有效更新
私钥应该待在维护者的钥匙串或者发布流水线的密钥里,永远不进仓库。弄丢它在运维上是很严重的事,因为已装机的版本信任的正是那个内置公钥
一次发布怎么抵达一台已装机
- 版本号提升并打 tag
- 发布流水线构建并签名 macOS 产物
- 流水线生成对应的 appcast
- 两个产物都挂到公开发布上
- 已安装的 App 检查这条源,安装前先校验签名
手动检查仍然重要
App 在设置里提供手动检查更新。维护者也可以在本地跑发布脚本,在打 tag 之前先检视尚未发布的 DMG 和 appcast
这条更新路径适用于 macOS 版本。Windows 打包走它自己的发布路径
← 全部文章