无法使用 GradleUserHomeScopeServices.createCachingFileHasher() 创建 FileHasher 类型的服务

lep*_*eil 6 locking gradle gitlab-ci

这是我的问题的上下文:

  • 一个 gitlab ci yml 管道
  • 同一份实习中的多个工作
  • 所有作业都使用需要使用缓存的任务 gradle
  • 所有作业共享相同的 gradle 缓存

我的问题:

有时,当同时有多个管道时,我得到:

出了什么问题:无法使用 GradleUserHomeScopeServices.createCachingFileHasher() 创建 FileHasher 类型的服务。

超时等待锁定文件哈希缓存 (/cache/.gradle/caches/5.1/fileHashes)。它目前正被另一个 Gradle 实例使用。所有者 PID:149 我们的 PID:137 所有者操作:我们的操作:锁定文件:/cache/myshop/reunion/.gradle/caches/5.1/fileHashes/fileHashes.lock

我找不到有关 gradle 使用的锁定系统的任何文档。我不明白为什么当 gradle 操作没有写入缓存目录时会定位锁。

有谁知道锁的工作原理?或者我可以简单地更改超时的持续时间以允许伴随的任务在失败之前等待足够长的时间吗?

通过 www.DeepL.com/Translator 翻译

我试图在没有守护进程的情况下调整 gradle,但没有奏效。

Sem*_*nko 8

我通过杀死java活动监视器(MacOS)中的所有进程来解决这个问题。希望能帮助到你。


Chr*_*iki 6

当您尝试在不同主机上运行的多个 Gradle 进程之间共享 Gradle 缓存时,您通常会收到此错误。我假设您的 CI 管道运行在不同的主机上,或者它们至少彼此隔离运行(例如,作为不同 Docker 容器的一部分)。

不幸的是,Gradle目前不支持这样的场景。Gradle 开发人员 Stefan Oehme 写了这篇评论。共享 Gradle 用户主页:

如果 Gradle 进程没有竞争,它们将持有锁(以提高性能)。争用是通过进程间通信宣布的,当进程在 Docker 容器中隔离时,这种通信不起作用。

更清楚的是,他在后续评论中指出(由我强调):

不过,可能还有其他我们尚未发现的问题,因为在机器之间共享用户家并不是我们为.

换句话说:Gradle 目前不正式支持在不同的机器或其他隔离的进程之间共享一个 Gradle 用户主页,甚至只是它的缓存部分。(另见我的相关问题。)

我想为您的场景解决这个问题的唯一方法是:

  • 确保 CI 管道中的 Gradle 进程可以相互通信(例如,通过在同一主机上运行它们),或
  • 不要直接共享 Gradle 用户主页,例如,通过为所有 CI 管道创建副本,或
  • 不要并行运行 CI 管道。