CircleCI 2.0 Android сборки всегда терпит неудачу
У меня есть следующее в моем конфиге 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 ГГц, оперативная память DDR4 2400 МГц 32 ГБ.
Вот что происходит.
Порядок вариантов сборки является хронологическим, согласно заданным размерам аромата, поэтому следующие восемь создаются 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.jpg.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:26) в org.grag.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:801) в org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:768) в org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:131) в org.graild.OctionBoperationOuoU.execute(DefaultBuildOperationExecutor.java:300) в org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292) в org.gradle.internalExoperations.DefavaBeoOu ист org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90) в org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31) в org.graternaltionap.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:120) в org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:99) в org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:77) в org.gradle.api.internal.tecuks.execution.OutkTecateCate 51) в org.gradle.api.internal.tasks.execution.SkipCachedTaskExecuter.execute(SkipCachedTaskExecuter.java:105) в org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.exp ().gradle.api.internal..internal.tasks.execution.ValidatingTaskExecuter.execute (ValidatingTaskExecuter.java:59) в org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFdleTava) pi.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter. Задачи SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54) в org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTask.ex. CatchExceptionTaskExecuter.java:34) в org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.run(EventFiringTaskExecuter.java:51) в org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300) в org.gradle.internal.operations.DefaultBuildOperationExecutor $ RunnableBuildOperationWorker.execute (DefaultBuildOperationExecutor.java:29.ild_Exec.ecaction.ecec.ecec.ecaction.ecaction.ecutor 174) в org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90) в org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31) в org.gra.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:46) в org.gradle.execution.taskgraph.LocalTaskInfoExecutor.execute(LocalTaskInfoExecutor.java:42) в org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:277) at 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.DefaultTavaklan.ExecTeckTecutor 130) в org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.execute(DefaultTaskPlanExecutor.java:200) в org.gradle.execution.taskgraph.DefaultTaskPlanExecutor $ ExecutorWorker.executeTask.jg.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.run(DefaultTaskPlanExecutor.java:130) в org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63urun.grag.grand.gra.. ManagedExecutorImpl.java:46) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:6gra) rnal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55) в java.lang.Thread.run(Thread.java:748) Вызывается: java.io.EOFException в java.io.DataInputStream.readByte(DataIn.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.
Я перепробовал все возможные комбинации опций gradle, java и docker, которые мог придумать, и я мог попытаться найти в Интернете, но ничего не помогло.
Эти сбои происходят только в CircleCI 2.0 в облаке или в CircleCI CLI с заданным Docker-образом. Сборка gradle локально стабильна.
Любые указатели на решение будут оценены.
2 ответа
android {
kapt {
useBuildCache true
}
dexOptions {
preDexLibraries true
jumboMode false
}
}
При рассмотрении может быть несколько возможных причин:
вы используете неправильно
buildToolsVersion
который может быть даже опущен вbuild.gradle
- для использования последней версии, соответствующей уровню API27
,с помощью
com.android.tools.build:gradle:3.3.0-alpha10
сомнительно лучше использовать стабильную версию3,1,4
; четная версия3.2.0
В настоящее время все еще находится в бета-версии.
Невозможно очистить кэш JAR после компиляции
^ это в значительной степени намекает на конфликт файловой системы (потому что следующая задача уже обращается к нему).
проверять build
каталог - и переопределить productFlavors
соответственно, чтобы обойти проблему.