From b9776ffe61a02176b2f5949bbd703d4b6643fa45 Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy Date: Thu, 4 Aug 2022 14:42:27 +0200 Subject: [PATCH 1/2] improve android e2e --- .circleci/Brewfile.android | 3 -- .circleci/config.yml | 108 +++++++++++++------------------------ package.json | 6 ++- scripts/android_e2e.sh | 19 +++++++ 4 files changed, 59 insertions(+), 77 deletions(-) delete mode 100644 .circleci/Brewfile.android diff --git a/.circleci/Brewfile.android b/.circleci/Brewfile.android deleted file mode 100644 index aab0f9f3..00000000 --- a/.circleci/Brewfile.android +++ /dev/null @@ -1,3 +0,0 @@ -tap 'homebrew/cask' -cask 'android-sdk' -cask 'intel-haxm' diff --git a/.circleci/config.yml b/.circleci/config.yml index 3e5ef865..19a26d82 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -18,29 +18,28 @@ checkout step for each job: &addWorkspace default config for js: &js_defaults <<: *defaults docker: - - image: circleci/node:14 + - image: cimg/node:14.18.1 default config for macOS: &macos_defaults <<: *defaults resource_class: 'medium' macos: - xcode: '13.2.1' + xcode: '13.1.0' -config for macOS (android): &macos_defaults_android +config for android e2e: &android_e2e <<: *defaults - resource_class: 'medium' - macos: - xcode: '11.5.0' + resource_class: large + machine: + image: android:2022.06.2 default config for android apk builds: &android_defaults <<: *defaults docker: - - image: reactnativecommunity/react-native-android - resource_class: 'medium' - working_directory: ~/async_storage + - image: cimg/android:2021.10.2-node # node 14.18.1 + resource_class: medium environment: - - _JAVA_OPTIONS: '-XX:+UnlockExperimentalVMOptions -Xmx2048m' - - BUILD_THREADS: 2 + JAVA_OPTIONS: '-XX:+UnlockExperimentalVMOptions -Xmx2048m' + BUILD_THREADS: 2 # ============================== # CACHE CONFIG @@ -48,7 +47,6 @@ default config for android apk builds: &android_defaults cache keys: brew ios: &key_brew_ios cache-brew-ios-v5-{{ arch }} - brew android: &key_brew_android cache-brew-android-v4-{{ arch }} yarn: &key_yarn cache-yarn-{{ checksum "package.json" }}-{{ arch }} gradle: &key_gradle cache-gradle-v2-{{ checksum "example/android/gradle/wrapper/gradle-wrapper.properties" }}-{{ checksum "package.json" }}-{{ arch }} pods: &key_pods cache-pods-v0.64-{{ checksum "example/ios/Podfile" }}-{{ checksum "package.json" }}-{{ arch }} @@ -66,17 +64,6 @@ cache: keys: - *key_brew_ios - save brew cache for android: &cache_save_brew_android - name: Saving Brew cache for android - paths: - - ~/Library/Caches/Homebrew - key: *key_brew_android - - restore brew cache for android: &cache_restore_brew_android - name: Restoring Brew cache for android - keys: - - *key_brew_android - # yarn save yarn cache: &cache_save_yarn name: Saving Yarn cache @@ -229,71 +216,48 @@ jobs: - example/android/app/build/outputs/apk/* "Test: Android e2e": - <<: *macos_defaults_android + <<: *android_e2e steps: - *addWorkspace - run: - name: Configure env variables + name: "Install node v14.18.1 and yarn 1.22.17" command: | - echo 'export ANDROID_HOME="/usr/local/share/android-sdk"' >> $BASH_ENV - echo 'export ANDROID_SDK_ROOT="/usr/local/share/android-sdk"' >> $BASH_ENV - echo 'export PATH="$ANDROID_SDK_ROOT/emulator:$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools:$PATH"' >> $BASH_ENV - echo 'export QEMU_AUDIO_DRV=none' >> $BASH_ENV - echo 'export JAVA_HOME=$(/usr/libexec/java_home)' >> $BASH_ENV - source $BASH_ENV - - restore-cache: *cache_restore_brew_android + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash + source ~/.bashrc + nvm install v14.18.1 + node -v + npm install --global yarn@1.22.17 + yarn -v + - restore_cache: *cache_restore_yarn - run: - name: Install Android SDK tools - command: | - brew update --preinstall - brew bundle --file=.circleci/Brewfile.android --no-lock - - save-cache: *cache_save_brew_android + name: Install dependencies + command: yarn --pure-lockfile --non-interactive --cache-folder ~/.cache/yarn + - save_cache: *cache_save_yarn - run: - name: Install Android emulator - shell: /bin/bash -e + name: Configure Environment Variables command: | - yes | sdkmanager "platform-tools" "tools" 1> /dev/null - yes | sdkmanager "platforms;android-28" "system-images;android-28;default;x86_64" 1> /dev/null - yes | sdkmanager "emulator" --channel=3 1> /dev/null - yes | sdkmanager "build-tools;28.0.3" 1> /dev/null - yes | sdkmanager --licenses 1> /dev/null - yes | sdkmanager --list + echo 'export QEMU_AUDIO_DRV=none' >> $BASH_ENV + echo 'export PATH="$PATH:~/async_storage/node_modules/.bin"' >> $BASH_ENV + source $BASH_ENV - run: - name: ADB start/stop + name: Install Android system image command: | - adb start-server - adb devices - adb kill-server - ls -la ~/.android + sdkmanager "system-images;android-30;default;x86_64" - run: - name: Create emulator + name: "Create Android emulator" command: | - avdmanager create avd --force \ - -n "Emu_E2E" \ - -k "system-images;android-28;default;x86_64" \ - -g "default" \ - -d "pixel" + avdmanager create avd -n E2E_API_30 -d pixel_4 --package "system-images;android-30;default;x86_64" - run: - name: Start emulator in background - background: true + name: Launch emulator command: | - emulator -avd "Emu_E2E" \ - -cores 1 \ - -gpu auto \ - -accel on \ - -memory 1024 \ - -no-audio \ - -no-snapshot \ - -no-boot-anim \ - -no-window \ - -logcat '*:E ReactNative:W ReactNativeJS:*' + emulator -avd E2E_API_30 -delay-adb -verbose -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim + background: true + - run: + name: "Make sure TestButler apk is present" + command: ./scripts/android_e2e.sh 'install_test_butler' - run: name: Wait for emulator to boot command: ./scripts/android_e2e.sh 'wait_for_emulator' - - run: - name: Wake device - command: | - adb shell input keyevent 82 - run: name: Run e2e tests command: yarn test:e2e:android diff --git a/package.json b/package.json index 293a9453..41c6e0cf 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,8 @@ "testBinaryPath": "example/android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk", "type": "android.emulator", "device": { - "avdName": "Emu_E2E" + "avdName": "E2E_API_30", + "utilBinaryPaths": ["/var/tmp/test-butler.apk"] } }, "android.emu.release.next": { @@ -128,7 +129,8 @@ "testBinaryPath": "example/android/app/build/outputs/apk/androidTest/release/app-release-androidTest.apk", "type": "android.emulator", "device": { - "avdName": "Emu_E2E" + "avdName": "E2E_API_30", + "utilBinaryPaths": ["/var/tmp/test-butler.apk"] } } } diff --git a/scripts/android_e2e.sh b/scripts/android_e2e.sh index 797abff2..28f7be58 100755 --- a/scripts/android_e2e.sh +++ b/scripts/android_e2e.sh @@ -40,6 +40,22 @@ wait_for_emulator_to_boot() { echo "[Detox e2e] Emulator booted." } +install_test_butler() { + apkPath=/var/tmp/test-butler.apk + + if [ -f $apkPath ]; then + echo "[Detox e2e] TestButler apk exists, skipping" + else + curl -o $apkPath "https://repo1.maven.org/maven2/com/linkedin/testbutler/test-butler-app/2.2.1/test-butler-app-2.2.1.apk" + echo + echo "[Detox e2e] TestButler app saved to $apkPath" + fi +} + + + + + case $1 in wait_for_emulator) @@ -51,6 +67,9 @@ case $1 in bundle) shift; bundle_js $@ ;; + install_test_butler) + install_test_butler + ;; *) echo -n "Unknown argument: $1" ;; From 63906cc374acff7e30183d0c8b7effc052e0c43c Mon Sep 17 00:00:00 2001 From: Krzysztof Borowy Date: Mon, 8 Aug 2022 10:21:55 +0200 Subject: [PATCH 2/2] use one executor for android --- .circleci/config.yml | 47 ++++++++++++-------------------------------- 1 file changed, 13 insertions(+), 34 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 19a26d82..5663b770 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -26,21 +26,12 @@ default config for macOS: &macos_defaults macos: xcode: '13.1.0' -config for android e2e: &android_e2e +default config for android apk tests: &android_defaults <<: *defaults resource_class: large machine: image: android:2022.06.2 -default config for android apk builds: &android_defaults - <<: *defaults - docker: - - image: cimg/android:2021.10.2-node # node 14.18.1 - resource_class: medium - environment: - JAVA_OPTIONS: '-XX:+UnlockExperimentalVMOptions -Xmx2048m' - BUILD_THREADS: 2 - # ============================== # CACHE CONFIG # ============================== @@ -196,27 +187,8 @@ jobs: name: Run e2e tests command: yarn test:e2e:ios - "Build: Android release apk": - <<: *android_defaults - steps: - - *addWorkspace - - run: - name: Bundle JS - command: yarn bundle:android --dev false - - run: - name: Build APKs - command: yarn build:e2e:android - - run: - name: Build APK with Next storage - working_directory: example/android - command: ./gradlew assembleNext --max-workers 2 - - persist_to_workspace: - root: ~/async_storage - paths: - - example/android/app/build/outputs/apk/* - "Test: Android e2e": - <<: *android_e2e + <<: *android_defaults steps: - *addWorkspace - run: @@ -233,6 +205,16 @@ jobs: name: Install dependencies command: yarn --pure-lockfile --non-interactive --cache-folder ~/.cache/yarn - save_cache: *cache_save_yarn + - run: + name: Bundle JS + command: yarn bundle:android --dev false + - run: + name: Build APKs + command: yarn build:e2e:android + - run: + name: Build APK with Next storage + working_directory: example/android + command: ./gradlew assembleNext --max-workers 2 - run: name: Configure Environment Variables command: | @@ -297,14 +279,11 @@ workflows: requires: - "Test: lint" - "Test: TypeScript" - - "Build: Android release apk": + - "Test: Android e2e": requires: - "Test: lint" - "Test: TypeScript" - "Test: Android unit" - - "Test: Android e2e": - requires: - - "Build: Android release apk" - "Release": requires: - "Test: iOS e2e"