From 70011ee67a5dc76b94616ae9b577e968c28f6f0d Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sat, 25 Apr 2020 09:02:27 -0500 Subject: [PATCH] New travis config --- .travis.yml | 103 ++++++++++++++++++++++++++++++++++-------- .wait_for_emulator.sh | 31 ++++++++----- 2 files changed, 103 insertions(+), 31 deletions(-) diff --git a/.travis.yml b/.travis.yml index 553c323bc..ddd15a1c9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,33 +1,98 @@ -language: android -sudo: required -jdk: oraclejdk8 +# https://github.com/andstatus/todoagenda/blob/aa2bc56effa379e145eecb104cc5bac33975b7aa/.travis.yml +# Based on https://travis-ci.org/ankidroid/Anki-Android/builds/624268367 +# See also https://travis-ci.community/t/is-android-28-emulator-supported/1718/6 +sudo: true +language: bash +# ignored on non-linux platforms, but bionic is required for nested virtualization +dist: bionic + +stages: + - install + - test + - cache + env: global: - - TARGET_API=29 - - BUILD_TOOLS=29.0.2 - - ADB_INSTALL_TIMEOUT=10 + - COMPILE_API=29 + - ANDROID_BUILD_TOOLS=29.0.2 + - ABI=x86_64 + - ADB_INSTALL_TIMEOUT=8 + - ANDROID_HOME=${HOME}/android-sdk + - ANDROID_TOOLS_URL="https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip" + - EMU_FLAVOR=default # use google_apis flavor if no default flavor emulator + - GRAVIS="https://raw.githubusercontent.com/DanySK/Gravis-CI/master/" + - JDK="1.8" + - TOOLS=${ANDROID_HOME}/tools + # PATH order is incredibly important. e.g. the 'emulator' script exists in more than one place! + - PATH=${ANDROID_HOME}:${ANDROID_HOME}/emulator:${TOOLS}:${TOOLS}/bin:${ANDROID_HOME}/platform-tools:${PATH} matrix: - - EMULATOR_API=$TARGET_API ANDROID_ABI=armeabi-v7a -android: - components: - - tools # https://github.com/travis-ci/travis-ci/issues/5049 - - tools # https://github.com/travis-ci/travis-ci/issues/6040 - - android-$TARGET_API - - sys-img-$ANDROID_ABI-android-$EMULATOR_API - - platform-tools - - build-tools-$BUILD_TOOLS - - extra-android-m2repository - - extra-google-m2repository + - API=29 before_install: - - echo no | android create avd --force -n test -t android-$EMULATOR_API --abi $ANDROID_ABI - - emulator -avd test -no-skin -no-audio -no-window & + # This section may run on all platforms, and may run for unit tests or for coverage finalization + # It should not make assumptions about os platform or desired tool installation + + # Set up JDK 8 for Android SDK - Java is universally needed: codacy, unit tests, emulators + - curl "${GRAVIS}.install-jdk-travis.sh" --output ~/.install-jdk-travis.sh + - export TARGET_JDK="${JDK}" + - JDK="1.8" + - source ~/.install-jdk-travis.sh + + # Set up Android SDK - this is needed everywhere but coverage finalization, so toggle on that + - wget -q "${ANDROID_TOOLS_URL}" -O android-sdk-tools.zip + - unzip -q android-sdk-tools.zip -d ${ANDROID_HOME} + - rm android-sdk-tools.zip + - mkdir ~/.android # avoid harmless sdkmanager warning + - echo 'count=0' > ~/.android/repositories.cfg # avoid harmless sdkmanager warning + - yes | sdkmanager --licenses >/dev/null # accept all sdkmanager warnings + - echo y | sdkmanager --no_https "platform-tools" >/dev/null + - echo y | sdkmanager --no_https "tools" >/dev/null # A second time per Travis docs, gets latest versions + - echo y | sdkmanager --no_https "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null # Implicit gradle dependency - gradle drives changes + - echo y | sdkmanager --no_https "platforms;android-${COMPILE_API}" >/dev/null # We need the API of the current compileSdkVersion from gradle.properties + +install: + # In our setup, install only runs on matrix entries we want full emulator tests on + # That only happens currently on linux, so this section can assume linux + emulator is desired + # Download required emulator tools + - echo y | sdkmanager --no_https "platforms;android-$API" >/dev/null # We need the API of the emulator we will run + - echo y | sdkmanager --no_https "emulator" >/dev/null + - echo y | sdkmanager --no_https "system-images;android-$API;$EMU_FLAVOR;$ABI" >/dev/null # install our emulator + + # Set up KVM on linux for hardware acceleration. Manually here so it only happens for emulator tests, takes ~30s + - sudo -E apt-get -yq --no-install-suggests --no-install-recommends install bridge-utils libpulse0 libvirt-bin qemu-kvm virtinst ubuntu-vm-builder + - sudo adduser $USER libvirt + - sudo adduser $USER kvm + + # Create an Android emulator + - echo no | avdmanager create avd --force -n test -k "system-images;android-$API;$EMU_FLAVOR;$ABI" -c 10M + - | + EMU_PARAMS="-verbose -no-snapshot -no-window -camera-back none -camera-front none -selinux permissive -qemu -m 2048" + EMU_COMMAND="emulator" + # This double "sudo" monstrosity is used to have Travis execute the + # emulator with its new group permissions and help preserve the rule + # of least privilege. + sudo -E sudo -u $USER -E bash -c "${ANDROID_HOME}/emulator/${EMU_COMMAND} -avd test ${AUDIO} ${EMU_PARAMS} &" + + # Wait for emulator to be ready - ./.wait_for_emulator.sh - adb shell input keyevent 82 & + # Switch back to our target JDK version to build and run tests + - JDK="${TARGET_JDK}" + - source ~/.install-jdk-travis.sh + script: - ./gradlew :app:lintGoogleplayRelease - ./gradlew -Pcoverage :app:createGoogleplayDebugAndroidTestCoverageReport +before_cache: + - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock + - curl "${GRAVIS}.clean_gradle_cache.sh" --output ~/.clean_gradle_cache.sh + - bash ~/.clean_gradle_cache.sh > /dev/null + +cache: + directories: + - $HOME/.gradle/caches/ + - $HOME/.gradle/wrapper/ after_success: - bash <(curl -s https://codecov.io/bash) diff --git a/.wait_for_emulator.sh b/.wait_for_emulator.sh index 9b044200b..2405dcbc2 100755 --- a/.wait_for_emulator.sh +++ b/.wait_for_emulator.sh @@ -1,17 +1,24 @@ #!/bin/bash +set +e + bootanim="" failcounter=0 -until [[ "$bootanim" =~ "stopped" ]] || [[ "$bootanim" =~ "running" ]]; do - bootanim=`adb -e shell getprop init.svc.bootanim 2>&1` - echo "$bootanim" - if [[ "$bootanim" =~ "not found" ]]; then - let "failcounter += 1" - if [[ $failcounter -gt 3 ]]; then - echo "Failed to start emulator" - exit 1 - fi - fi - sleep 1 +timeout_in_sec=600 # 10 minutes + +until [[ "$bootanim" =~ "stopped" ]]; do + bootanim=`adb -e shell getprop init.svc.bootanim 2>&1 &` + if [[ "$bootanim" =~ "device not found" || "$bootanim" =~ "device offline" + || "$bootanim" =~ "running" || "$bootanim" =~ "error: no emulators found" ]]; then + let "failcounter += 1" + echo "Waiting for emulator to start" + if [[ $failcounter -gt timeout_in_sec ]]; then + echo "Timeout ($timeout_in_sec seconds) reached; failed to start emulator" + exit 1 + fi + fi + sleep 1 done -echo "Done" \ No newline at end of file + +echo "Emulator is ready" +