Chuyển đến nội dung chính

Phát hành OpenClaw macOS (Sparkle)

This app now ships Sparkle auto-updates. Các bản build phát hành phải được ký Developer ID, nén zip và phát hành kèm một mục appcast đã ký.

Điều kiện tiên quyết

  • Đã cài đặt chứng chỉ Developer ID Application (ví dụ: Developer ID Application: <Developer Name> (<TEAMID>)).
  • Đường dẫn khóa riêng Sparkle được đặt trong môi trường dưới dạng SPARKLE_PRIVATE_KEY_FILE (đường dẫn tới khóa riêng ed25519 của Sparkle; khóa công khai được nhúng trong Info.plist). Mặc định theo kiến trúc hiện tại ($(uname -m)).
  • Thông tin xác thực Notary (hồ sơ keychain hoặc khóa API) cho xcrun notarytool nếu bạn muốn phân phối DMG/zip an toàn với Gatekeeper.
    • Chúng tôi dùng một hồ sơ Keychain tên openclaw-notary, được tạo từ các biến môi trường khóa API App Store Connect trong shell profile của bạn:
      • APP_STORE_CONNECT_API_KEY_P8, APP_STORE_CONNECT_KEY_ID, APP_STORE_CONNECT_ISSUER_ID
      • echo "$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"
  • Đã cài các phụ thuộc pnpm (pnpm install --config.node-linker=hoisted).
  • Công cụ Sparkle được tải tự động qua SwiftPM tại apps/macos/.build/artifacts/sparkle/Sparkle/bin/ (sign_update, generate_appcast, v.v.).

Build & đóng gói

Ghi chú:
  • APP_BUILD ánh xạ tới CFBundleVersion/sparkle:version; hãy giữ dạng số và tăng dần (không có -beta), nếu không Sparkle sẽ so sánh là bằng nhau.
  • Mặc định theo kiến trúc hiện tại ($(uname -m)). Đối với các bản build release/universal, đặt BUILD_ARCHS="arm64 x86_64" (hoặc BUILD_ARCHS=all).
  • Sử dụng scripts/package-mac-app.sh cho đóng gói local/dev. Sử dụng scripts/package-mac-app.sh để đóng gói cục bộ/dev.
# From repo root; set release IDs so Sparkle feed is enabled.
# APP_BUILD must be numeric + monotonic for Sparkle compare.
BUNDLE_ID=bot.molt.mac \
APP_VERSION=2026.2.9 \
APP_BUILD="$(git rev-list --count HEAD)" \
BUILD_CONFIG=release \
SIGN_IDENTITY="Developer ID Application: <Developer Name> (<TEAMID>)" \
scripts/package-mac-app.sh

# Zip for distribution (includes resource forks for Sparkle delta support)
ditto -c -k --sequesterRsrc --keepParent dist/OpenClaw.app dist/OpenClaw-2026.2.9.zip

# Optional: also build a styled DMG for humans (drag to /Applications)
scripts/create-dmg.sh dist/OpenClaw.app dist/OpenClaw-2026.2.9.dmg

# Recommended: build + notarize/staple zip + DMG
# First, create a keychain profile once:
#   xcrun notarytool store-credentials "openclaw-notary" \
#     --apple-id "<apple-id>" --team-id "<team-id>" --password "<app-specific-password>"
NOTARIZE=1 NOTARYTOOL_PROFILE=openclaw-notary \
BUNDLE_ID=bot.molt.mac \
APP_VERSION=2026.2.9 \
APP_BUILD="$(git rev-list --count HEAD)" \
BUILD_CONFIG=release \
SIGN_IDENTITY="Developer ID Application: <Developer Name> (<TEAMID>)" \
scripts/package-mac-dist.sh

# Optional: ship dSYM alongside the release
ditto -c -k --keepParent apps/macos/.build/release/OpenClaw.app.dSYM dist/OpenClaw-2026.2.9.dSYM.zip

Mục appcast

Dùng trình tạo ghi chú phát hành để Sparkle hiển thị ghi chú HTML được định dạng:
SPARKLE_PRIVATE_KEY_FILE=/path/to/ed25519-private-key scripts/make_appcast.sh dist/OpenClaw-2026.2.9.zip https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml
Tạo release notes HTML từ CHANGELOG.md (thông qua scripts/changelog-to-html.sh) và nhúng chúng vào mục appcast. Luồng này cho phép ứng dụng macOS hoạt động như một điều khiển từ xa đầy đủ cho một gateway OpenClaw chạy trên host khác (desktop/server).

Xuất bản & xác minh

  • Upload OpenClaw-2026.2.9.zip (and OpenClaw-2026.2.9.dSYM.zip) to the GitHub release for tag v2026.2.9.
  • Đảm bảo URL appcast raw khớp với feed đã nhúng: https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml.
  • Kiểm tra nhanh:
    • curl -I https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml trả về 200.
    • curl -I <enclosure url> trả về 200 sau khi tải lên tài sản.
    • Trên một bản public trước đó, chạy “Check for Updates…” từ thẻ About và xác minh Sparkle cài đặt bản build mới sạch sẽ.
Định nghĩa hoàn tất: ứng dụng đã ký + appcast được xuất bản, luồng cập nhật hoạt động từ một phiên bản cũ đã cài đặt, và các tài sản phát hành được đính kèm vào bản phát hành GitHub.