CircleCI 2.0:错误解组返回头;嵌套的异常是:

时间:2019-06-12 18:55:30

标签: android kotlin android-espresso circleci circleci-2.0

我创建了一些espresso UI测试。这些测试在本地(模拟器和真实设备)运行良好。但是,当我尝试在CircleCI上运行UI测试时。我收到此错误日志

  

任务:app:compileFossDebugAndroidTestKotlin   使用Kotlin编译守护程序进行的编译未成功   java.rmi.UnmarshalException:解组返回标头时出错;嵌套的异常是:

编译后无法清除jar缓存,也许守护进程已经关闭:java.rmi.ConnectException:连接被拒绝托管给主机:127.0.0.1;嵌套的异常是:     java.net.ConnectException:连接被拒绝(连接被拒绝) 无法连接到kotlin守护程序。使用后备策略。

拾取了JAVA_TOOL_OPTIONS:-Xms512m

  

任务:app:compileFossDebugAndroidTestKotlin失败

失败:构建失败,并出现异常。

  • 出了什么问题: 任务':app:compileFossDebugAndroidTestKotlin'的执行失败。

有关错误日志的更多详细信息,here

这是我的带有运行UI测试作业的circleci的config.yml文件

run-ui-tests:
    docker:
      - image: circleci/android@sha256:5cdc8626cc6f13efe5ed982cdcdb432b0472f8740fed8743a6461e025ad6cdfc
    environment:
      JVM_OPTS: -Xmx2048m
      GRADLE_OPTS: -Xmx1536m -XX:+HeapDumpOnOutOfMemoryError -Dorg.gradle.caching=true -Dorg.gradle.configureondemand=true -Dkotlin.compiler.execution.strategy=in-process -Dkotlin.incremental=false
    steps:
      - checkout
      - run:
          name: ANDROID_HOME
          command: echo "sdk.dir="$ANDROID_HOME > local.properties
      - run:
          name: restore files from ENV
          command: |
            echo $ROCKET_JKS_BASE64 | base64 --decode > Rocket.jks
            echo $ROCKET_PLAY_JSON | base64 --decode > app/rocket-chat.json
      - run:
          name: checkout Rocket.Chat.Kotlin.SDK
          command: git clone https://github.com/RocketChat/Rocket.Chat.Kotlin.SDK.git ../Rocket.Chat.Kotlin.SDK
      - restore_cache:
          key: kotlin-sdk-{{ .Revision }}
      - restore_cache:
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
      - run:
          name: Accept licenses
          command: yes | sdkmanager --licenses || true
      - run:
          name: Download Dependencies
          command: ./gradlew androidDependencies
      - save_cache:
          paths:
            - ~/.gradle
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
      - run:
          name: Setup emulator
          command: sdkmanager "system-images;android-22;default;armeabi-v7a" && echo "no" | avdmanager create avd -n test -k "system-images;android-22;default;armeabi-v7a"
      - run:
          name: Launch emulator
          command: export LD_LIBRARY_PATH=${ANDROID_HOME}/emulator/lib64:${ANDROID_HOME}/emulator/lib64/qt/lib && emulator64-arm -avd test -noaudio -no-boot-anim -no-window -accel auto -verbose
          background: true
      - run:
          name: Wait emulator
          command: |
            # wait for it to have booted
            circle-android wait-for-boot
            # unlock the emulator screen
            sleep 30
            adb shell input keyevent 82
      - run:
          name: Run EspressoTests
          command: ./gradlew connectedAndroidTest
      - store_artifacts:
          path: app/build/reports
          destination: reports
      - store_test_results:
          path: app/build/test-results

gradle.properties

android.enableJetifier=true
android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536m

其他配置

compileSdk version           : 28
targetSdk version            : 28
kotlin version               : '1.3.31'

该项目具有2种口味:foss和play 和2种构建类型:调试和发布

我尝试了所有可能的解决方案,但是没有一个起作用。任何帮助将不胜感激。谢谢

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。

最后,我删除了gradle缓存文件夹(linux:〜/ .gradle),此问题消失了。

您可以先杀死Gradle Deamon。

更新:我发现原因是禁用gradle deamon可以解决此问题。 将org.gradle.daemon = false添加到gradle.properties

update2:抱歉,每个人,这是我的ECS太低(1 cpu,1G内存)的原因,我添加了1G交换并且此问题消失了。

答案 1 :(得分:1)

将此行添加到config.yml可以帮助我避免此错误

GRADLE_OPTS: -Xmx1536m -XX:+HeapDumpOnOutOfMemoryError -Dorg.gradle.caching=true -Dorg.gradle.configureondemand=true -Dkotlin.compiler.execution.strategy=in-process -Dkotlin.incremental=false

更多信息在这里:https://github.com/circleci/circleci-docs/issues/2945#issuecomment-471637158

答案 2 :(得分:0)

对于很多人来说,似乎已经添加了GRADLE_OPTS行,这有助于解决他们的编组错误。对我来说,该行实际上导致我的所有单元测试中断,然后才进入引起非编组错误的命令。对于我们的构建,在运行所有单元测试后,gradle内存已用完。解决方案是在所有单元测试都运行之后,但在构建并推送到商店之前,清除gradle缓存。我们按照注释部分中指出的用户zhukunqian将命令rm -fr ~/.gradle/daemon/添加到了travis文件中。