CircleCI 2.0 Android сборки всегда терпит неудачу - PullRequest
0 голосов
/ 17 сентября 2018

В моей конфигурации CircleCI 2.0 в базе кода проекта Android есть следующее:

version: 2

jobs:
    build:

        environment:
            TERM: dumb
            JVM_OPTS: -Xmx4g -Xms2g -XX:MaxPermSize=2g

#     ###### Use these for other Docker Images, if need be ##########
#      ANDROID_SDK_ROOT: /usr/local/android-sdk-linux
#      SDK_MANAGER: $ANDROID_SDK_ROOT/tools/bin/sdkmanager

            GIT_COMMIT_DESC: git log --format=oneline -n 1 $CIRCLE_SHA1

            ANDROID_COMPILE_VERSION: 27
            ANDROID_TARGET_VERSION: 27
            ANDROID_MIN_VERSION: 21
            ANDROID_BUILD_VERSION: 28.0.2
            ANDROID_SUPPORT_VERSION: 27.1.1
            KOTLIN_VERSION: 1.2.70

        working_directory: ~/workSpace

        branches:
          only:
            - develop
            - release/<*>
            - feature/circle_ci_cd
          ignore:
            - bugfix/<*>
            - refactor/<*>

        docker:
          - image: circleci/android:api-$ANDROID_TARGET_VERSION-alpha

#    java:
#      version: oraclejdk8

#     ####### Other Docker Images, if need be ############
#    dependencies:
#      pre:
#        - $SDK_MANAGER --install "tools" && yes | $SDK_MANAGER --licenses
#        - $SDK_MANAGER --install "platforms;android-$ANDROID_TARGET_VERSION" && yes | $SDK_MANAGER --licenses
#        - $SDK_MANAGER --install "build-tools;$ANDROID_BUILD_VERSION" && yes | $SDK_MANAGER --licenses
#        - $SDK_MANAGER --install "platform-tools" && yes | $SDK_MANAGER --licenses
#        - $SDK_MANAGER --install "extras;android;m2repository" && yes | $SDK_MANAGER --licenses
#        - $SDK_MANAGER --install "extras;google;m2repository" && yes | $SDK_MANAGER --licenses
#        - $SDK_MANAGER --install "extras;google;google_play_services" && yes | $SDK_MANAGER --licenses

        steps:
          - checkout

          - run:
              name: "Pull Submodules"
              command: |
                git submodule init
                git submodule sync
                git submodule update --remote

          - run:
              name: "Android SDK Properties"
              command: |
                sed -i "s/compileSdkVersion=*.*/compileSdkVersion=$ANDROID_COMPILE_VERSION/" gradle.properties
                sed -i "s/targetSdkVersion=*.*/targetSdkVersion=$ANDROID_TARGET_VERSION/"  gradle.properties
                sed -i "s/minSdkVersion=*.*/minSdkVersion=$ANDROID_MIN_VERSION/" gradle.properties
                sed -i "s/buildToolsVersion=*.*/buildToolsVersion=$ANDROID_BUILD_VERSION/" gradle.properties
                sed -i "s/supportVersion=*.*/supportVersion=$ANDROID_SUPPORT_VERSION/" gradle.properties
                sed -i "s/kotlinVersion=*.*/kotlinVersion=$KOTLIN_VERSION/" gradle.properties
                sed -i "s/versionCode=*.*/versionCode=${CIRCLE_BUILD_NUM:-1}/" gradle.properties

#      ######## Other Docker Images, if need be ###########
#      - run:
#          name: "Update Android"
#          command: $SDK_MANAGER --update && yes | $SDK_MANAGER --licenses

          - run:
              name: "Clean local.properties"
              command: rm -rf local.properties || true

          - run:
              name: Chmod permissions #if permission for Gradlew Dependencies fail, use this.
              command: chmod +x ./gradlew

          - restore_cache:
              key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}

          - run:
              name: Assemble
              command: ./gradlew clean assemble

          - save_cache:
              paths:
                - ${CIRCLE_WORKING_DIRECTORY}/.gradle
                - ${ANDROID_SDK_ROOT}
              key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
#      - store_artifacts:
#          path: app/build/reports
#          destination: reports
#      - store_test_results:
#          path: app/build/test-results
# See https://circleci.com/docs/2.0/deployment-integrations/ for deploy examples

Несколько других свойств в файле gradle.properties

org.gradle.jvmargs=-Xms2g -Xmx4g -XX:MaxPermSize=2g -XX:+HeapDumpOnOutOfMemoryError -XX:ReservedCodeCacheSize=2g -Dfile.encoding=UTF-8
org.gradle.configureondemand=false
org.gradle.caching=true
org.gradle.daemon=false
org.gradle.parallel=false
kotlin.incremental=false
kotlin.compiler.execution.strategy=in-process
android.enableBuildCache=true
android.enableR8=true

