appsok/scripts/build-certified-macos.sh
toki c1c4c41886 feat: workflow integration milestones and macOS build CI support
- Add Teams deep link milestone
- Add macOS build CI milestone
- Update workflow integration phase documentation
- Add certified macOS scripts test
- Add documentation and scripts for macOS build pipeline
2026-06-14 16:48:47 +09:00

90 lines
2.4 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
TEAM_ID="${APPSOK_TEAM_ID:-AWA82DP9WD}"
IDENTITY="${APPSOK_SIGN_IDENTITY:-Developer ID Application: Dongmyung Lee ($TEAM_ID)}"
AGE_KEY="${APPSOK_SOPS_AGE_KEY_FILE:-$HOME/.config/sops/age/appsok-ci-key.txt}"
SECRET_FILE="${APPSOK_CI_SECRET_FILE:-secrets/appsok.ci.sops.json}"
export PATH="$HOME/SDK/flutter/bin:/opt/homebrew/bin:/usr/local/bin:$PATH"
cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
need() {
if ! command -v "$1" >/dev/null 2>&1; then
echo "missing command: $1" >&2
exit 1
fi
}
need codesign
need ditto
need flutter
need python3
need security
need shasum
need sops
need spctl
need xcrun
if [ ! -f "$AGE_KEY" ]; then
echo "missing SOPS age key: $AGE_KEY" >&2
exit 1
fi
if [ ! -f "$SECRET_FILE" ]; then
echo "missing encrypted CI secret file: $SECRET_FILE" >&2
exit 1
fi
export SOPS_AGE_KEY_FILE="$AGE_KEY"
read_secret() {
local key="$1"
sops -d "$SECRET_FILE" | python3 -c "import json, sys; print(json.load(sys.stdin)['$key'])"
}
KEYCHAIN_PASSWORD="$(read_secret keychain_password)"
NOTARY_PROFILE="$(read_secret notary_profile)"
APP_PATH="build/macos/Build/Products/Release/AppSok.app"
ADB_PATH="$APP_PATH/Contents/Resources/adb-runtime/adb"
NOTARY_ZIP="build/macos/Build/Products/Release/AppSok-notary.zip"
FINAL_ZIP="build/macos/Build/Products/Release/AppSok-certified.zip"
security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$HOME/Library/Keychains/login.keychain-db"
security set-keychain-settings -lut 21600 "$HOME/Library/Keychains/login.keychain-db"
security set-key-partition-list \
-S apple-tool:,apple:,codesign: \
-s \
-k "$KEYCHAIN_PASSWORD" \
"$HOME/Library/Keychains/login.keychain-db" >/dev/null
flutter pub get
flutter analyze
flutter test
flutter build macos
codesign --force --options runtime --timestamp --sign "$IDENTITY" "$ADB_PATH"
codesign --verify --strict --verbose=2 "$ADB_PATH"
codesign \
--force \
--deep \
--options runtime \
--timestamp \
--entitlements macos/Runner/Release.entitlements \
--sign "$IDENTITY" \
"$APP_PATH"
codesign --verify --deep --strict --verbose=2 "$APP_PATH"
rm -f "$NOTARY_ZIP" "$FINAL_ZIP"
ditto -c -k --keepParent "$APP_PATH" "$NOTARY_ZIP"
xcrun notarytool submit "$NOTARY_ZIP" --keychain-profile "$NOTARY_PROFILE" --wait
xcrun stapler staple -v "$APP_PATH"
spctl --assess --type execute --verbose=4 "$APP_PATH"
ditto -c -k --keepParent "$APP_PATH" "$FINAL_ZIP"
shasum -a 256 "$FINAL_ZIP"
ls -lh "$FINAL_ZIP"