Repository navigation
ci: build the Expo example on iOS and Android #665
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,154 @@ | ||
| name: expo-build | ||
|
|
||
| # Builds the Expo example (Example/expoUsePushy, `use_expo_modules!`) against | ||
| # the local package on both platforms. Nothing else compiles the Expo side: | ||
| # the podspec's Expo detection (Podfile scan, expo/expo-modules-core lookup, | ||
| # the ExpoModulesCore version gate that selects EXPO_SUPPORTS_BUNDLEURL), the | ||
| # Swift ReactDelegateHandler and the Kotlin module. SDK 57 removed the | ||
| # createBridge fallback and broke exactly this path once; the e2e app is a | ||
| # bare React Native project and never reaches it. | ||
| # | ||
| # Build only (no simulator/emulator run): the update flow itself is covered | ||
| # by e2e-ios / e2e-android. Paths are limited to the Expo integration's | ||
| # inputs; changes to the native .mm/.java sources are already compiled by | ||
| # the e2e workflows. | ||
| on: | ||
| pull_request: | ||
| branches: | ||
| - '**' | ||
| paths: &expo-paths | ||
| - '.github/workflows/expo_build.yml' | ||
| - '.github/actions/e2e-common/**' | ||
| - '.gitmodules' | ||
| - 'package.json' | ||
| - 'react-native-update.podspec' | ||
| - 'react-native.config.js' | ||
| - 'expo-module.config.json' | ||
| - 'src/Native*.ts' | ||
| - 'ios/Expo/**' | ||
| - 'ios/RCTPushy/*.h' | ||
| - 'ios/PrivacyInfo.xcprivacy' | ||
| - 'android/build.gradle' | ||
| - 'android/src/main/java/expo/**' | ||
| - 'Example/expoUsePushy/**' | ||
| push: | ||
| branches: | ||
| - master | ||
| paths: *expo-paths | ||
|
|
||
| # Builds pull request code: the token only needs to read the repository. | ||
| permissions: | ||
| contents: read | ||
|
|
||
| concurrency: | ||
| group: ${{ github.workflow }}-${{ github.ref }} | ||
| cancel-in-progress: true | ||
|
|
||
| env: | ||
| # Same toolchain as e2e-ios. | ||
| XCODE_VERSION: '26.4' | ||
| EXPO_DIR: Example/expoUsePushy | ||
|
|
||
| jobs: | ||
| expo-ios: | ||
| name: expo-build (ios) | ||
| runs-on: macos-26 | ||
| timeout-minutes: 45 | ||
| steps: | ||
| - name: Checkout react-native-update | ||
| uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | ||
| with: | ||
| submodules: recursive | ||
| persist-credentials: false | ||
|
|
||
| - name: Setup Xcode | ||
| uses: maxim-lobanov/setup-xcode@ed7a3b1fda3918c0306d1b724322adc0b8cc0a90 # v1.7.0 | ||
| with: | ||
| xcode-version: ${{ env.XCODE_VERSION }} | ||
|
|
||
| - name: Set up Expo example | ||
| # Node/Bun, the example's dependencies and the local | ||
| # react-native-update link (the same copy an npm install ships). | ||
| uses: ./.github/actions/e2e-common | ||
| with: | ||
| project-dir: ${{ env.EXPO_DIR }} | ||
| checkout-cli: 'false' | ||
| bun-cache-scope: -expo | ||
| bun-cache-key-suffix: -${{ hashFiles('Example/expoUsePushy/bun.lock') }} | ||
|
|
||
| - name: Cache CocoaPods downloads | ||
| uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 | ||
| with: | ||
| path: ~/Library/Caches/CocoaPods | ||
| key: ${{ runner.os }}-cocoapods-expo-${{ hashFiles('Example/expoUsePushy/ios/Podfile.lock', 'Example/expoUsePushy/ios/Podfile', 'Example/expoUsePushy/bun.lock') }} | ||
| restore-keys: | | ||
| ${{ runner.os }}-cocoapods-expo- | ||
|
|
||
| - name: Install CocoaPods dependencies | ||
| env: | ||
| LANG: en_US.UTF-8 | ||
| run: cd "$EXPO_DIR/ios" && pod install | ||
|
|
||
| - name: Assert the Expo integration was selected | ||
| # A silent fallback to the bare-RN pod (detection failed) would still | ||
| # build; fail instead, as users on that path would get no Expo hook. | ||
| run: | | ||
| set -euo pipefail | ||
| grep -F 'react-native-update/Expo' "$EXPO_DIR/ios/Podfile.lock" | ||
| grep -F 'EXPO_SUPPORTS_BUNDLEURL' \ | ||
| "$EXPO_DIR/ios/Pods/Target Support Files/react-native-update/react-native-update.release.xcconfig" | ||
| # Expo autolinking found expo-module.config.json and registered the | ||
| # bundle URL handler. | ||
| grep -F 'ExpoPushyReactDelegateHandler' \ | ||
| "$EXPO_DIR/ios/Pods/Target Support Files/Pods-expoUsePushy/ExpoModulesProvider.swift" | ||
|
|
||
| - name: Build (Release, simulator) | ||
| # arm64 only (the runner's own architecture): a generic simulator | ||
| # destination otherwise compiles every pod twice, for x86_64 too. | ||
| run: | | ||
| set -o pipefail | ||
| cd "$EXPO_DIR/ios" | ||
| xcodebuild -workspace expoUsePushy.xcworkspace -scheme expoUsePushy \ | ||
| -configuration Release -sdk iphonesimulator \ | ||
| -destination 'generic/platform=iOS Simulator' \ | ||
| -derivedDataPath build CODE_SIGNING_ALLOWED=NO ARCHS=arm64 build \ | ||
| | tee xcodebuild.log | grep -E '(error|warning: .*RCTPushy|BUILD (SUCCEEDED|FAILED))' || true | ||
| grep -q 'BUILD SUCCEEDED' xcodebuild.log | ||
|
|
||
| expo-android: | ||
| name: expo-build (android) | ||
| runs-on: ubuntu-latest | ||
| timeout-minutes: 40 | ||
| steps: | ||
| - name: Checkout react-native-update | ||
| uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | ||
| with: | ||
| submodules: recursive | ||
| persist-credentials: false | ||
|
|
||
| - name: Setup Java | ||
| uses: actions/setup-java@de7274f081f381c8f8158605e0321c36c376e2e6 # v6.0.1 | ||
| with: | ||
| distribution: temurin | ||
| java-version: '17' | ||
| cache: gradle | ||
| cache-dependency-path: | | ||
| Example/expoUsePushy/bun.lock | ||
| Example/expoUsePushy/app.json | ||
|
|
||
| - name: Set up Expo example | ||
| uses: ./.github/actions/e2e-common | ||
| with: | ||
| project-dir: ${{ env.EXPO_DIR }} | ||
| checkout-cli: 'false' | ||
| bun-cache-scope: -expo | ||
| bun-cache-key-suffix: -${{ hashFiles('Example/expoUsePushy/bun.lock') }} | ||
|
|
||
| - name: Generate the Android project | ||
| # The example keeps no android/ directory; prebuild generates it the | ||
| # way an Expo user's CNG build does. | ||
| run: cd "$EXPO_DIR" && CI=1 bunx expo prebuild --platform android --no-install | ||
|
|
||
| - name: Build (Release) | ||
| # One ABI is enough to compile and link every module. | ||
| run: cd "$EXPO_DIR/android" && ./gradlew assembleRelease -PreactNativeArchitectures=arm64-v8a | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.