Gradle守护进程将在构建结束后停止,因为已运行X小时且未使用Y小时
org.gradle.launcher.daemon.server.DaemonExpirationPeriodicCheck: Daemon will be stopped at the end of the build after running for X hours and not being used for Y hours
ID: cicd/gradle-daemon-stopped-after-build
根因分析
Gradle守护进程在CI构建期间达到空闲超时(默认3小时)或最大存活时间(默认24小时),导致被提前停止,如果后续任务需要该守护进程,可能导致构建失败。
English
Gradle daemon reaches its idle timeout (default 3 hours) or maximum age (default 24 hours) during a CI build, causing it to be stopped prematurely, which can lead to build failures if the daemon is needed for subsequent tasks.
官方文档
https://docs.gradle.org/current/userguide/gradle_daemon.html解决方案
-
Set org.gradle.daemon.idletimeout=7200000 in gradle.properties to increase idle timeout to 2 hours (value in milliseconds). Also set org.gradle.daemon.registrybase=/tmp/gradle-daemon to avoid PID file conflicts in CI.
-
Run Gradle with --no-daemon flag in CI scripts to avoid daemon lifecycle issues altogether: ./gradlew build --no-daemon
无效尝试
常见但无效的做法:
-
Set org.gradle.daemon=false in gradle.properties to disable daemon entirely
20% 失败
Disabling daemon forces a new JVM for each build, increasing startup time and memory overhead, and may cause other race conditions in CI pipelines.
-
Increase max heap size for daemon (org.gradle.jvmargs=-Xmx4g) to avoid memory pressure
80% 失败
Heap size does not affect idle timeout; the daemon is stopped based on time, not memory usage, so this fix is irrelevant.