|
|
#!/bin/bash
|
|
|
# Baut Mawari signiert und notarisiert als DMG (zum Verschicken und für Updates).
|
|
|
#
|
|
|
# Voraussetzungen (einmalig):
|
|
|
# - Developer-ID-Application-Zertifikat im Login-Schlüsselbund (Team XY4C2RG3L5)
|
|
|
# - notarytool-Profil. Gleiches Team wie Patchcord, daher dessen Profil als Standard:
|
|
|
# NOTARY_PROFILE=patchcord-notary
|
|
|
#
|
|
|
# Aufruf: bash Tools/build-dmg.sh
|
|
|
set -euo pipefail
|
|
|
cd "$(dirname "$0")/.."
|
|
|
|
|
|
TEAM_ID="XY4C2RG3L5"
|
|
|
NOTARY_PROFILE="${NOTARY_PROFILE:-patchcord-notary}"
|
|
|
VERSION=$(grep -m1 'MARKETING_VERSION:' project.yml | sed -E 's/.*MARKETING_VERSION: *"?([^"]+)"?/\1/')
|
|
|
APP_NAME="Mawari"
|
|
|
BUILD_DIR="build"
|
|
|
ARCHIVE_PATH="$BUILD_DIR/Mawari.xcarchive"
|
|
|
DMG_STAGING="$BUILD_DIR/dmg-staging"
|
|
|
DMG_PATH="$BUILD_DIR/${APP_NAME}-${VERSION}.dmg"
|
|
|
SIGN_ID="Developer ID Application: Samuel Zielke ($TEAM_ID)"
|
|
|
|
|
|
echo "==> Version $VERSION, Team $TEAM_ID, Notarisierung über Profil $NOTARY_PROFILE"
|
|
|
xcrun notarytool history --keychain-profile "$NOTARY_PROFILE" >/dev/null 2>&1 \
|
|
|
|| { echo "Fehler: notarytool-Profil $NOTARY_PROFILE fehlt (xcrun notarytool store-credentials …)." >&2; exit 1; }
|
|
|
|
|
|
rm -rf "$ARCHIVE_PATH" "$DMG_STAGING" "$DMG_PATH"
|
|
|
mkdir -p "$DMG_STAGING"
|
|
|
|
|
|
command -v xcodegen >/dev/null && xcodegen >/dev/null
|
|
|
|
|
|
echo "==> Archiviere (Release, Universal)"
|
|
|
xcodebuild -project Mawari.xcodeproj -scheme Mawari -configuration Release \
|
|
|
-archivePath "$ARCHIVE_PATH" -derivedDataPath "$BUILD_DIR/dd-release" \
|
|
|
CODE_SIGN_STYLE=Manual CODE_SIGN_IDENTITY="Developer ID Application" DEVELOPMENT_TEAM="$TEAM_ID" \
|
|
|
archive -quiet
|
|
|
|
|
|
APP_PATH="$ARCHIVE_PATH/Products/Applications/${APP_NAME}.app"
|
|
|
[ -d "$APP_PATH" ] || { echo "Fehler: $APP_PATH nicht gefunden." >&2; exit 1; }
|
|
|
|
|
|
# Sparkles Hilfsprogramme signiert Xcode nur ad-hoc – die Notarisierung lehnt das ab.
|
|
|
# Von innen nach außen nachsignieren (siehe drop.look/Tools/build-beta-dmg.sh).
|
|
|
echo "==> Sparkle nachsignieren"
|
|
|
resign() { [ -e "$1" ] || return 0; codesign --force --timestamp --options runtime --sign "$SIGN_ID" "$1"; }
|
|
|
SPARKLE="$APP_PATH/Contents/Frameworks/Sparkle.framework"
|
|
|
if [ -d "$SPARKLE" ]; then
|
|
|
V="$SPARKLE/Versions/Current"
|
|
|
resign "$V/XPCServices/Downloader.xpc"
|
|
|
resign "$V/XPCServices/Installer.xpc"
|
|
|
resign "$V/Autoupdate"
|
|
|
resign "$V/Updater.app"
|
|
|
resign "$SPARKLE"
|
|
|
fi
|
|
|
echo "==> App signieren"
|
|
|
codesign --force --timestamp --options runtime --entitlements App/Mawari.entitlements --sign "$SIGN_ID" "$APP_PATH"
|
|
|
codesign --verify --deep --strict --verbose=2 "$APP_PATH"
|
|
|
lipo -archs "$APP_PATH/Contents/MacOS/$APP_NAME"
|
|
|
|
|
|
echo "==> App notarisieren (dauert ein paar Minuten)"
|
|
|
ZIP_PATH="$BUILD_DIR/${APP_NAME}-notarize.zip"
|
|
|
rm -f "$ZIP_PATH"
|
|
|
ditto -c -k --keepParent "$APP_PATH" "$ZIP_PATH"
|
|
|
xcrun notarytool submit "$ZIP_PATH" --keychain-profile "$NOTARY_PROFILE" --wait
|
|
|
xcrun stapler staple "$APP_PATH"
|
|
|
spctl --assess --type execute --verbose "$APP_PATH"
|
|
|
|
|
|
echo "==> DMG bauen"
|
|
|
cp -R "$APP_PATH" "$DMG_STAGING/"
|
|
|
ln -s /Applications "$DMG_STAGING/Programme"
|
|
|
hdiutil create -volname "$APP_NAME" -srcfolder "$DMG_STAGING" -ov -format UDZO "$DMG_PATH" -quiet
|
|
|
codesign --force --timestamp --sign "$SIGN_ID" "$DMG_PATH"
|
|
|
|
|
|
echo "==> DMG notarisieren (damit sie auch per Mail verschickt ohne Warnung aufgeht)"
|
|
|
xcrun notarytool submit "$DMG_PATH" --keychain-profile "$NOTARY_PROFILE" --wait
|
|
|
xcrun stapler staple "$DMG_PATH"
|
|
|
spctl --assess --type open --context context:primary-signature --verbose "$DMG_PATH"
|
|
|
|
|
|
echo "==> Fertig: $DMG_PATH"
|
|
|
echo "Für ein Online-Update danach: bash Tools/make-appcast.sh && bash Tools/publish.sh"
|