diff --git a/.github/workflows/e2e-mobile.yml b/.github/workflows/e2e-mobile.yml new file mode 100644 index 000000000..15f27da15 --- /dev/null +++ b/.github/workflows/e2e-mobile.yml @@ -0,0 +1,330 @@ +name: Mobile E2E Tests + +on: + push: + branches: [feat/devbox-e2e-latest] + workflow_dispatch: + inputs: + example: + description: 'Example to test (E2E-latest, E2E-compat, or all)' + type: choice + options: [all, E2E-latest, E2E-compat] + default: all + +concurrency: + group: e2e-mobile-${{ github.ref }} + cancel-in-progress: true + +jobs: + android-e2e-compat: + name: Android E2E (RN 0.72 + Old Arch, API 24) + runs-on: ubuntu-24.04 + timeout-minutes: 45 + defaults: + run: + working-directory: examples/E2E-compat + env: + ANDROID_DEVICES: min + ANDROID_DEFAULT_DEVICE: min + steps: + - uses: actions/checkout@v4 + + - name: Enable KVM + 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: Free disk space + run: | + sudo rm -rf /usr/local/lib/android /usr/share/dotnet /opt/ghc \ + /usr/local/share/powershell /usr/local/share/chromium \ + /usr/local/share/boost /opt/hostedtoolcache + sudo apt-get clean + df -h / + + - name: Setup Gradle cache + uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-compat-${{ hashFiles('examples/E2E-compat/android/gradle/wrapper/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle-compat- + + - name: Install Devbox + uses: jetify-com/devbox-install-action@v0.14.0 + with: + enable-cache: true + project-path: examples/E2E-compat + + - name: Install root dependencies + working-directory: . + run: devbox run --pure -- yarn install --no-immutable + + - name: Install dependencies + run: devbox run --pure -- yarn install --no-immutable + + - name: Build Android (release) + run: devbox run --pure build:android + + - name: Start emulator + run: devbox run --pure -e EMU_HEADLESS=1 start:emu min + + - name: Run Detox tests + run: devbox run --pure -- yarn detox test --configuration android.emu.release + continue-on-error: true + + - name: Stop emulator + if: always() + run: devbox run --pure stop:emu || true + + - name: Upload test results + if: always() + uses: actions/upload-artifact@v4 + with: + name: e2e-compat-android-results + path: examples/E2E-compat/artifacts/ + if-no-files-found: ignore + + android-e2e-latest: + if: false # Disabled until E2E-latest fixes land in separate PR + name: Android E2E (RN 0.84 + New Arch, API 36) + runs-on: ubuntu-24.04 + timeout-minutes: 45 + defaults: + run: + working-directory: examples/E2E-latest + env: + ANDROID_DEVICES: max + ANDROID_DEFAULT_DEVICE: max + steps: + - uses: actions/checkout@v4 + + - name: Enable KVM + 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: Free disk space + run: | + sudo rm -rf /usr/local/lib/android /usr/share/dotnet /opt/ghc \ + /usr/local/share/powershell /usr/local/share/chromium \ + /usr/local/share/boost /opt/hostedtoolcache + sudo apt-get clean + df -h / + + - name: Setup Gradle cache + uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-latest-${{ hashFiles('examples/E2E-latest/android/gradle/wrapper/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle-latest- + + - name: Install Devbox + uses: jetify-com/devbox-install-action@v0.14.0 + with: + enable-cache: true + project-path: examples/E2E-latest + + - name: Install root dependencies + working-directory: . + run: devbox run --pure -- yarn install --no-immutable + + - name: Install dependencies + run: devbox run --pure -- yarn install --no-immutable + + - name: Build Android (release) + run: devbox run --pure build:android + + - name: Start emulator + run: devbox run --pure -e EMU_HEADLESS=1 start:emu max + + - name: Run Detox tests + run: devbox run --pure -- yarn detox test --configuration android.emu.release + continue-on-error: true + + - name: Stop emulator + if: always() + run: devbox run --pure stop:emu || true + + - name: Upload test results + if: always() + uses: actions/upload-artifact@v4 + with: + name: e2e-latest-android-results + path: examples/E2E-latest/artifacts/ + if-no-files-found: ignore + + ios-e2e-compat: + name: iOS E2E (RN 0.72 + Old Arch, iOS 18.5) + runs-on: macos-15 + timeout-minutes: 45 + defaults: + run: + working-directory: examples/E2E-compat + env: + IOS_DEVICES: min + IOS_DEFAULT_DEVICE: min + IOS_DOWNLOAD_RUNTIME: '0' + steps: + - uses: actions/checkout@v4 + + - name: Select Xcode + run: | + XCODE_APP=$(ls -d /Applications/Xcode_16*.app 2>/dev/null | sort -V | tail -1) + if [ -z "$XCODE_APP" ]; then + XCODE_APP="/Applications/Xcode.app" + fi + echo "Selecting: $XCODE_APP" + sudo xcode-select -s "$XCODE_APP/Contents/Developer" + xcodebuild -version + xcrun simctl list runtimes | grep -i ios + + - name: Setup CocoaPods cache + uses: actions/cache@v4 + with: + path: | + ~/.cocoapods/repos + ~/Library/Caches/CocoaPods + key: ${{ runner.os }}-pods-compat-${{ hashFiles('examples/E2E-compat/ios/Podfile.lock') }} + restore-keys: | + ${{ runner.os }}-pods-compat- + + - name: Install Devbox + uses: jetify-com/devbox-install-action@v0.14.0 + with: + enable-cache: true + project-path: examples/E2E-compat + + - name: Install iOS dependencies + run: devbox run --pure -- segkit doctor --fix || true + + - name: Install root dependencies + working-directory: . + run: devbox run --pure -- yarn install --no-immutable + + - name: Install dependencies + run: devbox run --pure -- yarn install --no-immutable + + - name: Install pods + run: devbox run --pure install:pods + + - name: Build iOS (release) + run: devbox run --pure build:ios + + - name: Start simulator + run: devbox run --pure -e SIM_HEADLESS=1 start:sim min + + - name: Run Detox tests + run: devbox run --pure -- yarn detox test --configuration ios.sim.release + continue-on-error: true + + - name: Stop simulator + if: always() + run: devbox run --pure stop:sim || true + + - name: Upload test results + if: always() + uses: actions/upload-artifact@v4 + with: + name: e2e-compat-ios-results + path: examples/E2E-compat/artifacts/ + if-no-files-found: ignore + + ios-e2e-latest: + if: false # Disabled until E2E-latest fixes land in separate PR + name: iOS E2E (RN 0.84 + New Arch, iOS 26.2) + runs-on: macos-26 + timeout-minutes: 45 + defaults: + run: + working-directory: examples/E2E-latest + env: + IOS_DEVICES: max + IOS_DEFAULT_DEVICE: max + IOS_DOWNLOAD_RUNTIME: '0' + steps: + - uses: actions/checkout@v4 + + - name: Select Xcode + run: | + XCODE_APP=$(ls -d /Applications/Xcode_26*.app 2>/dev/null | sort -V | tail -1) + if [ -z "$XCODE_APP" ]; then + XCODE_APP="/Applications/Xcode.app" + fi + echo "Selecting: $XCODE_APP" + sudo xcode-select -s "$XCODE_APP/Contents/Developer" + xcodebuild -version + xcrun simctl list runtimes | grep -i ios + + - name: Setup CocoaPods cache + uses: actions/cache@v4 + with: + path: | + ~/.cocoapods/repos + ~/Library/Caches/CocoaPods + key: ${{ runner.os }}-pods-latest-${{ hashFiles('examples/E2E-latest/ios/Podfile.lock') }} + restore-keys: | + ${{ runner.os }}-pods-latest- + + - name: Install Devbox + uses: jetify-com/devbox-install-action@v0.14.0 + with: + enable-cache: true + project-path: examples/E2E-latest + + - name: Install iOS dependencies + run: devbox run --pure -- segkit doctor --fix || true + + - name: Install root dependencies + working-directory: . + run: devbox run --pure -- yarn install --no-immutable + + - name: Install dependencies + run: devbox run --pure -- yarn install --no-immutable + + - name: Install pods + run: devbox run --pure install:pods + + - name: Build iOS (release) + run: devbox run --pure build:ios + + - name: Start simulator + run: devbox run --pure -e SIM_HEADLESS=1 start:sim max + + - name: Run Detox tests + run: devbox run --pure -- yarn detox test --configuration ios.sim.release + continue-on-error: true + + - name: Stop simulator + if: always() + run: devbox run --pure stop:sim || true + + - name: Upload test results + if: always() + uses: actions/upload-artifact@v4 + with: + name: e2e-latest-ios-results + path: examples/E2E-latest/artifacts/ + if-no-files-found: ignore + + summary: + name: E2E Summary + runs-on: ubuntu-latest + needs: [android-e2e-compat, ios-e2e-compat] + if: always() + steps: + - name: Report results + run: | + echo "## Mobile E2E Test Results" + echo "" + echo "| Example | Platform | Result |" + echo "|---------|----------|--------|" + echo "| E2E-compat (RN 0.72, Old Arch) | Android (API 24) | ${{ needs.android-e2e-compat.result }} |" + echo "| E2E-compat (RN 0.72, Old Arch) | iOS (18.5) | ${{ needs.ios-e2e-compat.result }} |" diff --git a/.gitignore b/.gitignore index 3dad8cc4e..58a525af4 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,7 @@ AGENTS.md # Notes and research (not for commit) notes/ + +# Devbox +.devbox/ +devbox.lock diff --git a/examples/AnalyticsReactNativeExample/android/build.gradle b/examples/AnalyticsReactNativeExample/android/build.gradle index a9ea02369..df3672ba5 100644 --- a/examples/AnalyticsReactNativeExample/android/build.gradle +++ b/examples/AnalyticsReactNativeExample/android/build.gradle @@ -1,11 +1,18 @@ buildscript { ext { - buildToolsVersion = "35.0.0" + def compileSdkEnv = System.getenv("ANDROID_COMPILE_SDK") ?: System.getenv("ANDROID_MAX_API") ?: "35" + def targetSdkEnv = System.getenv("ANDROID_TARGET_SDK") ?: System.getenv("ANDROID_MAX_API") ?: "35" + buildToolsVersion = System.getenv("ANDROID_BUILD_TOOLS_VERSION") ?: "35.0.0" minSdkVersion = 24 - compileSdkVersion = 35 - targetSdkVersion = 34 - ndkVersion = "26.1.10909125" - kotlinVersion = "1.9.24" + compileSdkVersion = compileSdkEnv.toInteger() + targetSdkVersion = targetSdkEnv.toInteger() + kotlinVersion = "2.1.20" + def ndkVersionEnv = System.getenv("ANDROID_NDK_VERSION") + if (ndkVersionEnv) { + ndkVersion = ndkVersionEnv + } else { + ndkVersion = "26.1.10909125" + } } repositories { google() diff --git a/examples/AnalyticsReactNativeExample/devbox.d/segment-integrations.mobile-devtools.android/devices/devices.lock b/examples/AnalyticsReactNativeExample/devbox.d/segment-integrations.mobile-devtools.android/devices/devices.lock new file mode 100644 index 000000000..3208cb678 --- /dev/null +++ b/examples/AnalyticsReactNativeExample/devbox.d/segment-integrations.mobile-devtools.android/devices/devices.lock @@ -0,0 +1,11 @@ +{ + "devices": [ + { + "name": "medium_phone_api36", + "api": 36, + "device": "medium_phone", + "tag": "google_apis" + } + ], + "checksum": "e1a32475f99e1b20d5f0a20076f5ccade1803a8fe88af3bbad56e3e89ba332b7" +} diff --git a/examples/AnalyticsReactNativeExample/devbox.d/segment-integrations.mobile-devtools.android/devices/max.json b/examples/AnalyticsReactNativeExample/devbox.d/segment-integrations.mobile-devtools.android/devices/max.json new file mode 100644 index 000000000..7ed1bd7d2 --- /dev/null +++ b/examples/AnalyticsReactNativeExample/devbox.d/segment-integrations.mobile-devtools.android/devices/max.json @@ -0,0 +1,6 @@ +{ + "name": "medium_phone_api36", + "api": 36, + "device": "medium_phone", + "tag": "google_apis" +} diff --git a/examples/AnalyticsReactNativeExample/devbox.d/segment-integrations.mobile-devtools.ios/devices/devices.lock b/examples/AnalyticsReactNativeExample/devbox.d/segment-integrations.mobile-devtools.ios/devices/devices.lock new file mode 100644 index 000000000..6d1cfbc8a --- /dev/null +++ b/examples/AnalyticsReactNativeExample/devbox.d/segment-integrations.mobile-devtools.ios/devices/devices.lock @@ -0,0 +1,9 @@ +{ + "devices": [ + { + "name": "iPhone 17", + "runtime": "26.2" + } + ], + "checksum": "7d4b3ac2354a9fd80740d7f9ab5313b3e39fc87d59174e154e04c4996c332186" +} diff --git a/examples/AnalyticsReactNativeExample/devbox.d/segment-integrations.mobile-devtools.ios/devices/max.json b/examples/AnalyticsReactNativeExample/devbox.d/segment-integrations.mobile-devtools.ios/devices/max.json new file mode 100644 index 000000000..0e76d6983 --- /dev/null +++ b/examples/AnalyticsReactNativeExample/devbox.d/segment-integrations.mobile-devtools.ios/devices/max.json @@ -0,0 +1,4 @@ +{ + "name": "iPhone 17", + "runtime": "26.2" +} diff --git a/examples/AnalyticsReactNativeExample/devbox.json b/examples/AnalyticsReactNativeExample/devbox.json new file mode 100644 index 000000000..e05a3d5a5 --- /dev/null +++ b/examples/AnalyticsReactNativeExample/devbox.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.14.2/.schema/devbox.schema.json", + "include": [ + "github:segment-integrations/mobile-devtools?dir=plugins/react-native&ref=main" + ], + "packages": { + "yarn-berry": "latest" + }, + "env": { + "ANDROID_APP_APK": "android/app/build/outputs/apk/debug/app-debug.apk", + "IOS_APP_ARTIFACT": "ios/build/Build/Products/Debug-iphonesimulator/*.app" + }, + "shell": { + "scripts": { + "install": ["yarn install --no-immutable"], + "install:pods": ["cd ios && pod install && cd .."], + "build:android": ["cd android && ./gradlew assembleDebug && cd .."], + "build:ios": [ + "xcodebuild -workspace ios/AnalyticsReactNativeExample.xcworkspace -scheme AnalyticsReactNativeExample -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build build" + ] + } + } +} diff --git a/examples/E2E-compat/android/app/build.gradle b/examples/E2E-compat/android/app/build.gradle index 2afd7a5c5..f044c6716 100644 --- a/examples/E2E-compat/android/app/build.gradle +++ b/examples/E2E-compat/android/app/build.gradle @@ -73,6 +73,10 @@ android { compileSdkVersion rootProject.ext.compileSdkVersion + lint { + checkReleaseBuilds false + } + namespace "com.AnalyticsReactNativeE2E" defaultConfig { applicationId "com.AnalyticsReactNativeE2E" diff --git a/examples/E2E-compat/android/build.gradle b/examples/E2E-compat/android/build.gradle index c83bf5b8a..86a0973b6 100644 --- a/examples/E2E-compat/android/build.gradle +++ b/examples/E2E-compat/android/build.gradle @@ -2,16 +2,20 @@ buildscript { ext { - // Default to the build-tools pinned in devbox; allow override via ANDROID_BUILD_TOOLS_VERSION. - // Keep in sync with nix/flake.nix when ANDROID_BUILD_TOOLS_VERSION is unset. - buildToolsVersion = System.getenv("ANDROID_BUILD_TOOLS_VERSION") ?: "30.0.3" - minSdkVersion = 21 - compileSdkVersion = 33 - targetSdkVersion = 33 - kotlinVersion="1.7.20" - - // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP. - ndkVersion = "23.1.7779620" + def compileSdkEnv = System.getenv("ANDROID_COMPILE_SDK") ?: System.getenv("ANDROID_MAX_API") ?: "33" + def targetSdkEnv = System.getenv("ANDROID_TARGET_SDK") ?: System.getenv("ANDROID_MAX_API") ?: "33" + buildToolsVersion = System.getenv("ANDROID_BUILD_TOOLS_VERSION") ?: "36.1.0" + def minSdkEnv = System.getenv("ANDROID_MIN_SDK") ?: "21" + minSdkVersion = minSdkEnv.toInteger() + compileSdkVersion = compileSdkEnv.toInteger() + targetSdkVersion = targetSdkEnv.toInteger() + kotlinVersion = "1.7.20" + def ndkVersionEnv = System.getenv("ANDROID_NDK_VERSION") + if (ndkVersionEnv) { + ndkVersion = ndkVersionEnv + } else { + ndkVersion = "23.1.7779620" + } } repositories { google() @@ -37,3 +41,14 @@ allprojects { maven { url 'https://www.jitpack.io' } } } + +subprojects { + afterEvaluate { project -> + if (project.hasProperty("android")) { + project.android { + buildToolsVersion rootProject.ext.buildToolsVersion + compileSdkVersion rootProject.ext.compileSdkVersion + } + } + } +} diff --git a/examples/E2E-compat/devbox.d/segment-integrations.mobile-devtools.android/android.lock b/examples/E2E-compat/devbox.d/segment-integrations.mobile-devtools.android/android.lock new file mode 100644 index 000000000..a5dc949af --- /dev/null +++ b/examples/E2E-compat/devbox.d/segment-integrations.mobile-devtools.android/android.lock @@ -0,0 +1,15 @@ +{ + "ANDROID_BUILD_TOOLS_VERSION": "36.1.0", + "ANDROID_CMDLINE_TOOLS_VERSION": "19.0", + "ANDROID_MIN_SDK": 21, + "ANDROID_COMPILE_SDK": 33, + "ANDROID_TARGET_SDK": 33, + "ANDROID_SYSTEM_IMAGE_TAG": "google_apis", + "ANDROID_INCLUDE_NDK": true, + "ANDROID_NDK_VERSION": "29.0.14206865", + "ANDROID_INCLUDE_CMAKE": true, + "ANDROID_CMAKE_VERSION": "4.1.2", + "hash_overrides": { + "https://dl.google.com/android/repository/platform-tools_r37.0.0-darwin.zip": "8c4c926d0ca192376b2a04b0318484724319e67c" + } +} diff --git a/examples/E2E-compat/devbox.d/segment-integrations.mobile-devtools.android/devices/devices.lock b/examples/E2E-compat/devbox.d/segment-integrations.mobile-devtools.android/devices/devices.lock new file mode 100644 index 000000000..12130a25b --- /dev/null +++ b/examples/E2E-compat/devbox.d/segment-integrations.mobile-devtools.android/devices/devices.lock @@ -0,0 +1,11 @@ +{ + "devices": [ + { + "name": "pixel_api24", + "api": 24, + "device": "pixel", + "tag": "google_apis" + } + ], + "checksum": "93099557d956ddc4fcf2e273706fb7ccb066c63f2ff5c2316db3e2edab36ff9d" +} diff --git a/examples/E2E-compat/devbox.d/segment-integrations.mobile-devtools.android/devices/min.json b/examples/E2E-compat/devbox.d/segment-integrations.mobile-devtools.android/devices/min.json new file mode 100644 index 000000000..64984b872 --- /dev/null +++ b/examples/E2E-compat/devbox.d/segment-integrations.mobile-devtools.android/devices/min.json @@ -0,0 +1,6 @@ +{ + "name": "pixel_api24", + "api": 24, + "device": "pixel", + "tag": "google_apis" +} diff --git a/examples/E2E-compat/devbox.d/segment-integrations.mobile-devtools.ios/devices/devices.lock b/examples/E2E-compat/devbox.d/segment-integrations.mobile-devtools.ios/devices/devices.lock new file mode 100644 index 000000000..a44fcb97e --- /dev/null +++ b/examples/E2E-compat/devbox.d/segment-integrations.mobile-devtools.ios/devices/devices.lock @@ -0,0 +1,9 @@ +{ + "devices": [ + { + "name": "iPhone 16", + "runtime": "18.5" + } + ], + "checksum": "a862ccf7e6d2fd79e25925e43a32c553bcec00fbf288dc494cf4d499e1a20731" +} diff --git a/examples/E2E-compat/devbox.d/segment-integrations.mobile-devtools.ios/devices/min.json b/examples/E2E-compat/devbox.d/segment-integrations.mobile-devtools.ios/devices/min.json new file mode 100644 index 000000000..fedd591f3 --- /dev/null +++ b/examples/E2E-compat/devbox.d/segment-integrations.mobile-devtools.ios/devices/min.json @@ -0,0 +1,4 @@ +{ + "name": "iPhone 16", + "runtime": "18.5" +} diff --git a/examples/E2E-compat/devbox.json b/examples/E2E-compat/devbox.json new file mode 100644 index 000000000..8d50b2e4b --- /dev/null +++ b/examples/E2E-compat/devbox.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.14.2/.schema/devbox.schema.json", + "include": [ + "github:segment-integrations/mobile-devtools?dir=plugins/react-native&ref=main" + ], + "packages": { + "yarn-berry": "latest", + "jdk": "17" + }, + "env": { + "ANDROID_APP_APK": "android/app/build/outputs/apk/release/app-release.apk", + "IOS_APP_ARTIFACT": "ios/build/Build/Products/Release-iphonesimulator/*.app", + "ANDROID_COMPILE_SDK": "33", + "ANDROID_TARGET_SDK": "33", + "ANDROID_BUILD_TOOLS_VERSION": "36.1.0" + }, + "shell": { + "scripts": { + "install": ["yarn install --no-immutable"], + "install:pods": ["cd ios && pod install && cd .."], + "build:android": ["cd android && ./gradlew assembleRelease && cd .."], + "build:ios": [ + "xcodebuild -workspace ios/AnalyticsReactNativeE2E.xcworkspace -scheme AnalyticsReactNativeE2E -configuration Release -sdk iphonesimulator -derivedDataPath ios/build build" + ], + "test:android": [ + "devbox run start:emu", + "yarn detox test --configuration android.emu.release" + ], + "test:ios": [ + "devbox run start:sim", + "yarn detox test --configuration ios.sim.release" + ] + } + } +} diff --git a/examples/E2E-compat/metro.config.js b/examples/E2E-compat/metro.config.js index 1a42bef66..2aa9b5938 100644 --- a/examples/E2E-compat/metro.config.js +++ b/examples/E2E-compat/metro.config.js @@ -3,7 +3,7 @@ const path = require('path'); const escape = require('escape-string-regexp'); const exclusionList = require('metro-config/src/defaults/exclusionList'); const {peerDeps} = require('./workspace'); -const modules = [...peerDeps]; +const modules = [...peerDeps, 'uuid']; const root = path.resolve(__dirname, '..', '..'); const defaultSourceExts = diff --git a/examples/E2E-latest/android/app/build.gradle b/examples/E2E-latest/android/app/build.gradle index 2afd7a5c5..f044c6716 100644 --- a/examples/E2E-latest/android/app/build.gradle +++ b/examples/E2E-latest/android/app/build.gradle @@ -73,6 +73,10 @@ android { compileSdkVersion rootProject.ext.compileSdkVersion + lint { + checkReleaseBuilds false + } + namespace "com.AnalyticsReactNativeE2E" defaultConfig { applicationId "com.AnalyticsReactNativeE2E" diff --git a/examples/E2E-latest/android/build.gradle b/examples/E2E-latest/android/build.gradle index c83bf5b8a..4fd459334 100644 --- a/examples/E2E-latest/android/build.gradle +++ b/examples/E2E-latest/android/build.gradle @@ -2,16 +2,20 @@ buildscript { ext { - // Default to the build-tools pinned in devbox; allow override via ANDROID_BUILD_TOOLS_VERSION. - // Keep in sync with nix/flake.nix when ANDROID_BUILD_TOOLS_VERSION is unset. - buildToolsVersion = System.getenv("ANDROID_BUILD_TOOLS_VERSION") ?: "30.0.3" - minSdkVersion = 21 - compileSdkVersion = 33 - targetSdkVersion = 33 - kotlinVersion="1.7.20" - - // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP. - ndkVersion = "23.1.7779620" + def compileSdkEnv = System.getenv("ANDROID_COMPILE_SDK") ?: System.getenv("ANDROID_MAX_API") ?: "33" + def targetSdkEnv = System.getenv("ANDROID_TARGET_SDK") ?: System.getenv("ANDROID_MAX_API") ?: "33" + buildToolsVersion = System.getenv("ANDROID_BUILD_TOOLS_VERSION") ?: "36.1.0" + def minSdkEnv = System.getenv("ANDROID_MIN_SDK") ?: "21" + minSdkVersion = minSdkEnv.toInteger() + compileSdkVersion = compileSdkEnv.toInteger() + targetSdkVersion = targetSdkEnv.toInteger() + kotlinVersion = "1.7.20" + def ndkVersionEnv = System.getenv("ANDROID_NDK_VERSION") + if (ndkVersionEnv) { + ndkVersion = ndkVersionEnv + } else { + ndkVersion = "23.1.7779620" + } } repositories { google() diff --git a/examples/E2E-latest/devbox.d/segment-integrations.mobile-devtools.android/devices/devices.lock b/examples/E2E-latest/devbox.d/segment-integrations.mobile-devtools.android/devices/devices.lock new file mode 100644 index 000000000..3208cb678 --- /dev/null +++ b/examples/E2E-latest/devbox.d/segment-integrations.mobile-devtools.android/devices/devices.lock @@ -0,0 +1,11 @@ +{ + "devices": [ + { + "name": "medium_phone_api36", + "api": 36, + "device": "medium_phone", + "tag": "google_apis" + } + ], + "checksum": "e1a32475f99e1b20d5f0a20076f5ccade1803a8fe88af3bbad56e3e89ba332b7" +} diff --git a/examples/E2E-latest/devbox.d/segment-integrations.mobile-devtools.android/devices/max.json b/examples/E2E-latest/devbox.d/segment-integrations.mobile-devtools.android/devices/max.json new file mode 100644 index 000000000..7ed1bd7d2 --- /dev/null +++ b/examples/E2E-latest/devbox.d/segment-integrations.mobile-devtools.android/devices/max.json @@ -0,0 +1,6 @@ +{ + "name": "medium_phone_api36", + "api": 36, + "device": "medium_phone", + "tag": "google_apis" +} diff --git a/examples/E2E-latest/devbox.d/segment-integrations.mobile-devtools.ios/devices/devices.lock b/examples/E2E-latest/devbox.d/segment-integrations.mobile-devtools.ios/devices/devices.lock new file mode 100644 index 000000000..6d1cfbc8a --- /dev/null +++ b/examples/E2E-latest/devbox.d/segment-integrations.mobile-devtools.ios/devices/devices.lock @@ -0,0 +1,9 @@ +{ + "devices": [ + { + "name": "iPhone 17", + "runtime": "26.2" + } + ], + "checksum": "7d4b3ac2354a9fd80740d7f9ab5313b3e39fc87d59174e154e04c4996c332186" +} diff --git a/examples/E2E-latest/devbox.d/segment-integrations.mobile-devtools.ios/devices/max.json b/examples/E2E-latest/devbox.d/segment-integrations.mobile-devtools.ios/devices/max.json new file mode 100644 index 000000000..0e76d6983 --- /dev/null +++ b/examples/E2E-latest/devbox.d/segment-integrations.mobile-devtools.ios/devices/max.json @@ -0,0 +1,4 @@ +{ + "name": "iPhone 17", + "runtime": "26.2" +} diff --git a/examples/E2E-latest/devbox.json b/examples/E2E-latest/devbox.json new file mode 100644 index 000000000..6900a6294 --- /dev/null +++ b/examples/E2E-latest/devbox.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.14.2/.schema/devbox.schema.json", + "include": [ + "github:segment-integrations/mobile-devtools?dir=plugins/react-native&ref=main" + ], + "packages": { + "yarn-berry": "latest" + }, + "env": { + "ANDROID_APP_APK": "android/app/build/outputs/apk/release/app-release.apk", + "IOS_APP_ARTIFACT": "ios/build/Build/Products/Release-iphonesimulator/*.app", + "ANDROID_COMPILE_SDK": "36", + "ANDROID_BUILD_TOOLS_VERSION": "36.1.0" + }, + "shell": { + "scripts": { + "install": ["yarn install --no-immutable"], + "install:pods": ["cd ios && pod install && cd .."], + "build:android": ["cd android && ./gradlew assembleRelease && cd .."], + "build:ios": [ + "xcodebuild -workspace ios/AnalyticsReactNativeE2E.xcworkspace -scheme AnalyticsReactNativeE2E -configuration Release -sdk iphonesimulator -derivedDataPath ios/build build" + ], + "test:android": [ + "devbox run start:emu", + "yarn detox test --configuration android.emu.release" + ], + "test:ios": [ + "devbox run start:sim", + "yarn detox test --configuration ios.sim.release" + ] + } + } +}