Skip to content

Commit b3a956f

Browse files
committed
docs: distill sparkle release rollout
1 parent 97110c3 commit b3a956f

5 files changed

Lines changed: 34 additions & 22 deletions

File tree

.agents/skills/gettokens-ops-governance/SKILL.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ This skill unifies the procedural rules for working on GetTokens, ensuring consi
3434
## 5. Release Governance
3535
- **Scope**: Current release scope is macOS only.
3636
- **Assets**:
37-
- `GetTokens_darwin_arm64.dmg`
38-
- `GetTokens_darwin_arm64.tar.gz`
39-
- `GetTokens_darwin_amd64.dmg`
40-
- `GetTokens_darwin_amd64.tar.gz`
37+
- `GetTokens_macOS_AppleSilicon.dmg`
38+
- `GetTokens_macOS_AppleSilicon.tar.gz`
39+
- `GetTokens_macOS_Intel.dmg`
40+
- `GetTokens_macOS_Intel.tar.gz`
4141
- `checksums.txt`
4242
- **Versioning**:
4343
- If a release tag has already failed or been consumed, bump to the next patch tag instead of reusing it.
@@ -50,6 +50,10 @@ This skill unifies the procedural rules for working on GetTokens, ensuring consi
5050
- Build `arm64` and `amd64` as separate release jobs; do not collapse them back into a universal DMG workflow.
5151
- After `wails build`, explicitly copy the freshly built sidecar back into `GetTokens.app/Contents/MacOS/cli-proxy-api` before notarization.
5252
- Sign and notarize the `.app` first, then build/sign/notarize the `.dmg`.
53+
- **Sparkle Rule**:
54+
- Sparkle feed must stay split by architecture; do not merge `arm64` and `amd64` DMGs into one appcast when bundle versions are equal.
55+
- `SUFeedURL` must point to the matching per-arch feed: `appcast-arm64.xml` or `appcast-amd64.xml`.
56+
- When `generate_appcast` is used in CI, write appcast output to an explicit staged file path instead of assuming it rewrites the staged seed file in place.
5357
- **CI Hygiene**:
5458
- Keep GitHub Actions dependencies on Node 24 compatible major versions to avoid Node 20 deprecation warnings.
5559
- When a release run fails, inspect the exact failed job logs before changing tag strategy or packaging assumptions.

