From 4bd36553e4511e73d39ecad56a35838c8484b92d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Roz=CC=87niata?= <56474758+krozniata@users.noreply.github.com> Date: Tue, 13 Oct 2026 15:56:49 +0200 Subject: [PATCH 1/4] feat(ios): cache native compilation with ccache --- .github/workflows/ios.yml | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ios.yml b/.github/workflows/ios.yml index bb9b63c0..e5d39671 100644 --- a/.github/workflows/ios.yml +++ b/.github/workflows/ios.yml @@ -7,6 +7,17 @@ jobs: ios-build: runs-on: macos-26 timeout-minutes: 60 + env: + CCACHE_DIR: ${{ github.workspace }}/.ccache + CCACHE_BASEDIR: ${{ github.workspace }} + CCACHE_MAXSIZE: 2G + # Xcode compiles with clang modules and VFS overlays, which ccache won't + # cache unless told to relax those checks. Same list Expo uses. + CCACHE_SLOPPINESS: clang_index_store,include_file_ctime,include_file_mtime,ivfsoverlay,pch_defines,modules,system_headers,time_macros + CCACHE_DEPEND: true + # Runner image updates touch clang even when it hasn't changed, so + # compare its contents instead of its mtime. + CCACHE_COMPILERCHECK: content steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: @@ -25,6 +36,16 @@ jobs: key: pods-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('example/ios/Podfile.lock') }} restore-keys: pods-${{ runner.os }}-${{ runner.arch }}- + - name: Install ccache + run: brew install ccache + + - name: Cache ccache + uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: .ccache + key: ccache-ios-${{ github.run_id }}-${{ github.run_attempt }} + restore-keys: ccache-ios- + - name: Install example Pods run: bun pods working-directory: example @@ -35,7 +56,12 @@ jobs: run: defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool false - name: Build iOS App - run: bun example:ios:release + # RN's USE_CCACHE wrapper silently skips ccache on Xcode 26 + # (facebook/react-native#56612), so use Xcode's compiler launcher. + run: | + ccache --zero-stats + bun example:ios:release --extra-params "C_COMPILER_LAUNCHER=$(command -v ccache) CLANG_ENABLE_EXPLICIT_MODULES_WITH_COMPILER_LAUNCHER=YES" + ccache --show-stats - name: Run e2e tests run: bun run test:ios From 421b7a73e5ada48c42e2a363c0b96664b4c843f6 Mon Sep 17 00:00:00 2001 From: troZee <12766071+troZee@users.noreply.github.com> Date: Tue, 13 Oct 2026 17:59:08 +0200 Subject: [PATCH 2/4] trigger CI --- ios/Extensions.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/Extensions.swift b/ios/Extensions.swift index ad9987aa..c71513d0 100644 --- a/ios/Extensions.swift +++ b/ios/Extensions.swift @@ -5,7 +5,7 @@ import UIKit /** Helper used to render UIView inside of SwiftUI. Uses UIViewControllerRepresentable to re-inject safe area insets - that SwiftUI's .ignoresSafeArea() strips from child UIKit views. + that SwiftUI's .ignoresSafeArea() strips from child UIKit views */ struct RepresentableView: UIViewControllerRepresentable { var view: UIView From ffeba5bdc87b35207eeed6ac7ee687d56bd2b385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Roz=CC=87niata?= <56474758+krozniata@users.noreply.github.com> Date: Wed, 14 Oct 2026 10:46:13 +0200 Subject: [PATCH 3/4] chore: test impr --- .github/workflows/ios.yml | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ios.yml b/.github/workflows/ios.yml index e5d39671..3c5ab980 100644 --- a/.github/workflows/ios.yml +++ b/.github/workflows/ios.yml @@ -22,6 +22,19 @@ jobs: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false + + # Simulator.app attaches the Mac keyboard by default, which hides the + # software keyboard and leaves no Return key for the keyboard tests. + - name: Detach hardware keyboard from simulator + run: defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool false + + # A fresh simulator takes minutes to boot. Start it now so it boots while + # the app builds, instead of run-ios waiting for it after the build. + - name: Boot simulator + run: | + udid=$(xcrun simctl list devices available -j | jq -r '[.devices[][] | select(.name == "iPhone 17 Pro")][0].udid') + xcrun simctl boot "$udid" + - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 with: bun-version-file: package.json @@ -50,18 +63,13 @@ jobs: run: bun pods working-directory: example - # Simulator.app attaches the Mac keyboard by default, which hides the - # software keyboard and leaves no Return key for the keyboard tests. - - name: Detach hardware keyboard from simulator - run: defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool false - - name: Build iOS App # RN's USE_CCACHE wrapper silently skips ccache on Xcode 26 # (facebook/react-native#56612), so use Xcode's compiler launcher. run: | ccache --zero-stats - bun example:ios:release --extra-params "C_COMPILER_LAUNCHER=$(command -v ccache) CLANG_ENABLE_EXPLICIT_MODULES_WITH_COMPILER_LAUNCHER=YES" - ccache --show-stats + bun example:ios:release --extra-params "C_COMPILER_LAUNCHER=$(command -v ccache) CLANG_ENABLE_EXPLICIT_MODULES_WITH_COMPILER_LAUNCHER=YES ONLY_ACTIVE_ARCH=YES -showBuildTimingSummary" + ccache --show-stats -v - name: Run e2e tests run: bun run test:ios From 393be1c373766181aa178dc48fc529afdd095feb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Roz=CC=87niata?= <56474758+krozniata@users.noreply.github.com> Date: Wed, 14 Oct 2026 11:56:10 +0200 Subject: [PATCH 4/4] chore: cleanup --- .github/workflows/ios.yml | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ios.yml b/.github/workflows/ios.yml index 3c5ab980..74db5050 100644 --- a/.github/workflows/ios.yml +++ b/.github/workflows/ios.yml @@ -22,19 +22,6 @@ jobs: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - - # Simulator.app attaches the Mac keyboard by default, which hides the - # software keyboard and leaves no Return key for the keyboard tests. - - name: Detach hardware keyboard from simulator - run: defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool false - - # A fresh simulator takes minutes to boot. Start it now so it boots while - # the app builds, instead of run-ios waiting for it after the build. - - name: Boot simulator - run: | - udid=$(xcrun simctl list devices available -j | jq -r '[.devices[][] | select(.name == "iPhone 17 Pro")][0].udid') - xcrun simctl boot "$udid" - - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 with: bun-version-file: package.json @@ -63,12 +50,17 @@ jobs: run: bun pods working-directory: example + # Simulator.app attaches the Mac keyboard by default, which hides the + # software keyboard and leaves no Return key for the keyboard tests. + - name: Detach hardware keyboard from simulator + run: defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool false + - name: Build iOS App # RN's USE_CCACHE wrapper silently skips ccache on Xcode 26 # (facebook/react-native#56612), so use Xcode's compiler launcher. run: | ccache --zero-stats - bun example:ios:release --extra-params "C_COMPILER_LAUNCHER=$(command -v ccache) CLANG_ENABLE_EXPLICIT_MODULES_WITH_COMPILER_LAUNCHER=YES ONLY_ACTIVE_ARCH=YES -showBuildTimingSummary" + bun example:ios:release --extra-params "C_COMPILER_LAUNCHER=$(command -v ccache) CLANG_ENABLE_EXPLICIT_MODULES_WITH_COMPILER_LAUNCHER=YES ONLY_ACTIVE_ARCH=YES" ccache --show-stats -v - name: Run e2e tests