Дженкинс строит сбой с помощью демона Gradle

При попытке повысить производительность моих Gradle Android-сборок я наткнулся на демон Gradle и использовал его с большим успехом для локальных сборок.

Однако, работая под Jenkins на Ubuntu 14.04, сборки прерываются с ошибкой:

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.

Несколько сборок могут выполняться параллельно. Если я запускаю сборку вручную, когда никакие другие сборки не работают, я не смог воспроизвести ее. У кого-то еще была эта проблема, но рекомендуемым решением было просто отключить Daemon Gradle, который я не хочу делать. Я бы подумал, что большая, параллельная среда сборки будет именно тем, что Gradle Daemon было предназначено для оптимизации.

Или, если я не смогу сделать Daemon Gradle надежно работать под Jenkins, почему бы и нет? Спасибо!

Ответ 1

Демон Gradle включен по умолчанию с версии 3.0. Однако официальная документация до 4.2.1 указала, что вы не должны использовать демона на серверах непрерывной интеграции.

Рекомендуется, чтобы Daemon использовался во всех средах разработчиков. Рекомендуется отключить Daemon для непрерывной интеграции и создавать серверные среды.

Daemon обеспечивает более быструю сборку, что особенно важно, когда человек сидит перед сборкой. Для построения CI, стабильность и предсказуемость имеют первостепенное значение. Использование новой среды выполнения (т.е. Процесса) для каждой сборки является более надежным, поскольку среда выполнения полностью изолирована от предыдущих сборок.

С тех пор эти рекомендации изменились, см. Отключение демона

Так как Gradle 3.0, мы включаем Daemon по умолчанию и рекомендуем использовать его как для машин разработчиков, так и для серверов непрерывной интеграции. Однако, если вы подозреваете, что Daemon делает ваши сборки CI неустойчивыми, вы можете отключить его для использования новой среды выполнения для каждой сборки, так как среда выполнения полностью изолирована от любых предыдущих сборок.