2015-03-09 21 views
17

Stiamo vedendo un sacco di fallimenti di build sulla prima e anche seconda esecuzione di richieste pull per il nostro progetto Android su Travis. Tuttavia, se riavviamo la stessa esatta build abbastanza volte, alla fine passa.Test su Android non riescono su Travis con ShellCommandUnresponsiveException

Ecco cosa l'errore appare come sui fallimenti:

:onebusaway-android:connectedAndroidTest 
09:48:14 E/Device: Error during shell execution: null 
Unable to install /home/travis/build/OneBusAway/onebusaway-android/onebusaway-android/build/outputs/apk/onebusaway-android-debug.apk 
com.android.ddmlib.InstallException 
at com.android.ddmlib.Device.installPackages(Device.java:927) 
at com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:105) 
at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:125) 
at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:48) 
at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: com.android.ddmlib.ShellCommandUnresponsiveException 
at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:513) 
at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:390) 
at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:359) 
at com.android.ddmlib.Device.executeShellCommand(Device.java:566) 
at com.android.ddmlib.Device.createMultiInstallSession(Device.java:987) 
at com.android.ddmlib.Device.installPackages(Device.java:884) 
... 9 more 
com.android.builder.testing.ConnectedDevice > runTests[test(AVD) - 5.0.1] FAILED 
com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException 
    at com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:108) 
null 
com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException 
at com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:108) 
at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:125) 
at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:48) 
at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: com.android.ddmlib.InstallException 
at com.android.ddmlib.Device.installPackages(Device.java:927) 
at  com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:105) 
... 8 more 
Caused by: com.android.ddmlib.ShellCommandUnresponsiveException 
at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:513) 
at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:390) 
at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:359) 
at com.android.ddmlib.Device.executeShellCommand(Device.java:566) 
at com.android.ddmlib.Device.createMultiInstallSession(Device.java:987) 
at com.android.ddmlib.Device.installPackages(Device.java:884) 
... 9 more 
:onebusaway-android:connectedAndroidTest FAILED 
FAILURE: Build failed with an exception. 

Stiamo eseguendo test su l'emulatore su Travis utilizzando gradlew connectedTest.

Ecco la nostra .travis.yml:

# Test format changes to this .travis.yml file before submitting a PR with: 
# http://lint.travis-ci.org/OneBusAway/onebusaway-android 

language: android 
jdk: oraclejdk7 
# Turn off caching to avoid any caching problems 
cache: false 
# Use the Travis Container-Based Infrastructure (see #203) 
sudo: false 
env: 
    global: 
    - ANDROID_API_LEVEL=21 
    - ANDROID_BUILD_TOOLS_VERSION=21.1.2 
    - ANDROID_ABI=google_apis/armeabi-v7a 

android: 
    components: 
    - platform-tools 
    - tools 
    - build-tools-$ANDROID_BUILD_TOOLS_VERSION 
    - android-$ANDROID_API_LEVEL 
    # For Google Maps API v1 
    - addon-google_apis-google-$ANDROID_API_LEVEL 
    # Google Play Services 
    - extra-google-google_play_services 
    # Support library 
    - extra-android-support 
    # Latest artifacts in local repository 
    - extra-google-m2repository 
    - extra-android-m2repository 
    # Specify at least one system image 
    - sys-img-armeabi-v7a-addon-google_apis-google-$ANDROID_API_LEVEL 

before_script: 
    # Create and start emulator 
    - echo no | android create avd --force -n test -t "Google Inc.:Google APIs:"$ANDROID_API_LEVEL --abi $ANDROID_ABI 
    - emulator -avd test -no-skin -no-audio -no-window & 

script: 
    - ./wait_for_emulator 
    - ./gradlew connectedCheck -PdisablePreDex 

# Integration with Gitter (https://gitter.im/OneBusAway/onebusaway-android) 
notifications: 
    webhooks: 
    urls: 
     - https://webhooks.gitter.im/e/493b93a98ed03a010c4c 
    on_success: change # options: [always|never|change] default: always 
    on_failure: always # options: [always|never|change] default: always 
    on_start: false  # default: false 

risposta

15

È possibile impostare la variabile ambientale ADB_INSTALL_TIMEOUT su Travis ad un valore tale da 8 minuti per evitare questo problema.

Per esempio, nei tuoi .travis.yml:

language: android 
jdk: oraclejdk7 
# Turn off caching to avoid any caching problems 
cache: false 
# Use the Travis Container-Based Infrastructure 
sudo: false 
env: 
    global: 
    - ANDROID_API_LEVEL=21 
    - ANDROID_BUILD_TOOLS_VERSION=21.1.2 
    - ANDROID_ABI=armeabi-v7a 
    - ADB_INSTALL_TIMEOUT=8 # minutes (2 minutes by default) 

android: 
    components: 
    - platform-tools 
    - tools 
    - build-tools-$ANDROID_BUILD_TOOLS_VERSION 
    - android-$ANDROID_API_LEVEL 

Il ShellCommandUnresponsiveException è legato alla AOSP issue 69735: Ddmlib is too agressive with timeouts in Device.java, che provoca ddmlib al timeout rapidamente se non riceve input. La suddetta variabile ambientale estende questo periodo di timeout su Travis VM.

Accertarsi inoltre di utilizzare gli SDK di livello API e gli strumenti di creazione più recenti (almeno la versione precedente), poiché le versioni precedenti non consentono di impostare questa variabile ambientale.

Nota che questo può risolvere il tuo problema solo se i tuoi test saltano occasionalmente su Travis - se la tua build fallisce sempre potresti avere altri problemi in corso.

EDIT marzo 2016

Si noti che se si sta ancora vedendo fallimenti, in particolare su API livello 23 emulatore, c'è un altro problema di timeout emulatore che potrebbero essere la causa dei problemi.

Per aggirare il problema, è necessario aggiornare il plugin di Gradle almeno 2.0.0-beta3 - ad esempio:

dependencies { 
    classpath 'com.android.tools.build:gradle:2.0.0-beta5' 
} 

Per maggiori dettagli si veda:

+3

È venuto qui tramite la ricerca Google, chiunque lo veda; conosci la soluzione per questo in CircleCi? Ottenere lo stesso errore ma non ha idea di come risolverlo in CircleCi –

+0

@RED_ È possibile impostare la stessa variabile su CircleCI: https://circleci.com/docs/configuration#modifiers – Peeja

+2

Grazie, ma ho fatto tante altre cose da allora. Perfino CircleCi dice che non hanno alcuna soluzione a questo adesso. potrebbe semplicemente passare a Travis. –

Problemi correlati