name: Test Local Signing on: workflow_dispatch: # Manual trigger push: branches: [test/signing] jobs: test-local-signing: runs-on: macos steps: - name: Checkout repository uses: actions/checkout@v3 - name: Setup Certificate env: CERTIFICATE_BASE64: ${{ secrets.MACOS_CERTIFICATE }} CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PWD }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} run: | echo "๐Ÿ”‘ Setting up certificate and keychain..." # Create working directory CERT_DIR="$HOME/certificates" mkdir -p "$CERT_DIR" cd "$CERT_DIR" # Decode certificate echo "๐Ÿ“œ Decoding certificate..." echo "$CERTIFICATE_BASE64" | base64 --decode > certificate.p12 # Check certificate info echo "๐Ÿ” Certificate info:" file certificate.p12 # Create keychain KEYCHAIN_PATH="$CERT_DIR/build.keychain" KEYCHAIN_PASSWORD="temporary$(date +%s)" echo "๐Ÿ” Creating keychain: $KEYCHAIN_PATH" security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" security default-keychain -s "$KEYCHAIN_PATH" security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" # Import certificate echo "๐Ÿ“ฅ Importing certificate..." security import certificate.p12 \ -k "$KEYCHAIN_PATH" \ -P "$CERTIFICATE_PASSWORD" \ -T /usr/bin/codesign # Configure keychain settings security set-key-partition-list \ -S apple-tool:,apple: \ -s \ -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" # Save environment variables echo "KEYCHAIN_PATH=$KEYCHAIN_PATH" >> "$GITHUB_ENV" echo "KEYCHAIN_PASSWORD=$KEYCHAIN_PASSWORD" >> "$GITHUB_ENV" echo "APPLE_TEAM_ID=$APPLE_TEAM_ID" >> "$GITHUB_ENV" echo "WORKSPACE_DIR=$(pwd)" >> "$GITHUB_ENV" # Check certificate status echo "โœ… Checking codesigning identities..." security find-identity -v -p codesigning "$KEYCHAIN_PATH" shell: bash - name: Verify Certificate run: | echo "๐Ÿ” Verifying certificate in keychain..." security find-identity -v -p codesigning "$KEYCHAIN_PATH" echo "๐Ÿ“‹ Certificate details:" security find-certificate -a -c "Developer ID Application" -p "$KEYCHAIN_PATH" | \ openssl x509 -text | \ grep -E "Subject:|Issuer:|Not Before:|Not After:|Serial Number:" shell: bash - name: Create Test Entitlements run: | echo "๐Ÿ“ Creating entitlements file..." cat > LuckyWorld.entitlements << EOF com.apple.security.cs.allow-jit com.apple.security.cs.allow-unsigned-executable-memory com.apple.security.cs.disable-library-validation com.apple.security.cs.allow-dyld-environment-variables com.apple.security.device.audio-input com.apple.security.device.camera EOF echo "โœ… Created entitlements file" cat LuckyWorld.entitlements shell: bash - name: Create Test App Bundle run: | echo "๐Ÿ“ฆ Creating test app bundle..." # Create test app bundle structure TEST_APP_DIR="TestApp.app" mkdir -p "$TEST_APP_DIR/Contents/MacOS" # Create a simple test executable echo '#!/bin/bash echo "Hello from TestApp!"' > "$TEST_APP_DIR/Contents/MacOS/TestApp" chmod +x "$TEST_APP_DIR/Contents/MacOS/TestApp" # Create Info.plist cat > "$TEST_APP_DIR/Contents/Info.plist" << EOF CFBundleExecutable TestApp CFBundleIdentifier com.luckyworld.testapp CFBundleName TestApp CFBundlePackageType APPL CFBundleShortVersionString 1.0 LSMinimumSystemVersion 10.10 EOF echo "โœ… Created test app bundle" echo "APP_PATH=$TEST_APP_DIR" >> "$GITHUB_ENV" shell: bash - name: Test Signing run: | echo "๐Ÿ” Testing code signing..." # Prepare keychain security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" # Find signing identity SIGNING_IDENTITY="Developer ID Application: $APPLE_TEAM_ID" echo "Using signing identity: $SIGNING_IDENTITY" echo "๐Ÿ“ Signing app bundle..." /usr/bin/codesign --force --deep --verbose \ --sign "$SIGNING_IDENTITY" \ --entitlements "LuckyWorld.entitlements" \ "$APP_PATH" echo "โœ… Signing complete" echo "๐Ÿ” Verifying signature..." codesign -vv -d "$APP_PATH" echo "๐Ÿ“‹ Checking entitlements..." codesign -d --entitlements :- "$APP_PATH" echo "๐Ÿ”’ Testing Gatekeeper assessment..." spctl --assess --type exec "$APP_PATH" shell: bash - name: Test Notarization env: API_KEY_PATH: ${{ secrets.NOTARY_API_KEY_PATH }} API_KEY_ID: ${{ secrets.NOTARY_API_KEY_ID }} API_KEY_ISSUER_ID: ${{ secrets.NOTARY_API_KEY_ISSUER_ID }} run: | if [ -n "$API_KEY_PATH" ] && [ -n "$API_KEY_ID" ] && [ -n "$API_KEY_ISSUER_ID" ]; then echo "๐Ÿ” Testing notarization..." # Create API key file echo "$API_KEY_PATH" | base64 --decode > api_key.p8 # Zip test app ditto -c -k --keepParent "$APP_PATH" "TestApp.zip" # Test notarization xcrun notarytool submit "TestApp.zip" \ --key "api_key.p8" \ --key-id "$API_KEY_ID" \ --issuer "$API_KEY_ISSUER_ID" \ --wait # Cleanup rm -f api_key.p8 TestApp.zip else echo "โš ๏ธ Notarization secrets not found, skipping notarization test" fi shell: bash - name: Cleanup if: always() run: | echo "๐Ÿงน Cleaning up..." # Clean up keychain security delete-keychain "$KEYCHAIN_PATH" || true # Clean up test files rm -rf "$HOME/certificates" || true rm -rf TestApp.app || true echo "โœ… Cleanup complete" shell: bash