OpenClaw macOS 릴리스 (Sparkle)
이 앱은 Sparkle 자동 업데이트를 제공합니다. 릴리스 빌드는 Developer ID로 서명되고, 압축되며, 서명된 appcast 항목과 함께 게시되어야 합니다.
사전 요구 사항
- Developer ID Application 인증서 설치 (예:
Developer ID Application: <Developer Name> (<TEAMID>)). - Sparkle 비공개 키 경로를 환경 변수
SPARKLE_PRIVATE_KEY_FILE로 설정 (Sparkle ed25519 비공개 키 경로; 공개 키는 Info.plist에 내장). 없으면~/.profile을 확인하세요. xcrun notarytool을 위한 공증 자격 증명 (키체인 프로필 또는 API 키). Gatekeeper 호환 DMG/zip 배포용.openclaw-notary라는 키체인 프로필을 사용하며, 셸 프로필의 App Store Connect API 키 환경 변수에서 생성: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"
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를 명시적으로 오버라이드할 수 있습니다. BUILD_CONFIG=release의 경우,scripts/package-mac-app.sh가 자동으로 유니버설(arm64 x86_64)로 기본 설정됩니다.BUILD_ARCHS=arm64또는BUILD_ARCHS=x86_64로 오버라이드할 수 있습니다. 로컬/개발 빌드(BUILD_CONFIG=debug)에서는 현재 아키텍처($(uname -m))로 기본 설정됩니다.- 릴리스 아티팩트(zip + DMG + 공증)에는
scripts/package-mac-dist.sh를 사용하세요. 로컬/개발 패키징에는scripts/package-mac-app.sh를 사용하세요.
# 리포지토리 루트에서; Sparkle 피드 활성화를 위해 릴리스 ID를 설정합니다.
# 이 명령은 공증 없이 릴리스 아티팩트를 빌드합니다.
# APP_BUILD는 Sparkle 비교를 위해 숫자 + 단조 증가여야 합니다.
# 생략 시 APP_VERSION에서 자동 생성됩니다.
SKIP_NOTARIZE=1 \
BUNDLE_ID=ai.openclaw.mac \
APP_VERSION=2026.3.13 \
BUILD_CONFIG=release \
SIGN_IDENTITY="Developer ID Application: <Developer Name> (<TEAMID>)" \
scripts/package-mac-dist.sh
# `package-mac-dist.sh`가 이미 zip + DMG를 생성합니다.
# 대신 `package-mac-app.sh`를 직접 사용했다면, 수동으로 생성하세요:
# 이 단계에서 공증/스태플링을 원하면 아래 NOTARIZE 명령을 사용하세요.
ditto -c -k --sequesterRsrc --keepParent dist/OpenClaw.app dist/OpenClaw-2026.3.13.zip
# 선택: 사용자용 스타일링된 DMG 빌드 (/Applications로 드래그)
scripts/create-dmg.sh dist/OpenClaw.app dist/OpenClaw-2026.3.13.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=ai.openclaw.mac \
APP_VERSION=2026.3.13 \
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.13.dSYM.zip
Appcast 항목
Sparkle이 포맷된 HTML 노트를 렌더링할 수 있도록 릴리스 노트 생성기를 사용하세요:
SPARKLE_PRIVATE_KEY_FILE=/path/to/ed25519-private-key scripts/make_appcast.sh dist/OpenClaw-2026.3.13.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.13.zip(및OpenClaw-2026.3.13.dSYM.zip)을 태그v2026.3.13의 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 탭의 “Check for Updates…”를 실행하여 Sparkle이 새 빌드를 깔끔하게 설치하는지 확인.
완료 정의: 서명된 앱 + appcast가 게시되고, 이전 설치 버전에서 업데이트 흐름이 동작하며, 릴리스 에셋이 GitHub 릴리스에 첨부됨.