From 099df3937ebef4326a9709dd23ec81257eb86495 Mon Sep 17 00:00:00 2001 From: Saad Najmi Date: Wed, 15 Apr 2026 12:40:05 -0700 Subject: [PATCH] feat(0.81, ci): compose and cache prebuilt React xcframework from SPM build - Expand build-spm matrix to include ios-simulator and visionos-simulator - Upload slice artifacts and headers after each platform build - Add compose-xcframework job that assembles slices into React.xcframework - Add visionos-simulator platform to ios-prebuild CLI Co-Authored-By: Claude Opus 4.6 --- .github/workflows/microsoft-build-spm.yml | 83 ++++++++++++++++++- .../react-native/scripts/ios-prebuild/cli.js | 2 + .../scripts/ios-prebuild/types.js | 10 ++- 3 files changed, 90 insertions(+), 5 deletions(-) diff --git a/.github/workflows/microsoft-build-spm.yml b/.github/workflows/microsoft-build-spm.yml index 255fba816c2..db27a4152ad 100644 --- a/.github/workflows/microsoft-build-spm.yml +++ b/.github/workflows/microsoft-build-spm.yml @@ -219,7 +219,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [ios, macos, visionos] + platform: [ios, ios-simulator, macos, visionos, visionos-simulator] steps: - uses: actions/checkout@v4 with: @@ -254,3 +254,84 @@ jobs: - name: Build SPM (${{ matrix.platform }}) working-directory: packages/react-native run: node scripts/ios-prebuild.js -b -f Debug -p ${{ matrix.platform }} + + - name: Upload headers + uses: actions/upload-artifact@v4 + with: + name: prebuild-macos-core-headers-Debug-${{ matrix.platform }} + path: packages/react-native/.build/headers + + - name: Upload slice artifacts + uses: actions/upload-artifact@v4 + with: + name: prebuild-macos-core-slice-Debug-${{ matrix.platform }} + path: packages/react-native/.build/output/spm/Debug/Build/Products + + compose-xcframework: + name: "Compose XCFramework (Debug)" + needs: [build-spm] + if: ${{ always() && !cancelled() && !failure() }} + runs-on: macos-26 + timeout-minutes: 30 + steps: + - uses: actions/checkout@v4 + with: + filter: blob:none + + - name: Setup toolchain + uses: ./.github/actions/microsoft-setup-toolchain + with: + node-version: '22' + platform: ios + + - name: Install npm dependencies + run: yarn install + + - name: Download slice artifacts + uses: actions/download-artifact@v4 + with: + pattern: prebuild-macos-core-slice-Debug-* + path: packages/react-native/.build/output/spm/Debug/Build/Products + merge-multiple: true + + - name: Download headers + uses: actions/download-artifact@v4 + with: + pattern: prebuild-macos-core-headers-Debug-* + path: packages/react-native/.build/headers + merge-multiple: true + + - name: Verify downloaded artifacts + run: | + echo "=== Products directory ===" + ls -R packages/react-native/.build/output/spm/Debug/Build/Products/ | head -40 + echo "=== Headers directory ===" + ls packages/react-native/.build/headers/ | head -20 + + - name: Create XCFramework + working-directory: packages/react-native + run: node scripts/ios-prebuild -c -f Debug + + - name: Compress XCFramework + run: | + cd packages/react-native/.build/output/xcframeworks/Debug + tar -cz -f ../ReactCoreDebug.xcframework.tar.gz React.xcframework + + - name: Compress dSYMs + run: | + cd packages/react-native/.build/output/xcframeworks/Debug/Symbols + tar -cz -f ../../ReactCoreDebug.framework.dSYM.tar.gz . + + - name: Upload XCFramework + uses: actions/upload-artifact@v4 + with: + name: ReactCoreDebug.xcframework.tar.gz + path: packages/react-native/.build/output/xcframeworks/ReactCoreDebug.xcframework.tar.gz + retention-days: 14 + + - name: Upload dSYMs + uses: actions/upload-artifact@v4 + with: + name: ReactCoreDebug.framework.dSYM.tar.gz + path: packages/react-native/.build/output/xcframeworks/ReactCoreDebug.framework.dSYM.tar.gz + retention-days: 14 diff --git a/packages/react-native/scripts/ios-prebuild/cli.js b/packages/react-native/scripts/ios-prebuild/cli.js index c2f3586f46f..e18e663df0a 100644 --- a/packages/react-native/scripts/ios-prebuild/cli.js +++ b/packages/react-native/scripts/ios-prebuild/cli.js @@ -20,6 +20,7 @@ const platforms /*: $ReadOnlyArray */ = [ 'mac-catalyst', 'macos', // [macOS] 'visionos', // [macOS] + 'visionos-simulator', // [macOS] ]; // CI can't use commas in cache keys, so 'macOS,variant=Mac Catalyst' was creating troubles @@ -30,6 +31,7 @@ const platformToDestination /*: $ReadOnly<{|[Platform]: Destination|}> */ = { 'mac-catalyst': 'macOS,variant=Mac Catalyst', macos: 'macOS', // [macOS] visionos: 'visionOS', // [macOS] + 'visionos-simulator': 'visionOS Simulator', // [macOS] }; const cli = yargs diff --git a/packages/react-native/scripts/ios-prebuild/types.js b/packages/react-native/scripts/ios-prebuild/types.js index 87f516c5ba9..cdb554815a6 100644 --- a/packages/react-native/scripts/ios-prebuild/types.js +++ b/packages/react-native/scripts/ios-prebuild/types.js @@ -13,15 +13,17 @@ export type Platform = 'ios' | 'ios-simulator' | 'mac-catalyst' | - 'macos' | // [macOS] - 'visionos'; // [macOS] + 'macos' | // [macOS] + 'visionos' | // [macOS] + 'visionos-simulator'; // [macOS] export type Destination = 'iOS' | 'iOS Simulator' | 'macOS,variant=Mac Catalyst' | - 'macOS' | // [macOS] - 'visionOS'; // [macOS] + 'macOS' | // [macOS] + 'visionOS' | // [macOS] + 'visionOS Simulator'; // [macOS] export type BuildFlavor = 'Debug' | 'Release'; */