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

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

Here is the context of my problem:

  • 和管道后的狗gitlab
  • 在同一实习中的几个工作
  • 所有作业都使用需要使用其缓存的任务gradle
  • 所有作业共享相同的gradle缓存

My problem:

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

出了什么问题:无法使用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,但没有工作。

gradle locking gitlab-ci
1个回答
1
投票

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

不幸的是,这样的场景是Gradle的currently not supported。 Gradle开发人员Stefan Oehme写了this comment wrt。共享Gradle用户主页:

如果Gradle进程是无竞争的(以获得性能),它们将保持锁定。争用是通过进程间通信来宣布的,当进程在Docker容器中被隔离时,这种通信不起作用。

而且他更清楚地说他在a follow-up comment(由我强调):

可能还有其他问题我们尚未发现,因为在机器之间共享用户主页不是我们设计的用例。

换句话说:Gradle目前尚未正式支持在不同的计算机或其他独立进程中共享Gradle用户主目录或甚至只是缓存部分。 (另见my related question。)

我想解决这个问题的唯一方法是:

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