如何在使用Docker

问题描述 投票:0回答:2


上面的评论中提到的gradle问题,我会做类似的事情 - 将Gradle Cache复制到启动时的容器中,并在构建结束时编写任何更改:

pipeline { agent { docker { image '…' // Mount the Gradle cache in the container args '-v /var/cache/gradle:/tmp/gradle-user-home:rw' } } environment { HOME = '/home/android' GRADLE_CACHE = '/tmp/gradle-user-home' } stages { stage('Prepare container') { steps { // Copy the Gradle cache from the host, so we can write to it sh "rsync -a --include /caches --include /wrapper --exclude '/*' ${GRADLE_CACHE}/ ${HOME}/.gradle || true" } } … } post { success { // Write updates to the Gradle cache back to the host sh "rsync -au ${HOME}/.gradle/caches ${HOME}/.gradle/wrapper ${GRADLE_CACHE}/ || true" } } }

由于Gradle 6.1,可以在只读的缓存中重用下载的依赖项。该缓存还可以在同一版本中重新定位,因此可以在不同的机器之间复制。
jenkins gradle jenkins-pipeline
2个回答
11
投票

.gradle/caches/modules-2

您可以将卷载为只读的卷,并用
gradle_ro_dep_cache

0
投票
点grointle。

agent { docker { image 'your-image' args """ -v /srv/jenkins/.gradle:/gradle-read:ro \ -e GRADLE_RO_DEP_CACHE=/gradle-read/caches """ } }

这是假设您在主机上有一个启动的gradle用户目录

/srv/jenkins/.gradle
任何缓存错过仍将下载到本地用户目录(每个构建)。

时间,缓存变老了,需要用新的下载依赖项播种。 如果您选择,下载的依赖项是可重新定位的(再次是Gradle 6.1),可以从同一工作中播种,这需要一个更复杂的解决方案:

String dockerGradleUserHomeDir = "/tmp/.gradle" agent { docker { image 'your-image' args """ -v /srv/jenkins/.gradle:/gradle-read:ro \ -v /srv/jenkins/.gradle:/gradle-write:rw \ -e GRADLE_USER_HOME=${dockerGradleUserHomeDir} \ -e GRADLE_RO_DEP_CACHE=/gradle-read/caches """ } stages { ... } post { success { // Sync downloaded dependencies back sh """ if [ -d "${dockerGradleUserHomeDir}/caches/modules-2" ]; then rsync -aui --size-only --exclude '*.lock' ${dockerGradleUserHomeDir}/caches/modules-2/ /gradle-write/caches/modules-2/ || true fi """ } } }
在这里,我们设置一个自定义

Gradle_user_home

目录以确保从哪里复制文件,并将额外的可写入目录安装到与仅读取的点相同的点。
官方文档:
https://docs.gradle.org/current/userguide/depparency_caching.html#sec:ephemeral-ci-cache

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.