|
7 | 7 |
|
8 | 8 | jobs: |
9 | 9 | build: |
10 | | - name: Build macOS Universal |
11 | | - runs-on: macos-latest |
| 10 | + name: Build macOS ${{ matrix.target }} |
| 11 | + runs-on: ${{ matrix.os }} |
| 12 | + strategy: |
| 13 | + matrix: |
| 14 | + include: |
| 15 | + - os: macos-13 # Intel |
| 16 | + target: x86_64-apple-darwin |
| 17 | + arch: x86_64 |
| 18 | + - os: macos-14 # Apple Silicon |
| 19 | + target: aarch64-apple-darwin |
| 20 | + arch: aarch64 |
12 | 21 |
|
13 | 22 | steps: |
14 | 23 | - uses: actions/checkout@v4 |
15 | 24 |
|
16 | 25 | - name: Setup Rust |
17 | 26 | uses: dtolnay/rust-toolchain@stable |
18 | | - with: |
19 | | - targets: aarch64-apple-darwin,x86_64-apple-darwin |
20 | 27 |
|
21 | 28 | - name: Setup Rust cache |
22 | 29 | uses: Swatinem/rust-cache@v2 |
@@ -52,34 +59,73 @@ jobs: |
52 | 59 | security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH |
53 | 60 | security list-keychain -d user -s $KEYCHAIN_PATH |
54 | 61 | |
55 | | - - name: Build for ARM64 |
56 | | - run: bun run tauri build -- --target aarch64-apple-darwin |
| 62 | + - name: Build native |
| 63 | + run: bun run tauri build |
57 | 64 |
|
58 | | - - name: Build for x86_64 |
59 | | - run: bun run tauri build -- --target x86_64-apple-darwin |
| 65 | + - name: Upload architecture-specific artifacts |
| 66 | + uses: actions/upload-artifact@v4 |
| 67 | + with: |
| 68 | + name: macos-${{ matrix.arch }} |
| 69 | + path: | |
| 70 | + src-tauri/target/release/bundle/macos/Claudia.app |
| 71 | + src-tauri/target/release/bundle/dmg/*.dmg |
| 72 | + retention-days: 1 |
| 73 | + |
| 74 | + universal: |
| 75 | + name: Create Universal Binary |
| 76 | + needs: build |
| 77 | + runs-on: macos-latest |
| 78 | + steps: |
| 79 | + - uses: actions/checkout@v4 |
| 80 | + |
| 81 | + - name: Download artifacts |
| 82 | + uses: actions/download-artifact@v4 |
| 83 | + with: |
| 84 | + pattern: macos-* |
| 85 | + path: artifacts |
60 | 86 |
|
61 | | - - name: Create universal binary |
| 87 | + - name: Import Apple certificates |
| 88 | + env: |
| 89 | + APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} |
| 90 | + APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} |
| 91 | + KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} |
62 | 92 | run: | |
63 | | - mkdir -p src-tauri/target/universal-apple-darwin/release |
64 | | - lipo -create -output src-tauri/target/universal-apple-darwin/release/claudia \ |
65 | | - src-tauri/target/aarch64-apple-darwin/release/claudia \ |
66 | | - src-tauri/target/x86_64-apple-darwin/release/claudia |
| 93 | + # Create variables |
| 94 | + CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12 |
| 95 | + KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db |
67 | 96 | |
68 | | - echo "✅ Universal binary created" |
69 | | - lipo -info src-tauri/target/universal-apple-darwin/release/claudia |
| 97 | + # Import certificate from secrets |
| 98 | + echo -n "$APPLE_CERTIFICATE" | base64 --decode -o $CERTIFICATE_PATH |
| 99 | + |
| 100 | + # Create temporary keychain |
| 101 | + security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH |
| 102 | + security set-keychain-settings -lut 21600 $KEYCHAIN_PATH |
| 103 | + security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH |
| 104 | + |
| 105 | + # Import certificate to keychain |
| 106 | + security import $CERTIFICATE_PATH -P "$APPLE_CERTIFICATE_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH |
| 107 | + security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH |
| 108 | + security list-keychain -d user -s $KEYCHAIN_PATH |
70 | 109 | |
71 | | - - name: Prepare app bundle with universal binary |
| 110 | + - name: Create universal app |
72 | 111 | run: | |
73 | 112 | # Create temp directory |
74 | 113 | mkdir -p dmg_temp |
75 | 114 | |
76 | | - # Copy the app bundle from one of the architecture-specific builds |
77 | | - # Using the ARM64 build as the base (either architecture works since we'll replace the binary) |
78 | | - cp -R src-tauri/target/aarch64-apple-darwin/release/bundle/macos/Claudia.app dmg_temp/ |
| 115 | + # Extract both app bundles |
| 116 | + cp -R artifacts/macos-aarch64/Claudia.app dmg_temp/ |
| 117 | + |
| 118 | + # Extract x86_64 binary |
| 119 | + mkdir -p temp_x86 |
| 120 | + cp -R artifacts/macos-x86_64/Claudia.app temp_x86/ |
79 | 121 | |
80 | | - # Replace the binary with universal binary |
81 | | - rm -f dmg_temp/Claudia.app/Contents/MacOS/claudia |
82 | | - cp src-tauri/target/universal-apple-darwin/release/claudia dmg_temp/Claudia.app/Contents/MacOS/claudia |
| 122 | + # Create universal binary using lipo |
| 123 | + lipo -create -output dmg_temp/Claudia.app/Contents/MacOS/claudia \ |
| 124 | + dmg_temp/Claudia.app/Contents/MacOS/claudia \ |
| 125 | + temp_x86/Claudia.app/Contents/MacOS/claudia |
| 126 | + |
| 127 | + echo "✅ Universal binary created" |
| 128 | + lipo -info dmg_temp/Claudia.app/Contents/MacOS/claudia |
83 | 129 | |
84 | 130 | - name: Sign app bundle |
85 | 131 | env: |
|
0 commit comments