当前位置: 首页 > 知识库问答 >
问题:

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

乐正浩宕
2023-03-14
  • gitlab ci yml管道
  • 同一个实习岗位中的多个工作
  • 所有作业都使用需要使用其缓存的任务gradle
  • 所有作业共享相同的gradle缓存

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

问题所在:无法使用GradleUserHomeScopeServices.createCachingFileHasher()创建FileHasher类型的服务。

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

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

有人知道锁是怎么工作的吗?或者我可以简单地更改超时的持续时间,让伴随的任务在失败之前等待足够长的时间?

www.DeepL翻译。com/转换器

我试图在没有守护程序的情况下tun gradle,但没有成功。

共有3个答案

阳修永
2023-03-14

另一种可能发生这种情况的情况是,这些Gradle相关文件中的一些文件位于云文件系统上,如OneDrive,需要重新验证。

  1. 重新认证到云文件系统
  2. Android Studio中的“无效缓存并重启”
戚翰飞
2023-03-14

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

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

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

他在后续评论中更明确地指出(我强调):

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

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

我想对于您的场景,解决此问题的唯一方法是:

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

我通过在Activity Monitor(MacOS)中杀死所有java进程解决了这个问题。希望有帮助。

 类似资料: