可验证的 macOS 更新

macOS 版本用 Sparkle 2。启动时以及每天一次,App 会检查挂在最新非预发布 GitHub Release 上的一个 XML appcast。appcast 声明了可用版本和可下载的产物

当前的 Agent Island 状态界面运行在 macOS 菜单栏里
当前的 macOS 状态界面始终在本地,签名过的更新则通过公开的 Sparkle appcast 抵达

一条公开的源

https://github.com/tristan666666/agent-island/releases/latest/download/appcast.xml

GitHub 会把这个稳定地址重定向到最新公开版本上的 appcast 资源。这样已安装的版本就不必依赖某个带版本号的地址

签名才是那条边界

光有一个下载地址是不够的。Sparkle 用 App 内置的公钥对每一次更新做 EdDSA 签名校验。没有配套的私钥,被重定向或被替换掉的地址产生不出一个有效更新

私钥应该待在维护者的钥匙串或者发布流水线的密钥里,永远不进仓库。弄丢它在运维上是很严重的事,因为已装机的版本信任的正是那个内置公钥

一次发布怎么抵达一台已装机

  1. 版本号提升并打 tag
  2. 发布流水线构建并签名 macOS 产物
  3. 流水线生成对应的 appcast
  4. 两个产物都挂到公开发布上
  5. 已安装的 App 检查这条源,安装前先校验签名

手动检查仍然重要

App 在设置里提供手动检查更新。维护者也可以在本地跑发布脚本,在打 tag 之前先检视尚未发布的 DMG 和 appcast

这条更新路径适用于 macOS 版本。Windows 打包走它自己的发布路径

← 全部文章