From 2472d915ab94e489f8f3ad9f56ef356860281bf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ramos?= Date: Tue, 15 May 2018 17:25:16 -0700 Subject: [PATCH] Consolidate CI/local test scripts Summary: Update `scripts/run-android-emulator.sh` to use same settings as Circle CI when creating and launching an AVD. This helps provide a known good configuration, useful for running Android tests locally. Run `scripts/run-android-emulator.sh` and confirm AVD is created && launched Run `scripts/run-android-emulator.sh` again and see message about AVD already running Run `test_android` on CI and observe AVD is launched. Run `runXcodeTests.sh` and confirm unit tests run. Run CI and confirm iOS unit tests run. [GENERAL][MINOR][`scripts`] - Consolidate CI/local test scripts Closes https://github.com/facebook/react-native/pull/19228 Differential Revision: D8019888 Pulled By: hramos fbshipit-source-id: 28b12c2e781ee80bcc90c22e691a5acb16232369 --- .circleci/config.yml | 20 +++++----- ...un-android-docker-instrumentation-tests.sh | 2 +- runXcodeTests.sh | 24 ++++++------ scripts/.tests.env | 32 +++++++++++++++ ...e-ci-android-setup.sh => android-setup.sh} | 39 +++++++++---------- scripts/run-android-emulator.sh | 14 +++++-- scripts/validate-android-device-env.sh | 0 7 files changed, 85 insertions(+), 46 deletions(-) create mode 100644 scripts/.tests.env rename scripts/{circle-ci-android-setup.sh => android-setup.sh} (69%) mode change 100644 => 100755 scripts/validate-android-device-env.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index 22aaf594a..eb83b1dcc 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -22,12 +22,12 @@ aliases: - &restore-cache-android-packages keys: - - v1-android-sdkmanager-packages-{{ arch }}-api-26-alpha-{{ checksum "scripts/circle-ci-android-setup.sh" }} + - v1-android-sdkmanager-packages-{{ arch }}-api-26-alpha-{{ checksum "scripts/android-setup.sh" }} - v1-android-sdkmanager-packages-{{ arch }}-api-26-alpha- - &save-cache-android-packages paths: - /opt/android/sdk - key: v1-android-sdkmanager-packages-{{ arch }}-api-26-alpha-{{ checksum "scripts/circle-ci-android-setup.sh" }} + key: v1-android-sdkmanager-packages-{{ arch }}-api-26-alpha-{{ checksum "scripts/android-setup.sh" }} - &restore-cache-gradle keys: @@ -56,12 +56,12 @@ aliases: - &restore-cache-ndk keys: - - v3-android-ndk-{{ arch }}-r10e-{{ checksum "scripts/circle-ci-android-setup.sh" }} + - v3-android-ndk-{{ arch }}-r10e-{{ checksum "scripts/android-setup.sh" }} - v3-android-ndk-{{ arch }}-r10e- - &save-cache-ndk paths: - /opt/ndk - key: v3-android-ndk-{{ arch }}-r10e-{{ checksum "scripts/circle-ci-android-setup.sh" }} + key: v3-android-ndk-{{ arch }}-r10e-{{ checksum "scripts/android-setup.sh" }} - &restore-cache-buck keys: @@ -117,7 +117,7 @@ aliases: # Dependency Management - &install-ndk name: Install Android NDK - command: source scripts/circle-ci-android-setup.sh && getAndroidNDK + command: source scripts/android-setup.sh && getAndroidNDK - &yarn | @@ -174,7 +174,7 @@ aliases: - &install-android-packages name: Install Android SDK Packages - command: source scripts/circle-ci-android-setup.sh && getAndroidSDK + command: source scripts/android-setup.sh && getAndroidPackages - &install-android-build-dependencies name: Install Android Build Dependencies @@ -223,16 +223,16 @@ aliases: - &create-avd name: Create Android Virtual Device - command: source scripts/circle-ci-android-setup.sh && createAVD + command: source scripts/android-setup.sh && createAVD - &launch-avd name: Launch Android Virtual Device in Background - command: source scripts/circle-ci-android-setup.sh && launchAVD + command: source scripts/android-setup.sh && launchAVD background: true - &wait-for-avd name: Wait for Android Virtual Device - command: source scripts/circle-ci-android-setup.sh && waitForAVD + command: source scripts/android-setup.sh && waitForAVD - &build-js-bundle name: Build JavaScript Bundle @@ -253,7 +253,7 @@ aliases: if [[ ! -e ReactAndroid/src/androidTest/assets/AndroidTestBundle.js ]]; then echo "JavaScript bundle missing, cannot run instrumentation tests. Verify build-js-bundle step completed successfully."; exit 1; fi - source scripts/circle-ci-android-setup.sh && NO_BUCKD=1 retry3 timeout 300 buck install ReactAndroid/src/androidTest/buck-runner:instrumentation-tests --config build.threads=$BUILD_THREADS + source scripts/android-setup.sh && NO_BUCKD=1 retry3 timeout 300 buck install ReactAndroid/src/androidTest/buck-runner:instrumentation-tests --config build.threads=$BUILD_THREADS - &collect-android-test-results name: Collect Test Results diff --git a/ContainerShip/scripts/run-android-docker-instrumentation-tests.sh b/ContainerShip/scripts/run-android-docker-instrumentation-tests.sh index c7806c7f0..ed7183dec 100644 --- a/ContainerShip/scripts/run-android-docker-instrumentation-tests.sh +++ b/ContainerShip/scripts/run-android-docker-instrumentation-tests.sh @@ -28,7 +28,7 @@ watchman shutdown-server node local-cli/cli.js bundle --platform android --dev true --entry-file ReactAndroid/src/androidTest/js/TestBundle.js --bundle-output ReactAndroid/src/androidTest/assets/AndroidTestBundle.js # build test APK -source ./scripts/circle-ci-android-setup.sh && NO_BUCKD=1 retry3 buck install ReactAndroid/src/androidTest/buck-runner:instrumentation-tests --config build.threads=1 +source ./scripts/android-setup.sh && NO_BUCKD=1 retry3 buck install ReactAndroid/src/androidTest/buck-runner:instrumentation-tests --config build.threads=1 # run installed apk with tests node ./ContainerShip/scripts/run-android-ci-instrumentation-tests.js $* diff --git a/runXcodeTests.sh b/runXcodeTests.sh index d4524a4a6..b1b6e7f4f 100755 --- a/runXcodeTests.sh +++ b/runXcodeTests.sh @@ -1,18 +1,20 @@ #!/bin/sh +# This script should be run from the react-native root -# Run from react-native root +THIS_DIR=$(dirname "$0") +source "scripts/.tests.env" -set -e - -if [ -z "$1" ] +if [ -n "$1" ] then - echo "You must supply an OS version as the first arg, e.g. 8.1" - exit 255 + echo "Overriding..." + IOS_TARGET_OS="${1}" + SDK="iphonesimulator${1}" + DESTINATION="platform=iOS Simulator,OS=${IOS_TARGET_OS},name=${IOS_DEVICE}" fi -xctool \ - -project RNTester/RNTester.xcodeproj \ - -scheme RNTester \ - -sdk iphonesimulator${1} \ - -destination "platform=iOS Simulator,OS=${1},name=iPhone 5" \ +xcodebuild \ + -project "RNTester/RNTester.xcodeproj" \ + -scheme $SCHEME \ + -sdk $SDK \ + -destination "$DESTINATION" \ build test diff --git a/scripts/.tests.env b/scripts/.tests.env new file mode 100644 index 000000000..e32332722 --- /dev/null +++ b/scripts/.tests.env @@ -0,0 +1,32 @@ +# These should match the recommended versions listed in +# https://facebook.github.io/react-native/docs/getting-started.html + + +## ANDROID ## +# Android SDK Build Tools revision +export ANDROID_SDK_BUILD_TOOLS_REVISION=23.0.1 +# Android API Level we build with +export ANDROID_SDK_BUILD_API_LEVEL="23" +# Minimum Android API Level we target +export ANDROID_SDK_TARGET_API_LEVEL="19" +# Android Virtual Device name +export AVD_NAME="testAVD" +# ABI to use in Android Virtual Device +export AVD_ABI=x86 + +## IOS ## +export IOS_TARGET_OS="11.3" +export IOS_DEVICE="iPhone 5s" + +export SCHEME="RNTester" +export SDK="iphonesimulator${IOS_TARGET_OS}" +export DESTINATION="platform=iOS Simulator,OS=${IOS_TARGET_OS},name=${IOS_DEVICE}" + +## CI OVERRIDES ## +# Values to override when running in CI +# $CI is set by Circle CI +if [ $CI ]; then + # Use ARM on Circle CI + export AVD_ABI=armeabi-v7a +fi + diff --git a/scripts/circle-ci-android-setup.sh b/scripts/android-setup.sh similarity index 69% rename from scripts/circle-ci-android-setup.sh rename to scripts/android-setup.sh index 35421a598..c879a9689 100644 --- a/scripts/circle-ci-android-setup.sh +++ b/scripts/android-setup.sh @@ -1,25 +1,16 @@ # inspired by https://github.com/Originate/guide/blob/master/android/guide/Continuous%20Integration.md -# SDK Built Tools revision, per http://facebook.github.io/react-native/docs/getting-started.html -ANDROID_SDK_BUILD_TOOLS_REVISION=23.0.1 -# API Level we build with -ANDROID_SDK_BUILD_API_LEVEL="23" -# Minimum API Level we target, used for emulator image -ANDROID_SDK_TARGET_API_LEVEL="19" -# Emulator name -AVD_NAME="testAVD" +source "scripts/.tests.env" -function getAndroidSDK { - export PATH="$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools:$PATH" +function getAndroidPackages { + export PATH="$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools:$ANDROID_HOME/tools.bin:$PATH" DEPS="$ANDROID_HOME/installed-dependencies" - if [ ! -e $DEPS ]; then - echo "Installing Android API level $ANDROID_SDK_TARGET_API_LEVEL, Google APIs, ARM EABI v7a system image..." - sdkmanager "system-images;android-$ANDROID_SDK_TARGET_API_LEVEL;google_apis;armeabi-v7a" -# x86 image requires hardware acceleration, which is not supported when running within the CircleCI Docker image -# echo "Installing Android API level $ANDROID_SDK_TARGET_API_LEVEL, Google APIs, Intel x86 Atom system image..." -# sdkmanager "system-images;android-$ANDROID_SDK_TARGET_API_LEVEL;google_apis;x86" + # Package names can be obtained using `sdkmanager --list` + if [ ! -e $DEPS ] || [ ! $CI ]; then + echo "Installing Android API level $ANDROID_SDK_TARGET_API_LEVEL, Google APIs, $AVD_ABI system image..." + sdkmanager "system-images;android-$ANDROID_SDK_TARGET_API_LEVEL;google_apis;$AVD_ABI" echo "Installing build SDK for Android API level $ANDROID_SDK_BUILD_API_LEVEL..." sdkmanager "platforms;android-$ANDROID_SDK_BUILD_API_LEVEL" echo "Installing target SDK for Android API level $ANDROID_SDK_TARGET_API_LEVEL..." @@ -30,7 +21,7 @@ function getAndroidSDK { sdkmanager "add-ons;addon-google_apis-google-$ANDROID_SDK_BUILD_API_LEVEL" echo "Installing Android Support Repository" sdkmanager "extras;android;m2repository" - touch $DEPS + $CI && touch $DEPS fi } @@ -50,13 +41,21 @@ function getAndroidNDK { } function createAVD { - echo no | avdmanager create avd --name $AVD_NAME --force --package "system-images;android-$ANDROID_SDK_TARGET_API_LEVEL;google_apis;armeabi-v7a" --tag google_apis --abi armeabi-v7a + AVD_PACKAGES="system-images;android-$ANDROID_SDK_TARGET_API_LEVEL;google_apis;$AVD_ABI" + echo "Creating AVD with packages $AVD_PACKAGES" + echo no | avdmanager create avd --name $AVD_NAME --force --package $AVD_PACKAGES --tag google_apis --abi $AVD_ABI } function launchAVD { + export PATH="$ANDROID_HOME/emulator:$PATH" + # The AVD name here should match the one created in createAVD - # emulator64-arm -avd $AVD_NAME -no-audio -no-window -no-boot-anim -gpu off - emulator -avd $AVD_NAME -no-audio -no-window + if [ $CI ] + then + emulator -avd $AVD_NAME -no-audio -no-window + else + emulator -avd $AVD_NAME + fi } function waitForAVD { diff --git a/scripts/run-android-emulator.sh b/scripts/run-android-emulator.sh index a705e0a8a..d7307120b 100755 --- a/scripts/run-android-emulator.sh +++ b/scripts/run-android-emulator.sh @@ -5,7 +5,8 @@ # The only reason to use this config is that it represents a known-good # virtual device configuration. # This is useful for running integration tests on a local machine. -# TODO: make continuous integration use the precise same setup + +THIS_DIR=$(dirname "$0") STATE=`adb get-state` @@ -14,6 +15,11 @@ if [ -n "$STATE" ]; then exit 1 fi -echo "Creating virtual device..." -echo no | android create avd -n testAVD -f -t android-23 --abi default/x86 -emulator -avd testAVD +echo "Installing packages" +source "${THIS_DIR}/android-setup.sh" && getAndroidPackages + +echo "Creating Android virtual device..." +source "${THIS_DIR}/android-setup.sh" && createAVD + +echo "Launching Android virtual device..." +source "${THIS_DIR}/android-setup.sh" && launchAVD diff --git a/scripts/validate-android-device-env.sh b/scripts/validate-android-device-env.sh old mode 100644 new mode 100755