Версия оболочки Gradleвыглядит следующим образом.

https\://services.gradle.org/distributions/gradle-4.10.1-all.zip

Плагин Gradle для Android.

'com.android.tools.build:gradle:3.3.0-alpha10'

Ниже приведена конфигурация вариантов сборки.

flavorDimensions "product", "store"

productFlavors {
    free { dimension "product" }
    paid { dimension "product" }
    google { dimension "store" }
    amazon { dimension "store" }
}

Машина разработки MacOS High Sierra: 10.13.6, процессор Intel Core i5 с частотой 3,5 ГГц, 32 ГБ ОЗУ DDR4 с частотой 2400 МГц.

Вот что происходит.

Порядок вариантов сборки является хронологическим, в соответствии с заданными размерами флейвора,поэтому следующие восемь создаются gradle в точном порядке.

  • freeAmazonDebug
  • freeAmazonRelease
  • freeGoogleDebug
  • freeGoogleRelease
  • paidAmazonDebug
  • paidAmazonRelease
  • paidGoogleDebug
  • paidGoogleRelease

Каждый из этих вариантов сборки будет иметь список зависимостей задач.В зависимости от задачи это то, что происходит.

  • kaptFreeAmazonDebugKotlin выполняется без ошибок.
  • kaptFreeAmazonReleaseKotlin завершается ошибкой со следующей трассировкой стека, но не завершает сборку внезапно.

