上面的评论中提到的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,可以在只读的缓存中重用下载的依赖项。该缓存还可以在同一版本中重新定位,因此可以在不同的机器之间复制。
.gradle/caches/modules-2
您可以将卷载为只读的卷,并用gradle_ro_dep_cache
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