在运行Kotlin代码库的测试时,我们在CI环境中看到了神秘的故障。
gradle test
编译了代码和测试就好了。测试开始了,似乎都通过了。但随后Gradle退出了代码137(表明它被SIGKILL杀死),因此CI系统认为构建失败了。
限制Gradle的JVM大小没有帮助。 --no-daemon
和--max-workers
选项也没有。
这是在Java 8 JVM上使用Kotlin 1.2.40和Gradle 4.3。
答案 0 :(得分:2)
这个案子的罪魁祸首是Kotlin编译器。
默认情况下,Kotlin编译器会在后台生成一个守护程序,以便后续编译作业更快。对于非常重要的Kotlin代码库,这个过程最终会占用大量内存。
它的存在导致Gradle达到CI容器的内存限制,而Linux OOM killer正在杀死Gradle进程。
解决方案:Tell the Kotlin compiler not to spawn the background process.事实证明这是一个设置环境变量的简单问题:
GRADLE_OPTS=-Dkotlin.compiler.execution.strategy=in-process
使用该变量,Kotlin编译在Gradle JVM中内联运行,因此当Gradle继续运行测试时,其数据可以被垃圾收集。
将选项传递给gradle
命令而不是在环境中设置它也是有效的。