2017-06-23 2 views
8

Mon étape de construction utilise la construction gradle dans le modèle de TeamCity, mais malheureusement, je reçois:projet android avec Compiler Kotlin sur TeamCity échoue

[16:29:22][:presentation:compileLocalDebugKotlin] Using kotlin incremental compilation 
[16:29:48][:presentation:compileLocalDebugKotlin] Compilation with Kotlin compile daemon was not successful 
[16:29:48][:presentation:compileLocalDebugKotlin] java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is: 
[16:29:48][:presentation:compileLocalDebugKotlin] java.io.EOFException 
[16:29:48][:presentation:compileLocalDebugKotlin] at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:229) 
[16:29:48][:presentation:compileLocalDebugKotlin] at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:162) 

Toutes les idées sur la raison pour laquelle je pourrais obtenir?

+1

montrez vos fichiers build.gradle s'il vous plaît – Lovis

+0

wow c'est cool. deux jours après avoir commenté cela, j'ai rencontré le même problème ... voir ma réponse pour ma solution – Lovis

Répondre

3

J'ai rencontré le même problème. Cependant, il n'était pas connecté à Kotlin.

Je devais désactiver le Deamon Gradle (ce n'est pas recommandé sur les serveurs CI de toute façon).

Dans teamcity vous pouvez p.ex.. faites-le en ajoutant -Dorg.gradle.daemon=false à la variable d'environnement GRADLE_OPTS.

Voir https://docs.gradle.org/current/userguide/gradle_daemon.html

+0

Ceci est correct. En commençant aussi avec Gradle 3.0, Gradle est démon par défaut ce qui signifie que le KotlinCompileDaemon restera. –

+0

Note depuis le lien: Depuis Gradle 3.0, nous activons Daemon par défaut et ** recommandons de l'utiliser aussi bien pour les machines des développeurs que pour les serveurs Continuous Integration **. Cependant, si vous pensez que Daemon rend vos builds CI instables, vous pouvez le désactiver pour utiliser un nouveau runtime pour chaque build puisque le runtime est complètement isolé des builds précédents. –

+0

@lovis la variable d'environnement remplacera-t-elle les valeurs gradle.properties? Nous aimerions activer le démon dans les environnements de développement mais le désactiver sur le serveur CI. –

1

Par défaut, le compilateur Kotlin exécute dans son propre démon processus. Passez cette configuration Gradle lors de l'exécution sur CI pour compiler Kotlin dans le même processus de construction:

-Dkotlin.compiler.execution.strategy="in-process" 

La désactivation du démon Gradle est également pratique courante dans les environnements de CI:

-Dorg.gradle.daemon=false 

On pourrait attendre que le Gradle La propriété daemon désactive également le démon du coureur du compilateur Kotlin, mais ce n'est pas ce qui se passe actuellement. GradleKotlinCompilerRunner.kt considère uniquement la propriété org.gradle.daemonaprès la propriété kotlin.compiler.execution.strategy. Si la stratégie d'exécution n'est pas définie, le coureur utilise la stratégie "daemon" par défaut:

val executionStrategy = System.getProperty(KOTLIN_COMPILER_EXECUTION_STRATEGY_PROPERTY) ?: DAEMON_EXECUTION_STRATEGY 
if (executionStrategy == DAEMON_EXECUTION_STRATEGY) { 
    val daemonExitCode = compileWithDaemon(compilerClassName, compilerArgs, environment) 

    if (daemonExitCode != null) { 
     return daemonExitCode 
    } 
    else { 
     log.warn("Could not connect to kotlin daemon. Using fallback strategy.") 
    } 
} 

val isGradleDaemonUsed = System.getProperty("org.gradle.daemon")?.let(String::toBoolean) 
return if (executionStrategy == IN_PROCESS_EXECUTION_STRATEGY || isGradleDaemonUsed == false) { 
    compileInProcess(argsArray, compilerClassName, environment) 
} 
else { 
    compileOutOfProcess(argsArray, compilerClassName, environment) 
} 

mise Explicitement la stratégie d'exécution à "in-process" vous obtiendrez à compileInProcess() quelle que soit la configuration du démon Gradle, cependant, vous devrez peut-être désactiver les deux démons sur les serveurs CI.