在Docker上运行Jenkins时如何配置Gradle缓存

Ido*_*Ran 6 gradle jenkins jenkins-pipeline

我正在构建用于使用Gradle构建项目的Jenkins管道。
詹金斯有几个奴隶。所有从机均连接至NAS。
一些构建步骤在Docker容器中运行Gradle,而其他一些步骤则直接在从属服务器上运行。

目标是使用尽可能多的缓存,但我也遇到了死锁问题,例如

Could not create service of type FileHasher using GradleUserHomeScopeServices.createCachingFileHasher().
> Timeout waiting to lock file hash cache (/home/slave/.gradle/caches/4.2/fileHashes). It is currently in use by another Gradle instance.
Run Code Online (Sandbox Code Playgroud)

Chr*_*Orr 6

由于上面评论中提到的 Gradle 问题,我做了这样的事情——在启动时将 Gradle 缓存复制到容器中,并在构建结束时写回任何更改:

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"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)