|
| 1 | +# 发版指南 |
| 2 | + |
| 3 | +## 前置条件 |
| 4 | + |
| 5 | +### GitHub Secrets |
| 6 | + |
| 7 | +需要在仓库的 **Prod** 环境中配置以下 Secrets(`Settings > Environments > Prod`): |
| 8 | + |
| 9 | +| Secret | 说明 | |
| 10 | +|--------|------| |
| 11 | +| `SPARKLE_ED_PUBLIC_KEY` | Sparkle 更新验证用的 Ed25519 公钥 | |
| 12 | +| `SPARKLE_ED_PRIVATE_KEY` | 签名 appcast 条目用的 Ed25519 私钥 | |
| 13 | + |
| 14 | +使用 Sparkle 的 `generate_keys` 工具生成密钥对: |
| 15 | + |
| 16 | +```bash |
| 17 | +# 从 Sparkle release 压缩包中执行 |
| 18 | +./bin/generate_keys |
| 19 | +``` |
| 20 | + |
| 21 | +## 通过 Git Tag 发版(推荐) |
| 22 | + |
| 23 | +推送 semver tag 即可触发 CI 自动构建、签名并发布。 |
| 24 | + |
| 25 | +```bash |
| 26 | +# 1. 确保在 main 分支且代码最新 |
| 27 | +git checkout main && git pull |
| 28 | + |
| 29 | +# 2. 创建并推送 tag |
| 30 | +git tag v0.2.0 |
| 31 | +git push origin v0.2.0 |
| 32 | +``` |
| 33 | + |
| 34 | +CI 会自动完成以下步骤: |
| 35 | +1. 构建 Release archive |
| 36 | +2. 生成 ZIP 和 DMG |
| 37 | +3. 下载 Sparkle CLI 工具(版本自动匹配 `Package.resolved`) |
| 38 | +4. 生成 `appcast.xml`(保留历史版本记录) |
| 39 | +5. 创建 **已发布** 的 GitHub Release,包含 ZIP、DMG 和 `appcast.xml` |
| 40 | + |
| 41 | +## 手动触发(测试用) |
| 42 | + |
| 43 | +通过 Actions 页面的 `workflow_dispatch` 进行测试构建: |
| 44 | + |
| 45 | +1. 前往 **Actions > Release > Run workflow** |
| 46 | +2. 可选填版本号(默认为 `0.0.0-dev`) |
| 47 | +3. 点击 **Run workflow** |
| 48 | + |
| 49 | +手动触发会创建 **draft** release。Draft release 不会影响 `releases/latest` URL,因此现有用户不会通过 Sparkle 自动更新收到测试版本。 |
| 50 | + |
| 51 | +## Sparkle 自动更新原理 |
| 52 | + |
| 53 | +1. 应用的 `Info.plist` 中 `SUFeedURL` 指向: |
| 54 | + ``` |
| 55 | + https://github.com/yusixian/MoePeek/releases/latest/download/appcast.xml |
| 56 | + ``` |
| 57 | +2. GitHub 的 `releases/latest/download/{asset}` 会重定向到最新 **非 draft** release 的资源文件 |
| 58 | +3. Sparkle 拉取 `appcast.xml`,比对版本号,如有更新则提示用户 |
| 59 | +4. 用户直接从 GitHub Releases 下载 ZIP 安装 |
| 60 | + |
| 61 | +## 常见问题 |
| 62 | + |
| 63 | +### Gatekeeper 阻止打开应用 |
| 64 | + |
| 65 | +由于应用未经公证(notarize),macOS Gatekeeper 可能在首次启动时阻止运行: |
| 66 | + |
| 67 | +1. 右键点击应用 > **打开**(仅对该应用绕过 Gatekeeper) |
| 68 | +2. 或前往 `系统设置 > 隐私与安全性` > 点击 **仍要打开** |
| 69 | + |
| 70 | +### Release 中缺少 appcast.xml |
| 71 | + |
| 72 | +- 检查 Prod 环境中是否已设置 `SPARKLE_ED_PRIVATE_KEY` |
| 73 | +- 查看 Actions 日志中 "Generate appcast" 步骤是否有报错 |
| 74 | + |
| 75 | +### Sparkle 未检测到更新 |
| 76 | + |
| 77 | +- 确认 release 不是 draft(draft release 不包含在 `latest` 中) |
| 78 | +- 检查 `Project.swift` 中 `SUFeedURL` 是否指向正确的 URL |
| 79 | +- 确认最新 release 中包含 `appcast.xml` 资源文件 |
0 commit comments