OpenClaw macOS リリース(Sparkle)

このアプリは現在 Sparkle 自動更新を搭載しています。リリースビルドは Developer ID 署名され、zip 化され、署名された appcast エントリと共に公開される必要があります。

前提条件

  • Developer ID Application 証明書がインストールされている(例: Developer ID Application: <Developer Name> (<TEAMID>))。
  • Sparkle プライベートキーパスが環境変数 SPARKLE_PRIVATE_KEY_FILE として設定されている(Sparkle ed25519 プライベートキーへのパス。公開キーは Info.plist に焼き込まれています)。不足している場合は、~/.profile を確認してください。
  • Gatekeeper セーフな DMG/zip 配布のために xcrun notarytool の公証資格情報(キーチェーンプロファイルまたは API キー)。
    • openclaw-notary という名前のキーチェーンプロファイルを使用します。シェルプロファイル内の App Store Connect API キー環境変数から作成されます:
      • 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"
  • pnpm 依存関係がインストールされている(pnpm install --config.node-linker=hoisted)。
  • Sparkle ツールは SwiftPM 経由で apps/macos/.build/artifacts/sparkle/Sparkle/bin/ に自動的に取得されます(sign_update, generate_appcast など)。

ビルドとパッケージング

注意事項:

  • APP_BUILDCFBundleVersion/sparkle:version にマップされます。数値 + 単調増加を維持してください(-beta なし)。さもないと Sparkle は等しいものとして比較します。
  • デフォルトは現在のアーキテクチャ($(uname -m))です。リリース/ユニバーサルビルドの場合は、BUILD_ARCHS="arm64 x86_64"(または BUILD_ARCHS=all)を設定します。
  • リリースアーティファクト(zip + DMG + 公証)には scripts/package-mac-dist.sh を使用します。ローカル/開発パッケージングには scripts/package-mac-app.sh を使用します。
# リポジトリルートから。Sparkle フィードを有効にするためにリリース ID を設定。
# APP_BUILD は Sparkle 比較のために数値 + 単調増加である必要があります。
BUNDLE_ID=bot.molt.mac \
APP_VERSION=2026.1.27-beta.1 \
APP_BUILD="$(git rev-list --count HEAD)" \
BUILD_CONFIG=release \
SIGN_IDENTITY="Developer ID Application: <Developer Name> (<TEAMID>)" \
scripts/package-mac-app.sh

# 配布用に zip 化(Sparkle デルタサポートのためのリソースフォークを含む)
ditto -c -k --sequesterRsrc --keepParent dist/OpenClaw.app dist/OpenClaw-2026.1.27-beta.1.zip

# オプション: 人間向けにスタイル付き DMG も作成(/Applications にドラッグ)
scripts/create-dmg.sh dist/OpenClaw.app dist/OpenClaw-2026.1.27-beta.1.dmg

# 推奨: ビルド + 公証/ステープル zip + DMG
# まず、一度だけキーチェーンプロファイルを作成:
#   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.1.27-beta.1 \
APP_BUILD="$(git rev-list --count HEAD)" \
BUILD_CONFIG=release \
SIGN_IDENTITY="Developer ID Application: <Developer Name> (<TEAMID>)" \
scripts/package-mac-dist.sh

# オプション: リリースと一緒に dSYM を配布
ditto -c -k --keepParent apps/macos/.build/release/OpenClaw.app.dSYM dist/OpenClaw-2026.1.27-beta.1.dSYM.zip

Appcast エントリ

Sparkle がフォーマットされた HTML ノートをレンダリングできるように、リリースノートジェネレーターを使用します:

SPARKLE_PRIVATE_KEY_FILE=/path/to/ed25519-private-key scripts/make_appcast.sh dist/OpenClaw-2026.1.27-beta.1.zip https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml

CHANGELOG.md から HTML リリースノートを生成し(scripts/changelog-to-html.sh 経由)、appcast エントリに埋め込みます。 公開時にリリースアセット(zip + dSYM)と一緒に更新された appcast.xml をコミットします。

公開と検証

  • OpenClaw-2026.1.27-beta.1.zip(および OpenClaw-2026.1.27-beta.1.dSYM.zip)をタグ v2026.1.27-beta.1 の GitHub リリースにアップロードします。
  • 生の appcast URL が焼き込まれたフィードと一致することを確認: https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml
  • サニティチェック:
    • curl -I https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml が 200 を返す。
    • curl -I <enclosure url> がアセットアップロード後に 200 を返す。
    • 以前の公開ビルドで、About タブから「更新を確認...」を実行し、Sparkle が新しいビルドをクリーンにインストールすることを確認。

完了の定義: 署名されたアプリ + appcast が公開され、古いインストールバージョンから更新フローが機能し、リリースアセットが GitHub リリースに添付されている。