docs-linhay/dev/20260426-release-prep-guide.md

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,17 +84,19 @@ CI release workflow 需要以下 secrets:
8484
App Store Connect API Key 的 issuer id
8585
6. `MACOS_NOTARY_API_KEY_BASE64`
8686
`AuthKey_<KEY_ID>.p8` 文件内容做 base64 后存入
87-
7. `SPARKLE_FEED_URL`(可选,Sparkle 实验链路)
88-
推荐固定为 `https://raw.githubusercontent.com/AxApp/GetTokens/sparkle-appcast/appcast.xml`
89-
8. `SPARKLE_PUBLIC_ED_KEY`(可选,Sparkle 实验链路)
90-
9. `SPARKLE_PRIVATE_ED_KEY`(可选,Sparkle 实验链路)
87+
7. `SPARKLE_PUBLIC_ED_KEY`(可选,Sparkle 实验链路)
88+
8. `SPARKLE_PRIVATE_ED_KEY`(可选,Sparkle 实验链路)
9189
用于 `generate_appcast` 在 CI 中对 `appcast.xml` 做 EdDSA 签名
90+
9. `SPARKLE_APPCAST_BRANCH`(GitHub Actions variable,推荐固定为 `sparkle-appcast`
9291

9392
补充:
9493

95-
1. 只有在 GitHub Actions variable `SPARKLE_ENABLE=1` 时,release workflow 才会尝试写入 Sparkle metadata、嵌入 `Sparkle.framework`、生成并发布 `appcast.xml`
96-
2. `SPARKLE_APPCAST_BRANCH` 默认为 `sparkle-appcast`,workflow 会把最新 `appcast.xml` 推到该分支,再由 `raw.githubusercontent.com` 提供稳定 feed URL
97-
3. 未启用时,现有 GitHub Release + DMG 发布链路保持不变
94+
1. 只有在 GitHub Actions variable `SPARKLE_ENABLE=1` 时,release workflow 才会尝试写入 Sparkle metadata、嵌入 `Sparkle.framework`、生成并发布 Sparkle feed
95+
2. `SPARKLE_APPCAST_BRANCH` 默认为 `sparkle-appcast`,workflow 会把最新 feed 推到该分支,再由 `raw.githubusercontent.com` 提供稳定 feed URL
96+
3. Sparkle feed 当前按架构拆分:
97+
- arm64: `https://raw.githubusercontent.com/AxApp/GetTokens/sparkle-appcast/appcast-arm64.xml`
98+
- amd64: `https://raw.githubusercontent.com/AxApp/GetTokens/sparkle-appcast/appcast-amd64.xml`
99+
4. 未启用时,现有 GitHub Release + DMG 发布链路保持不变
98100

99101
## 原则
100102
1. 自动升级资产必须可直接解压出目标可执行文件,不能是安装器。
@@ -114,7 +116,7 @@ CI release workflow 需要以下 secrets:
114116
- 安装包资产存在
115117
- updater 资产存在
116118
- `checksums.txt` 包含全部资产
117-
- 若启用 Sparkle:`sparkle-appcast` 分支上的 `appcast.xml` 已更新,且 `SUFeedURL` 指向固定 raw URL
119+
- 若启用 Sparkle:`sparkle-appcast` 分支上的 `appcast-arm64.xml` / `appcast-amd64.xml` 已更新,且 `SUFeedURL` 指向对应架构的 raw URL
118120
- macOS DMG 已经 stapled,`xcrun stapler validate` 通过
119121
7. 使用非 dev 构建验证:
120122
- `CheckUpdate` 能发现新版本

docs-linhay/dev/20260427-macos-sparkle-updater-architecture.md

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ Sparkle 至少需要:
6767
2. bridge 现已改为动态加载 `Sparkle.framework`,不依赖编译期静态链接
6868
3. `wailsapp` 在检测到 Sparkle 可用时,会把 macOS 更新入口切到原生更新 UI 模式
6969
4. 前端设置页已能识别“原生更新 UI”模式,并在该模式下只保留单次“检查更新”入口
70-
5. release workflow 现已支持生成签名后的 `appcast.xml`,并推送到固定分支供 `raw.githubusercontent.com` 托管
70+
5. release workflow 现已支持生成签名后的 Sparkle appcast,并推送到固定分支供 `raw.githubusercontent.com` 托管
7171

7272
当前仍未完成:
7373

@@ -76,17 +76,21 @@ Sparkle 至少需要:
7676

7777
## Secrets / 环境变量建议
7878

79-
1. `SPARKLE_FEED_URL`
80-
2. `SPARKLE_PUBLIC_ED_KEY`
81-
3. `SPARKLE_PRIVATE_ED_KEY`
82-
4. `SPARKLE_APPCAST_BRANCH`(推荐固定为 `sparkle-appcast`
79+
1. `SPARKLE_PUBLIC_ED_KEY`
80+
2. `SPARKLE_PRIVATE_ED_KEY`
81+
3. `SPARKLE_APPCAST_BRANCH`(推荐固定为 `sparkle-appcast`
8382

8483
当前 appcast 发布策略:
8584

8685
1. release 产物继续上传到 GitHub Release
8786
2. `generate_appcast` 只消费 notarized `.dmg`,不消费纯二进制 `.tar.gz`
88-
3. workflow 从既有 `appcast.xml` 增量生成新 feed,并把结果推送到 `sparkle-appcast` 分支
89-
4. `SUFeedURL` 固定指向 `https://raw.githubusercontent.com/AxApp/GetTokens/sparkle-appcast/appcast.xml`
87+
3. workflow 从既有 feed 增量生成新内容,并把结果推送到 `sparkle-appcast` 分支
88+
4. Sparkle feed 按架构拆分:
89+
- `appcast-arm64.xml`
90+
- `appcast-amd64.xml`
91+
5. 构建时按目标架构写入对应 `SUFeedURL`
92+
- `https://raw.githubusercontent.com/AxApp/GetTokens/sparkle-appcast/appcast-arm64.xml`
93+
- `https://raw.githubusercontent.com/AxApp/GetTokens/sparkle-appcast/appcast-amd64.xml`
9094

9195
## 官方要求摘要
9296

@@ -105,6 +109,6 @@ Sparkle 至少需要:
105109
## 当前未完成项
106110

107111
1. Sparkle framework 已支持通过脚本下载并嵌入 app bundle,运行时也已通过动态 bridge 接入,但缺少升级事件回流
108-
2. `appcast.xml` 生成与分支发布链路已接入 workflow,但还没有在真实 release 上启用验证
112+
2. 分架构 appcast 生成与 `sparkle-appcast` 分支发布链路已在真实 release `v0.1.10` 上验证通过
109113
3. 前端设置页已切到“原生更新 UI”识别模式,但仍缺少 Sparkle 状态反馈
110-
4. 还没有真实的 Sparkle 升级回归
114+
4. 真实的 Sparkle 自动升级安装回归还没有做,只验证到了 release / appcast 发布闭环

docs-linhay/memory/2026-04-27.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@
9797
- Sparkle 接入推进(三):新增 `scripts/generate-sparkle-appcast.sh` 与对应测试,release workflow 现在可在 `SPARKLE_ENABLE=1` 时用 Sparkle 官方 `generate_appcast` 基于 notarized `.dmg` 生成签名后的 `appcast.xml`,并推送到 `sparkle-appcast` 分支供 `raw.githubusercontent.com` 托管稳定 feed。
9898
- Sparkle 正式 release 首次回归(`v0.1.7`)失败点已定位:仅 `macOS amd64``Embed Sparkle framework` 阶段拿到损坏的 Sparkle zip(约 55 KB HTML/错误页),不是 framework 集成本身失败;已把 `scripts/prepare-sparkle-framework.sh` 改成 `curl --fail --retry --retry-all-errors` 并在下载后执行 `unzip -tq` 校验,不合法则重试。
9999
- Sparkle 正式 release 第二次回归(`v0.1.8`)失败点已定位:`Publish Sparkle appcast` 不能把 `arm64``amd64` 两个同版本 DMG 放进同一个 appcast,Sparkle 会判定为 duplicate updates;发布链已改成分架构 feed,分别生成 `appcast-arm64.xml``appcast-amd64.xml`,构建时按目标架构写入对应 `SUFeedURL`
100+
- Sparkle 正式 release 第三次回归(`v0.1.9`)失败点已定位:`generate_appcast` 实际把输出写到了 `-o` 指定路径,但脚本仍按旧假设去临时目录里 `cp` staged appcast,导致 `Publish Sparkle appcast``No such file or directory` 失败;已在 `scripts/generate-sparkle-appcast.sh` 中把输出改成显式写入 staged 绝对路径,并补了测试。
101+
- Sparkle 正式 release 第四次回归(`v0.1.10`,run `24979794016`)已全绿完成:两条 macOS 构建、分架构 appcast 发布和 GitHub Release 均成功,正式资产为 `GetTokens_macOS_AppleSilicon.*``GetTokens_macOS_Intel.*``checksums.txt``sparkle-appcast` 分支已落地 `appcast-arm64.xml` / `appcast-amd64.xml`
100102

101103
## Wails Window Drag Region
102104
- 当前窗口拖不动的根因已确认:`main.go` 启用了 `mac.TitleBarHiddenInset()`,但前端此前没有任何 `--wails-draggable` 区域,导致 macOS 将整个壳层视为普通 Web 内容。

docs-linhay/spaces/20260427-macos-sparkle-updater/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,4 @@ Sparkle 是 macOS 上成熟的原生更新框架,更适合 GetTokens 当前的
8181
## 当前状态
8282
- 状态:in-progress
8383
- 最近更新:2026-04-27
84-
- 最近变更:已完成 Sparkle space / 架构文档 / plist 注入脚本 / framework 下载与嵌入脚本 / darwin bridge / 设置页原生更新入口适配;release workflow 现已支持通过 `SPARKLE_ENABLE=1` 生成并发布签名后的 `appcast.xml``sparkle-appcast` 分支,但还没有做真实 release 回归
84+
- 最近变更:已完成 Sparkle space / 架构文档 / plist 注入脚本 / framework 下载与嵌入脚本 / darwin bridge / 设置页原生更新入口适配;`v0.1.10` 已完成首轮真实 Sparkle release 回归,release workflow 可在 `SPARKLE_ENABLE=1` 时生成并发布分架构 feed `appcast-arm64.xml` / `appcast-amd64.xml` `sparkle-appcast` 分支。

0 commit comments

Comments
 (0)