diff --git a/.github/workflows/review-android.yml b/.github/workflows/review-android.yml new file mode 100644 index 00000000..a71e18b9 --- /dev/null +++ b/.github/workflows/review-android.yml @@ -0,0 +1,125 @@ +name: Android + +on: + workflow_call: + # Review calls this Workflow + +jobs: + build-android: + name: Build Android + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./packages/react-native-app + strategy: + matrix: + new-arch: [false, true] + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup + uses: ./.github/actions/setup + + - name: Setup Azul Zulu OpenJDK + uses: actions/setup-java@v4 + with: + distribution: zulu + java-version: 21 + cache: gradle + + - name: Cache Android Build + uses: actions/cache@v4 + id: android-build-cache + with: + path: | + ./android/build + ./packages/react-native-app/android/.gradle + ./packages/react-native-app/android/app/build + ./packages/react-native-app/android/build + key: ${{ runner.os }}-android-build-${{ matrix.new-arch && 'new-arch' || 'old-arch' }}-${{ github.workflow }}-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-android-build-${{ matrix.new-arch && 'new-arch' || 'old-arch' }}-${{ github.workflow }}-${{ github.sha }} + ${{ runner.os }}-android-build-${{ matrix.new-arch && 'new-arch' || 'old-arch' }}-${{ github.workflow }}- + + - name: Build Android + if: steps.android-build-cache.outputs.cache-hit != 'true' + run: yarn react-native build-android --mode release --tasks assembleRelease --extra-params "-PnewArchEnabled=${{ matrix.new-arch }}" + + - name: Upload Android App + uses: actions/upload-artifact@v4 + with: + name: android-app + path: ./packages/react-native-app/android/app/build/outputs/apk/release/app-release.apk + + test-android: + name: Test Android + needs: [build-android] + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./packages/react-native-app + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Enable KVM Group Permissions + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + + - name: Gradle cache + uses: gradle/actions/setup-gradle@v3 + + - name: Cache Android Virtual Device + uses: actions/cache@v4 + id: android-virtual-device-cache + with: + path: | + ~/.android/avd/* + ~/.android/adb* + key: android-virtual-device-api-level-33 + + - name: Create Android Virtual Device + if: steps.android-virtual-device-cache.outputs.cache-hit != 'true' + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: 33 + target: google_apis + arch: x86_64 + force-avd-creation: false + working-directory: ./packages/react-native-app + script: echo "Generated Android Virtual Device Snapshot for Caching" + + - name: Install Maestro + run: | + curl -Ls "https://get.maestro.mobile.dev" | bash + echo "$HOME/.maestro/bin" >> "$GITHUB_PATH" + + - name: Download Android App + uses: actions/download-artifact@v4 + with: + name: android-app + path: ./packages/react-native-app/android/ + + - name: Test Android + uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: 33 + target: google_apis + arch: x86_64 + force-avd-creation: false + working-directory: ./packages/react-native-app + script: | + adb install ./android/app-release.apk + maestro test ./e2e/show-map.yml --format junit + + - name: Upload Android Report + if: always() + uses: actions/upload-artifact@v4 + with: + name: Android Report + path: | + ./packages/react-native-app/report.xml + ~/.maestro/tests/**/* diff --git a/.github/workflows/review-ios.yml b/.github/workflows/review-ios.yml new file mode 100644 index 00000000..bd145f93 --- /dev/null +++ b/.github/workflows/review-ios.yml @@ -0,0 +1,98 @@ +name: iOS + +on: + workflow_call: + # Review calls this Workflow + +jobs: + build-ios: + name: Build iOS + runs-on: macos-latest + defaults: + run: + working-directory: ./packages/react-native-app + strategy: + matrix: + new-arch: [false, true] + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup + uses: ./.github/actions/setup + + - name: Cache Cocoapods + uses: actions/cache@v4 + id: cocoapods-cache + with: + path: ./packages/react-native-app/ios/Pods + key: ${{ runner.os }}-cocoapods-${{ matrix.new-arch && 'new-arch' || 'old-arch' }}-${{ hashFiles('./packages/react-native-app/ios/Podfile.lock') }} + restore-keys: | + ${{ runner.os }}-cocoapods-${{ matrix.new-arch && 'new-arch' || 'old-arch' }}-${{ hashFiles('./packages/react-native-app/ios/Podfile.lock') }} + ${{ runner.os }}-cocoapods-${{ matrix.new-arch && 'new-arch' || 'old-arch' }}- + + - name: Install Cocoapods + if: steps.cocoapods-cache.outputs.cache-hit != 'true' + run: RCT_NEW_ARCH_ENABLED=${{ matrix.new-arch && '1' || '0' }} yarn pod:install + + - name: Cache iOS Build + uses: actions/cache@v4 + id: ios-build-cache + with: + path: ./packages/react-native-app/ios/build + key: ${{ runner.os }}-ios-build-${{ matrix.new-arch && 'new-arch' || 'old-arch' }}-${{ github.workflow }}-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-ios-build-${{ matrix.new-arch && 'new-arch' || 'old-arch' }}-${{ github.workflow }}-${{ github.sha }} + ${{ runner.os }}-ios-build-${{ matrix.new-arch && 'new-arch' || 'old-arch' }}-${{ github.workflow }}- + + - name: Build iOS + if: steps.ios-build-cache.outputs.cache-hit != 'true' + # Like `react-native build-ios --mode Release` but adapted for simulators + run: xcodebuild -workspace ios/MapLibreReactNativeExample.xcworkspace -scheme MapLibreReactNativeExample -configuration Release -sdk iphonesimulator -derivedDataPath ios/build + + - name: Upload iOS App + uses: actions/upload-artifact@v4 + with: + name: ios-app + # `.app` is a directory, so we have to archive one level above + path: | + ./packages/react-native-app/ios/build/Build/Products/Release-iphonesimulator + !./packages/react-native-app/ios/build/Build/Products/Release-iphonesimulator/** + ./packages/react-native-app/ios/build/Build/Products/Release-iphonesimulator/MapLibreReactNativeExample.app + + test-ios: + name: Test iOS + needs: [build-ios] + runs-on: macos-latest + defaults: + run: + working-directory: ./packages/react-native-app + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Maestro + run: | + curl -Ls "https://get.maestro.mobile.dev" | bash + echo "$HOME/.maestro/bin" >> "$GITHUB_PATH" + + - name: Download iOS App + uses: actions/download-artifact@v4 + with: + name: ios-app + path: ./packages/react-native-app/ios + + - name: Test iOS + run: | + xcrun simctl boot "iPhone 15 Pro" + xcrun simctl install booted ./ios/MapLibreReactNativeExample.app + maestro test ./e2e/show-map.yml --format junit + + - name: Upload iOS Report + if: always() + uses: actions/upload-artifact@v4 + with: + name: iOS Report + path: | + ./packages/react-native-app/report.xml + ~/.maestro/tests/**/* diff --git a/.github/workflows/review.yml b/.github/workflows/review.yml index 17e0f448..c93ce5fb 100644 --- a/.github/workflows/review.yml +++ b/.github/workflows/review.yml @@ -2,7 +2,7 @@ name: Review on: workflow_call: - # Release calls this Workflow + # Release calls this Workflow pull_request: branches: - main @@ -87,210 +87,10 @@ jobs: - name: Build Library run: yarn prepack - build-android: - name: Build Android - needs: [lint-eslint, lint-tsc, test, codegen, build-library] - runs-on: ubuntu-latest - defaults: - run: - working-directory: ./packages/react-native-app - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup - uses: ./.github/actions/setup - - - name: Setup Azul Zulu OpenJDK - uses: actions/setup-java@v4 - with: - distribution: zulu - java-version: 21 - cache: gradle - - - name: Cache Android Build - uses: actions/cache@v4 - id: android-build-cache - with: - path: | - ./android/build - ./packages/react-native-app/android/.gradle - ./packages/react-native-app/android/app/build - ./packages/react-native-app/android/build - key: ${{ runner.os }}-android-build--${{ github.workflow }}-${{ github.sha }} - restore-keys: | - ${{ runner.os }}-android-build--${{ github.workflow }}-${{ github.sha }} - ${{ runner.os }}-android-build--${{ github.workflow }}- - - - name: Build Android - if: steps.android-build-cache.outputs.cache-hit != 'true' - run: yarn react-native build-android --mode release --tasks assembleRelease - - - name: Upload Android App - uses: actions/upload-artifact@v4 - with: - name: android-app - path: ./packages/react-native-app/android/app/build/outputs/apk/release/app-release.apk - - test-android: - name: Test Android - needs: [build-android] - runs-on: ubuntu-latest - defaults: - run: - working-directory: ./packages/react-native-app - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Enable KVM Group Permissions - run: | - echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules - sudo udevadm control --reload-rules - sudo udevadm trigger --name-match=kvm - - - name: Gradle cache - uses: gradle/actions/setup-gradle@v3 - - - name: Cache Android Virtual Device - uses: actions/cache@v4 - id: android-virtual-device-cache - with: - path: | - ~/.android/avd/* - ~/.android/adb* - key: android-virtual-device-api-level-33 - - - name: Create Android Virtual Device - if: steps.android-virtual-device-cache.outputs.cache-hit != 'true' - uses: reactivecircus/android-emulator-runner@v2 - with: - api-level: 33 - target: google_apis - arch: x86_64 - force-avd-creation: false - working-directory: ./packages/react-native-app - script: echo "Generated Android Virtual Device Snapshot for Caching" - - - name: Install Maestro - run: | - curl -Ls "https://get.maestro.mobile.dev" | bash - echo "$HOME/.maestro/bin" >> "$GITHUB_PATH" - - - name: Download Android App - uses: actions/download-artifact@v4 - with: - name: android-app - path: ./packages/react-native-app/android/ - - - name: Test Android - uses: reactivecircus/android-emulator-runner@v2 - with: - api-level: 33 - target: google_apis - arch: x86_64 - force-avd-creation: false - working-directory: ./packages/react-native-app - script: | - adb install ./android/app-release.apk - maestro test ./e2e/show-map.yml --format junit - - - name: Upload Android Report - if: always() - uses: actions/upload-artifact@v4 - with: - name: Android Report - path: | - ./packages/react-native-app/report.xml - ~/.maestro/tests/**/* - - build-ios: - name: Build iOS - needs: [lint-eslint, lint-tsc, test, codegen, build-library] - runs-on: macos-latest - timeout-minutes: 30 - defaults: - run: - working-directory: ./packages/react-native-app - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup - uses: ./.github/actions/setup - - - name: Cache Cocoapods - uses: actions/cache@v4 - id: cocoapods-cache - with: - path: ./packages/react-native-app/ios/Pods - key: ${{ runner.os }}-cocoapods-${{ hashFiles('./packages/react-native-app/ios/Podfile.lock') }} - restore-keys: | - ${{ runner.os }}-cocoapods-${{ hashFiles('./packages/react-native-app/ios/Podfile.lock') }} - ${{ runner.os }}-cocoapods- - - - name: Install Cocoapods - if: steps.cocoapods-cache.outputs.cache-hit != 'true' - run: yarn pod:install - - - name: Cache iOS Build - uses: actions/cache@v4 - id: ios-build-cache - with: - path: ./packages/react-native-app/ios/build - key: ${{ runner.os }}-ios-build--${{ github.workflow }}-${{ github.sha }} - restore-keys: | - ${{ runner.os }}-ios-build--${{ github.workflow }}-${{ github.sha }} - ${{ runner.os }}-ios-build--${{ github.workflow }}- - - - name: Build iOS - if: steps.ios-build-cache.outputs.cache-hit != 'true' - # Like `react-native build-ios --mode Release` but adapted for simulators - run: xcodebuild -workspace ios/MapLibreReactNativeExample.xcworkspace -scheme MapLibreReactNativeExample -configuration Release -sdk iphonesimulator -derivedDataPath ios/build - - - name: Upload iOS App - uses: actions/upload-artifact@v4 - with: - name: ios-app - # `.app` is a directory, so we have to archive one level above - path: | - ./packages/react-native-app/ios/build/Build/Products/Release-iphonesimulator - !./packages/react-native-app/ios/build/Build/Products/Release-iphonesimulator/** - ./packages/react-native-app/ios/build/Build/Products/Release-iphonesimulator/MapLibreReactNativeExample.app - - test-ios: - name: Test iOS - needs: [build-ios] - runs-on: macos-latest - defaults: - run: - working-directory: ./packages/react-native-app - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install Maestro - run: | - curl -Ls "https://get.maestro.mobile.dev" | bash - echo "$HOME/.maestro/bin" >> "$GITHUB_PATH" - - - name: Download iOS App - uses: actions/download-artifact@v4 - with: - name: ios-app - path: ./packages/react-native-app/ios - - - name: Test iOS - run: | - xcrun simctl boot "iPhone 15 Pro" - xcrun simctl install booted ./ios/MapLibreReactNativeExample.app - maestro test ./e2e/show-map.yml --format junit + review-android: + name: Review Android + uses: ./.github/workflows/review-android.yml - - name: Upload iOS Report - if: always() - uses: actions/upload-artifact@v4 - with: - name: iOS Report - path: | - ./packages/react-native-app/report.xml - ~/.maestro/tests/**/* + review-ios: + name: Review iOS + uses: ./.github/workflows/review-ios.yml