无法使用GradleUserHomeScopeServices.createCachingFileHasher()

时间:2019-01-30 16:43:43

标签: gradle locking 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,没有用。

3 个答案:

答案 0 :(得分:4)

我通过取消活动监视器(MacOS)中的所有java进程来解决此问题。希望对您有所帮助。

答案 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管道。

答案 2 :(得分:0)

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

  1. 重新认证云文件系统
  2. Android Studio中的“使缓存无效并重新启动”