macOS 包更新

打了 tag 的 macOS 包使用 electron-updater。内置与 Light 印记都标明该属主。Stable 与 canary 是独立的应用身份;各自在其烘焙好的频道内更新。开发与 bootstrap 安装保留 checkout 更新。

一次性构建携带 source: commit-build,没有更新器。其包身份含短 commit SHA,因此不同 commit 构建可以共存。检查与应用请求都会说明开发者必须提供新构建。这适用于桌面应用及其内置 CLI,而不适用于桌面应用连接的某个无关远程后端。

Feed 契约

频道登记位于 R2 的 releases/channels/NAME.json,而非签入仓库的频道映射。频道包在选择不可变原生 feed 之前,先解析该记录及其摘要绑定的构建清单。准入的请求跨构建保持应用身份稳定,并把源 commit 与递增的原生包版本分开记录。

既有打 tag 客户端保留其原生 feed URL。通用的 apps/desktop/update-feed.cjs 适配器计算这些遗留路径;它不注册频道。构建器把遗留 URL 写入 app-update.yml;updates.desktop_feed_base_url 可提供显式 bucket base URL。

  • Stable:releases/darwin/stable/stable-mac.yml
  • Canary:releases/darwin/canary/canary-mac.yml
  • Light:在 darwin/ 与频道之间带 light/ 的相同路径。
  • 制品:releases/tag/TAG/FILENAME,被下载链接与 feed 共享。
  • 频道构建制品与原生元数据:releases/channel-builds/BUILD_ID/。

退役与原生更新是不同操作:旧频道指向一个合格的官方目的地,而不是其自身原生 feed 里另一个名字不同的包。显式迁移动作必须保留用户状态并在移除预览应用前验证目的地就绪。让合格接收方清单保持不可变,可让一个离线预览在目的地频道已推进后迁移;此后目的地拥有更新。

当前工作流在 ARM64 与 Intel runner 上构建内置变体。Light 有独立的客户端/feed 路由,但本次改动中没有发布矩阵分支。

python -m scripts.releases.r2 finalize 要求每个架构一个元数据文件,名为 arm64-CHANNEL-mac.yml 与 x64-CHANNEL-mac.yml。它拒绝错误的版本、变体、架构、哈希与不一致的遗留路径字段。每个被引用的 ZIP/DMG 被流式拉回并对照其 SHA-512 与大小校验。发布检查线上版本,有条件地替换其 ETag,并回读生成的 feed。同 tag 的 macOS 制品不能用不同字节覆盖。可变 feed 使用 Cache-Control: no-store。Canary 保留保护线上 feed 引用的制品与 blockmap。不可读的 feed 阻止清理。

客户端生命周期

检查绝不自动下载。应用重新检查发布、下载它,并等待 Squirrel.Mac 接受已签名应用。只有这时 Hermes 才停止其应用自有的后端并请求安装/重启。无关的退出不触发安装。下载与原生校验失败让后端保持运行。并发检查不能替换一次应用操作的目标。既有 checkout 更新器绝不改动已签名的 app bundle。

发布环境

既有 release-signing 环境提供:

  • CSC_LINK 与 CSC_KEY_PASSWORD:Developer ID Application 签名身份。
  • APPLE_API_KEY_P8、APPLE_API_KEY_ID、APPLE_API_ISSUER:公证。
  • CLOUDFLARE_R2_ACCOUNT_ID、CLOUDFLARE_R2_ACCESS_KEY_ID、 CLOUDFLARE_R2_SECRET_ACCESS_KEY:bucket 访问机密。
  • CLOUDFLARE_R2_BUCKET、CLOUDFLARE_R2_PUBLIC_URL:仓库/环境变量。

发布需要 Apple 凭据。既有 after-sign 钩子负责公证,因此 electron-builder 的第二条公证路径被禁用。发布门校验签名、装订票据与 Gatekeeper 评估。Darwin 发布作业等待两个原生构建并序列化频道写入。

验证局限

辅助测试演练策略、原生事件顺序、feed 校验、条件发布与保留。它们不是已签名安装或真实应用替换的证明。

原生 macOS 打包更新驱动是既有安装/更新族的一部分。稳定门要求两个架构上都有已签名包迁移。每个验收主张都需要针对确切的旧/新包对成功的原生运行。工作流定义与历史辅助结果不构成对当前 head 的验收。见 PM 审计状态了解有范围的回执。