Компаньон-приложение для macOS
Релиз для macOS
Это приложение теперь поставляется с автообновлениями Sparkle. Релизные сборки должны быть подписаны Developer ID, заархивированы и опубликованы с подписанной записью в appcast.
Предварительные требования
- Установлен сертификат Developer ID Application (пример:
Developer ID Application: <Developer Name> (<TEAMID>)). - Путь к приватному ключу Sparkle задан в переменной окружения как
SPARKLE_PRIVATE_KEY_FILE(путь к вашему приватному ключу ed25519 для Sparkle; публичный ключ встроен в Info.plist). Если он отсутствует, проверьте~/.profile. - Учётные данные для нотаризации (профиль Keychain или API-ключ) для
xcrun notarytool, если требуется распространение DMG/zip, безопасное для Gatekeeper.- Мы используем профиль Keychain с именем
openclaw-notary, созданный из переменных окружения API-ключа App Store Connect в вашем профиле оболочки:APP_STORE_CONNECT_API_KEY_P8,APP_STORE_CONNECT_KEY_ID,APP_STORE_CONNECT_ISSUER_IDecho "$APP_STORE_CONNECT_API_KEY_P8" | sed 's/\\n/\n/g' > /tmp/openclaw-notary.p8xcrun notarytool store-credentials "openclaw-notary" --key /tmp/openclaw-notary.p8 --key-id "$APP_STORE_CONNECT_KEY_ID" --issuer "$APP_STORE_CONNECT_ISSUER_ID"
- Мы используем профиль Keychain с именем
- Установлены зависимости
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вычисляет безопасное для Sparkle значение по умолчанию изAPP_VERSION(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для локальной/разработческой упаковки.
# Из корня репозитория; задайте идентификаторы релиза, чтобы включить ленту Sparkle.
# APP_BUILD должен быть числовым и монотонным для сравнения в Sparkle.
# По умолчанию вычисляется автоматически из APP_VERSION, если опущено.
BUNDLE_ID=ai.openclaw.mac \
APP_VERSION=2026.3.7 \
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.3.7.zip
# Опционально: также создайте стилизованный DMG для пользователей (перетащить в /Applications)
scripts/create-dmg.sh dist/OpenClaw.app dist/OpenClaw-2026.3.7.dmg
# Рекомендуется: сборка + нотаризация/скрепление zip + DMG
# Сначала создайте профиль Keychain один раз:
# 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=ai.openclaw.mac \
APP_VERSION=2026.3.7 \
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.3.7.dSYM.zip
Запись в Appcast
Используйте генератор примечаний к релизу, чтобы Sparkle отображал форматированные HTML-примечания:
SPARKLE_PRIVATE_KEY_FILE=/path/to/ed25519-private-key scripts/make_appcast.sh dist/OpenClaw-2026.3.7.zip https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml
Генерирует HTML-примечания к релизу из CHANGELOG.md (через scripts/changelog-to-html.sh) и встраивает их в запись appcast. Зафиксируйте обновлённый appcast.xml вместе с релизными артефактами (zip + dSYM) при публикации.
Публикация и проверка
- Загрузите
OpenClaw-2026.3.7.zip(иOpenClaw-2026.3.7.dSYM.zip) в релиз GitHub для тегаv2026.3.7. - Убедитесь, что сырой URL appcast соответствует встроенной ленте:
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.