Компиляция с демоном компиляции Kotlin не удалась java.rmi.UnmarshalException: Ошибка при отмене сортировки возвращаемого заголовка;Вложенное исключение: java.io.EOFException на sun.rmi.transport.StreamRemoteCall.executeCall (StreamRemoteCall.java:236) на sun.rmi.server.UnicastRef.invoke (UnicastRef.java:161) на java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod (RemoteObjectInvocationHandler.java:227) по адресу java.rmi.server.RemoteObjectInvocationHandler.invoke (RemoteObjectInvocationHandler.java:179) на сайте com.sun.unot.jp)..GradleCompilerRunner.nonIncrementalCompilationWithDaemon (GradleKotlinCompilerRunner.kt: 256) при org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner.compileWithDaemon (GradleKotlinCompilerRunner.kt: 219) в org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner.compileWithDaemonOrFallback (GradleKotlinCompilerRunner.kt: 166) наorg.jetbrains.kotlin.compilerRunner.GradleCompilerRunner.compileWithDaemonOrFallback (GradleKotlinCompilerRunner.kt: 63) в org.jetbrains.kotlin.compilerRunner.KotlinCompilerRunner.runCompiler (КотлинmpilerRunner.kt: 133) в org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner.runJvmCompiler (GradleKotlinCompilerRunner.kt: 119) в org.jetbrains.kotlin.gradle.internal.KaptWithtktktk.NativeMethodAccessorImpl.invoke0 (родной метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegavaMetho.rej.rej.rej.ref.jj.java: 498) в org.gradle.internal.reflect.JavaMethod.invoke (JavaMethod.java:73) в org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute (StandardTaskAction.java:46) в org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute (StandardTaskAction.java:39) в org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute (StandardTaskAction.java:26dle.gra.gra).internal.AbstractTask $ TaskActionWrapper.execute (AbstractTask.java:801) в org.gradle.api.interNAL.Execute (DefaultBuildOperationExecutor.java:300)по адресу org.gradle.internal.operations.DefaultBuildOperationExecutor $ RunnableBuildOperationWorker.execute (DefaultBuildOperationExecutor.java:292) по адресу org.gradle.internal.operations.DefaultBuildOperationExecutor.execute (DefaultBuildOperationExefaultoo.guo.jup).run (DefaultBuildOperationExecutor.java:90) в org.gradle.internal.operations.DelegatingBuildOperationExecutor.run (DelegatingBuildOperationExecutor.java:31) в org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExctions) в org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions (ExecuteActionsTaskExecuter.java:99) в org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute:g.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute (OutputDirectoryCreatingTaskExecuter.java:51) в org.gradle.api.internal.tasks.execution.SkipCachedTaskExecuter.execute (SkipCachedTaskExecuter.java:105) в org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute (SkipUpToDateTaskExecu..tk.Ot.ExtainTeg.TyTecTyT.ToT.ToT.ToT.ToWT.ToT.ToT.ToT.ToT.ToT.ToWTT)))выполнить (ResolveTaskOutputCachingStateExecuter.java:54) по адресу org.gradle.api.internal.tasks.execution.ResolveBuildCacheKeyExecuter.execute (ResolveBuildCacheKeyExecuter.java:79) по адресу org.gradle.apial.exas.Textjava: 59) в org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute (SkipEmptySourceFilesTaskExecuter.java:101) в org.gradle.api.internal.tasksProexeTececuteFileTerFileTerFileTerFileTerFileTecteperв org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute (CleanupStaleOutputsExecuter.java:91) в org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.Execute (ResolveTaskArtifactStateTaskExecuter.java:62) при org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute (SkipTaskWithNoActionsExecuter.java:59) в org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute (SkipOnlyIfTaskExecuter.java: 54) в org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute (ExecuteAtMostOnceTaskExecuter.java:43) в org.gradle.api.internal.tasks.execution.CatchExceptionTask) в org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter $ 1.run (EventFiringTaskExecuter.java:51) в org.gradle.internal.operations.DefaultBuildOperationExecutor $ RunnableBuildOperationWorker.execute:gra..jj.grag.internal.operations.DefaultBuildOperationExecutor $ RunnableBuildOperationWorker.execute (DefaultBuildOperationExecutor.java:292) в org.gradle.internal.operations.DefaultBuildOperationExecutor.execute (DefaultBuildOperationExecutor.java:174) в org.gradle.internal.operations.DefaultBuildOperationExecutor.run (DefaultBuildOperationExecutor.java:90) в org.gradle.internal.operations.DelegatingBuildOperationExecutor.run (DelegatingBuildOperationExecutor.jgg):.internal.tasks.execution.EventFiringTaskExecuter.execute (EventFiringTaskExecuter.java:46) в org.gradle.execution.taskgraph.LocalTaskInfoExecutor.execute (LocalTaskInfoExecutor.java:42ExecutionEcuTexject)(DefaultTaskExecutionGraph.java:277)в org.gradle.execution.taskgraph.DefaultTaskExecutionGraph $ BuildOperationAwareWorkItemExecutor.execute (DefaultTaskExecutionGraph.java:262) в org.gradle.execution.taskgraph.DefaultTaskPlanExecutor $ ExecutorWorker $ 1.execute (DefaultTaskPlanExecutor.java:135) в org.gradle.execution.taskgraph.DefaultTaskPlanExecutor $ ExecutorWorker $ 1.execute (DefaultTaskPlanExecutor.java:130) в org.gradle.execution.taskgraph.DefaultTaskPlanExecutor $ ExecutorWorker.execute (DefaultTaskPlanExecutor.java:200) в org.gradle.execution.taskgraph.DefaultTaskPlanExecutor $ ExecutorWorker.executeWithWork (DefaultTaskPlanExecutor.java:191) в org.gradle.execution.taskgraph.DefaultTaskPlanExecutor $ ExecutorWorker.run (DefaultTaskPlanExecutor.java:130) в org.gradle.internal.concurrent.ExecutorPolicy $ CatchAndRecordFailures.onExecute (ExecutorPolicy.java:63) в org.gradle.internal.concurrent.ManagedExecutorImpl $ 1.run (ManagedExecutorImpl.java:46) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:624) в org.gradle.internal.concurrent.ThreadFactoryImpl $ ManagedThreadRunnable.run (ThreadFactoryImpl.java:55) at java.lang.Thread.run (Thread.java:748) Причина: java.io.EOFException в java.io.DataInputStream.readByte (DataInputStream.java:267) at sun.rmi.transport.StreamRemoteCall.executeCall (StreamRemoteCall.java:222) ... еще 65 Не удается очистить кэш jar после компиляции, возможно, демон уже отключен: java.rmi.ConnectException: соединение отказано к хосту: 127.0.0.1; Вложенное исключение: java.net.ConnectException: соединение отклонено (соединение отклонено) Не ​​удалось подключиться к демону kotlin. Использование резервной стратегии.

  • kaptPaidAmazonDebugKotlin завершается неудачно с указанной выше точно такой же трассировкой стека, а также резко убивает сборку Gradle.

Я перепробовал все возможные комбинации опций грейдера, опций java и опций докера, которые мог придумать, и я мог попытаться найти в Интернете, но ничего не помогло.

Эти сбои происходят только в CircleCI 2.0 в облаке или в CircleCI CLI с заданным Docker-образом. Локальные сборки стабильны.

Будут оценены любые указатели на решение.

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018
android {
    kapt {
        useBuildCache true
    }

    dexOptions {
        preDexLibraries true
        jumboMode false
    }
}
0 голосов
/ 19 сентября 2018

при просмотре может быть несколько возможных причин:

  • вы используете неправильный buildToolsVersion, который можно даже опустить в build.gradle - для использованияпоследняя версия, соответствующая уровню API 27.

  • с использованием com.android.tools.build:gradle:3.3.0-alpha10, сомнительна.лучше использовать стабильную версию 3,1,4;четная версия 3.2.0 в настоящее время все еще находится в beta .

Невозможно очистить кэш JAR после компиляции

^ thisв значительной степени намекает на конфликт файловой системы (поскольку следующая задача уже обращается к нему).

check build directory - и переопределите productFlavors соответственно, чтобы обойти проблему.

...