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