我如何使一个单一的'.Gradle的多个项目缓存?



我们试图通过在NFS中创建.gradle来在多个构建工作者(在jenkins中)中使用单个.gradle缓存。与所有worker共享的Mount。

现在当我们使用gradle构建运行多个项目时,它们会出现以下错误:

Timeout waiting to lock artifact cache (/common/user/.gradle/caches/modules-2). It is currently in use by another Gradle instance.
Owner PID: 1XXXX
Our PID: 1XXXX
Owner Operation: resolve configuration ':classpath’
Our operation: resolve configuration ':classpath’
Lock file: /common/user/.gradle/caches/modules-2/modules-2.lock

在多用户之间使用.gradle缓存共享的建议方法是什么?此模型适用于maven .m2缓存。

我们不能为每个worker使用.gradle,因为它占用了大量的缓存空间来存储jar文件。

由于Gradle对其依赖缓存使用的锁定机制,你不能让多个实例写入同一个缓存目录。

然而,你可以创建一个共享的,只读的可以被多个Gradle实例使用的依赖缓存。你可以在文档中找到说明。基本机制是创建一个文件夹,其中预先填充了您认为构建将需要的依赖项,然后设置GRADLE_RO_DEP_CACHE环境变量以指向该文件夹。

这个缓存,不像经典的依赖缓存,访问时不加锁,使得多个版本可以并发地从缓存中读取。

因为这个缓存是只读的,所以您需要事先向它添加依赖项。构建本身不能将它们的依赖项写回只读共享缓存。缓存需要遵循Gradle期望的文件夹结构,但是,这并不是真正可以手工设置的。在实践中,获得一个可用的共享缓存的方法是复制由现有Gradle实例创建的依赖缓存。

只读缓存应该来自Gradle依赖缓存,该缓存已经包含了一些必需的依赖。[…在持续集成环境中,有一个"种子"构建是一个好主意。Gradle依赖缓存,然后复制到另一个目录。这个目录可以用作其他版本的只读缓存。

但是,共享缓存不需要包含所有的依赖项。任何丢失的缓存都将被每个单独的构建正常获取,就好像共享缓存不存在一样。

https://docs.gradle.org/current/userguide/dependency_resolution.html子:shared-readonly-cache

使用"gradle手册中的图形不是很有指导意义,但是他们说:

  • 运行一个常规的gradle构建。
  • 在windows上,
  • 现在进入%USERPROFILE%。gradlecaches,在那里你找到一个名为'modules-2'的文件夹
  • 按原样抓取模块-2文件夹,将其移动到所有构建都可以访问的目录中,这样您就有模块-2…
  • 删除任何.lock或gc。mygradle_ro_cache>modules-2
  • 设置环境变量GRADLE_RO_DEP_CACHE为
    完成。

最新更新