mirror of
https://github.com/openswarm-ai/openswarm.git
synced 2026-08-17 18:25:42 +02:00
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
93 lines
3.6 KiB
Bash
Executable File
93 lines
3.6 KiB
Bash
Executable File
#!/bin/bash
|
|
# Build a signed + notarized arm64-only DMG for testing on a fresh Mac.
|
|
# No publish, no Windows, no x64. Just the one DMG you can drag to a USB
|
|
# / send to your other Mac and verify the Python.app + bundled-node fix.
|
|
#
|
|
# Usage:
|
|
# bash scripts/build-mac-arm64-signed.sh
|
|
#
|
|
# Output:
|
|
# electron/dist/OpenSwarm-arm64.dmg
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
|
ENV_FILE="$PROJECT_ROOT/backend/.env"
|
|
|
|
if [[ -f "$ENV_FILE" ]]; then
|
|
set -a
|
|
source "$ENV_FILE"
|
|
set +a
|
|
fi
|
|
|
|
# Pre-flight checks. Fail fast with a clear message before kicking off
|
|
# the 15-30 minute build + notarization round-trip.
|
|
missing=()
|
|
[[ -z "${APPLE_ID:-}" ]] && missing+=("APPLE_ID")
|
|
[[ -z "${APPLE_APP_SPECIFIC_PASSWORD:-}" ]] && missing+=("APPLE_APP_SPECIFIC_PASSWORD")
|
|
[[ -z "${APPLE_TEAM_ID:-}" ]] && missing+=("APPLE_TEAM_ID")
|
|
if [[ ${#missing[@]} -gt 0 ]]; then
|
|
echo "ERROR: Missing required env vars in $ENV_FILE:" >&2
|
|
printf ' - %s\n' "${missing[@]}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Verify the Developer ID cert is in the keychain. Without it, codesign
|
|
# silently falls back to ad-hoc and notarization will reject the bundle.
|
|
if ! security find-identity -v -p codesigning 2>/dev/null | grep -q "Developer ID Application"; then
|
|
echo "ERROR: No 'Developer ID Application' code-signing identity found in keychain." >&2
|
|
echo " Install it from your Apple Developer account before running this script." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Force arm64-only by overriding the dual-arch publish path inside
|
|
# build-app.sh. We pass --sign which triggers SIGN_MODE (sign + notarize,
|
|
# no publish) and on arm64 hosts already builds arm64-only via the
|
|
# `if [[ "$ARCH" == "arm64" ]]` branch in the existing script.
|
|
HOST_ARCH=$(uname -m)
|
|
if [[ "$HOST_ARCH" != "arm64" ]]; then
|
|
echo "WARNING: Host arch is $HOST_ARCH, not arm64. The DMG will still be" >&2
|
|
echo " built for arm64 because we're invoking electron-builder with" >&2
|
|
echo " --mac --arm64 explicitly, but the bundled python-env / node will" >&2
|
|
echo " be x64 — wrong arch for an M4 Mac. Run this on an arm64 host." >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "============================================================"
|
|
echo " OpenSwarm arm64 signed+notarized DMG (test build)"
|
|
echo " apple_id: $APPLE_ID"
|
|
echo " team_id: $APPLE_TEAM_ID"
|
|
echo " output: $PROJECT_ROOT/electron/dist/OpenSwarm-arm64.dmg"
|
|
echo "============================================================"
|
|
echo ""
|
|
|
|
# Run the existing master build script in --sign mode. On an arm64 host
|
|
# this produces arm64-only artifacts (DMG + zip + blockmap + latest-mac.yml).
|
|
# Notarization happens automatically via electron/scripts/notarize.js when
|
|
# APPLE_ID + APPLE_TEAM_ID are set.
|
|
bash "$SCRIPT_DIR/build-app.sh" --sign
|
|
|
|
DMG_PATH="$PROJECT_ROOT/electron/dist/OpenSwarm-arm64.dmg"
|
|
|
|
echo ""
|
|
echo "============================================================"
|
|
if [[ -f "$DMG_PATH" ]]; then
|
|
echo " Build complete."
|
|
echo ""
|
|
ls -lh "$DMG_PATH"
|
|
echo ""
|
|
echo " Verification:"
|
|
echo " spctl -a -vvv -t open --context context:primary-signature \"$DMG_PATH\""
|
|
echo " xcrun stapler validate \"$DMG_PATH\""
|
|
echo ""
|
|
echo " Transfer to your other Mac (AirDrop, USB, scp, etc.) and"
|
|
echo " double-click. The first launch will be Gatekeeper-checked"
|
|
echo " but should open without the right-click 'Open' workaround."
|
|
else
|
|
echo " ERROR: Expected DMG not found at $DMG_PATH"
|
|
echo " Check the build log above for the actual output path."
|
|
exit 1
|
|
fi
|
|
echo "============================================================"
|