Jenkins 使用 Gradle 守护进程构建失败

Posted

技术标签:

【中文标题】Jenkins 使用 Gradle 守护进程构建失败【英文标题】:Jenkins Builds Fail Using the Gradle Daemon 【发布时间】:2016-12-07 05:04:36 【问题描述】:

在尝试提高我的 Gradle android 构建的性能时,我偶然发现了 Gradle 守护程序,并且在本地构建中使用它取得了巨大成功。

但是,在 Ubuntu 14.04 上的 Jenkins 下运行时,构建会间歇性地失败,并出现:

Starting process 'Gradle Test Executor 2'. Working directory: /tmp/myproject/android/example Command: /usr/lib/jvm/java-8-oracle/bin/java -Djava.awt.headless=true -Djava.security.manager=worker.org.gradle.process.internal.worker.child.BootstrapSecurityManager -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -ea -cp /data/var/lib/jenkins/.gradle/caches/2.14.1/workerMain/gradle-worker.jar worker.org.gradle.process.internal.worker.GradleWorkerMain 'Gradle Test Executor 2'
Successfully started process 'Gradle Test Executor 2'
Daemon vm is shutting down... The daemon has exited normally or was terminated in response to a user interrupt.
Starting process 'Gradle Test Executor 3'. Working directory: /tmp/myproject/android/example Command: /usr/lib/jvm/java-8-oracle/bin/java -Djava.awt.headless=true -Djava.security.manager=worker.org.gradle.process.internal.worker.child.BootstrapSecurityManager -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -ea -cp /[...]/.gradle/caches/2.14.1/workerMain/gradle-worker.jar worker.org.gradle.process.internal.worker.GradleWorkerMain 'Gradle Test Executor 3'
----- End of the daemon log -----


FAILURE: Build failed with an exception.

* What went wrong:
Gradle build daemon disappeared unexpectedly (it may have been killed or may have crashed)

* Try:
Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output.
Error: Failed to run test (./gradlew --console=plain --info test -p myproject).

    FAILURE: Build failed with an exception.

多个构建可以并行运行。如果我在没有其他构建运行时手动运行构建,我将无法重现它。 Someone else 有这个问题,但推荐的解决方案只是禁用 Gradle Daemon,我不想这样做。我认为大型并发构建环境正是 Gradle Daemon 想要优化的。

或者,如果我不能让 Gradle Daemon 在 Jenkins 下可靠地工作,为什么不呢?谢谢!

【问题讨论】:

好问题,我在配置方面完全相同。我将尝试在本地重现问题,看看是否可以提供解决方案。 嗯,docs.gradle.org/current/userguide/… 我有同样的问题,我似乎无法解决它。我以所有可能的方式(标志、环境变量等)、不同的 Gradle 版本、从最大 64m 到 2gb 内存的不同 VM 设置禁用了守护程序。我还尝试了 2 个全新的安装,一个在 Ubuntu 16.04 上,一个在 Ubuntu 14.04 上。我终于尝试使用不同的 Java 版本 7 和 8(虽然我真的需要 8)以及 OpenJDK 和 Oracle 的 VM。不幸的是,没有任何效果。我真的很感激这个问题的解决方案。在 Windows 7 和 10 机器上一切运行良好。 【参考方案1】:

自版本 3.0 起,Gradle 守护程序默认启用。但是,official documentation 直到 4.2.1 声明您不应该在持续集成服务器中使用守护进程。

建议在所有开发人员环境中使用 Daemon。建议禁用持续集成守护进程并构建服务器环境。

守护进程可以实现更快的构建,当有人坐在构建前面时,这一点尤其重要。对于 CI 构建,稳定性和可预测性至关重要。为每个构建使用新的运行时(即进程)更可靠,因为运行时与之前的构建完全隔离。

从那时起,此建议发生了变化,请参阅Disabling the Daemon

从 Gradle 3.0 开始,我们默认启用 Daemon,并建议将其用于开发人员的机器和持续集成服务器。但是,如果您怀疑 Daemon 使您的 CI 构建不稳定,您可以禁用它,以便为每个构建使用新的运行时,因为运行时与任何以前的构建完全隔离。

【讨论】:

以上是关于Jenkins 使用 Gradle 守护进程构建失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在Kubernetes CI管道中使用Gradle守护程序?

ansible+Jenkins+supervisor(Jenkins守护进程)

20. Gradle编译其他应用代码流程(七) - 守护进程编译

Gradle 构建挂起没有失败,DefaultFileLockManager 获取和释放守护进程地址注册表上的锁定

Gradle命令行操作

加快gradle构建速度