macOS 发布(Sparkle 自动更新)
本应用现已集成 Sparkle 自动更新。发布构建必须使用 Developer ID 签名、压缩,并发布带有签名的 appcast 条目。
前置条件
已安装 Developer ID Application 证书(例如:
Developer ID Application: <你的名称> (<TeamID>))。Sparkle 私钥路径设置在环境变量
SPARKLE_PRIVATE_KEY_FILE中(指向你的 Sparkle ed25519 私钥的路径;公钥已嵌入 Info.plist)。如果缺失,请检查~/.profile。如果你需要 Gatekeeper 安全的 DMG/zip 分发,需要配置公证凭据(keychain profile 或 API key)用于
xcrun notarytool。我们使用名为
openclaw-notary的 Keychain profile,从 shell profile 中的 App Store Connect API key 环境变量创建:APP_STORE_CONNECT_API_KEY_P8、APP_STORE_CONNECT_KEY_ID、APP_STORE_CONNECT_ISSUER_ID
bashecho "$APP_STORE_CONNECT_API_KEY_P8" | sed 's/\\n/\n/g' > /tmp/openclaw-notary.p8 xcrun notarytool store-credentials "openclaw-notary" \ --key /tmp/openclaw-notary.p8 \ --key-id "$APP_STORE_CONNECT_KEY_ID" \ --issuer "$APP_STORE_CONNECT_ISSUER_ID"已安装
pnpm依赖(pnpm install --config.node-linker=hoisted)。Sparkle 工具通过 SwiftPM 自动获取,位于
apps/macos/.build/artifacts/sparkle/Sparkle/bin/(sign_update、generate_appcast等)。
构建和打包
注意事项:
APP_BUILD映射到CFBundleVersion/sparkle:version;保持其为数字且单调递增(不要用-beta),否则 Sparkle 会将其比较为相等。- 如果省略
APP_BUILD,scripts/package-mac-app.sh会从APP_VERSION派生一个 Sparkle 安全的默认值(YYYYMMDDNN:稳定版默认为90,预发布版使用后缀派生的通道),并使用该值和 git 提交计数中较大的那个。 - 你仍然可以在发布工程需要特定单调值时显式覆盖
APP_BUILD。 - 默认为当前架构(
$(uname -m))。对于发布/通用构建,设置BUILD_ARCHS="arm64 x86_64"(或BUILD_ARCHS=all)。 - 使用
scripts/package-mac-dist.sh生成发布产物(zip + DMG + 公证)。使用scripts/package-mac-app.sh进行本地/开发打包。
# 从仓库根目录运行;设置发布 ID 以启用 Sparkle feed。
# APP_BUILD 必须为数字且单调递增供 Sparkle 比较。
# 省略时从 APP_VERSION 自动派生。
BUNDLE_ID=ai.openclaw.mac \
APP_VERSION=2026.3.2 \
BUILD_CONFIG=release \
SIGN_IDENTITY="Developer ID Application: <你的名称> (<TeamID>)" \
scripts/package-mac-app.sh
# 压缩分发(包含资源分叉供 Sparkle delta 支持)
ditto -c -k --sequesterRsrc --keepParent dist/OpenClaw.app dist/OpenClaw-2026.3.2.zip
# 可选:构建适合用户的样式化 DMG(拖拽到 /Applications)
scripts/create-dmg.sh dist/OpenClaw.app dist/OpenClaw-2026.3.2.dmg
# 推荐:构建 + 公证/staple zip + DMG
# 首先创建一次 keychain profile:
# xcrun notarytool store-credentials "openclaw-notary" \
# --apple-id "<邮箱>" --team-id "<TeamID>" --password "<密码>"
NOTARIZE=1 NOTARYTOOL_PROFILE=openclaw-notary \
BUNDLE_ID=ai.openclaw.mac \
APP_VERSION=2026.3.2 \
BUILD_CONFIG=release \
SIGN_IDENTITY="Developer ID Application: <你的名称> (<TeamID>)" \
scripts/package-mac-dist.sh
# 可选:随发布附带 dSYM
ditto -c -k --keepParent apps/macos/.build/release/OpenClaw.app.dSYM dist/OpenClaw-2026.3.2.dSYM.zipAppcast 条目
使用发布说明生成器让 Sparkle 渲染格式化的 HTML 说明:
SPARKLE_PRIVATE_KEY_FILE=/path/to/ed25519-private-key \
scripts/make_appcast.sh dist/OpenClaw-2026.3.2.zip \
https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml从 CHANGELOG.md 生成 HTML 发布说明(通过 scripts/changelog-to-html.sh)并嵌入到 appcast 条目中。发布时将更新的 appcast.xml 与发布资源(zip + dSYM)一起提交。
发布和验证
- 将
OpenClaw-2026.3.2.zip(和OpenClaw-2026.3.2.dSYM.zip)上传到标签v2026.3.2的 GitHub release。 - 确保原始 appcast URL 与嵌入的 feed 匹配:
https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml。 - 健全性检查:
curl -I https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml返回 200。- 资产上传后
curl -I <asset_url>返回 200。 - 在之前的公开构建上,从 About 标签运行"Check for Updates..."并验证 Sparkle 干净地安装了新构建。
完成定义:签名应用 + appcast 已发布,从旧安装版本的更新流程正常工作,发布资产已附加到 GitHub release。
