如何修复当工作区位于网络共享上时在 git 签出时失败的 Jenkins 作业,但当工作区位于本地驱动器上时则不然?



我正在构建一个服务,该服务创建将连接到 Jenkins 服务器的动态节点。这些节点将主要用于构建许多大型代码库,因此我想利用增量构建。由于节点是临时虚拟机,在作业完成后的某个时间会被销毁,因此我需要 Jenkins 工作区不是计算机上的本地驱动器。

我创建了一个网络共享,并将 Jenkins 节点的根目录设置为 I:\jenkins。当 VM 联机时,我的服务将执行将 I 驱动器映射到网络共享的命令。然后,该服务执行命令以将服务连接到 Jenkins 主服务器。当我尝试针对节点运行构建时,它在尝试 git checkout 时始终失败。

作业失败后,网络共享包含 git 存储库中的大部分文件,因此共享是可访问的,并且没有阻止作业运行的读/写限制。此错误发生在我尝试运行的任何作业中,包括访问文件很少的 git 存储库的作业。

失败的 Jenkins 作业中的日志输出为:

git checkout -f ...a70f FATAL: Could not checkout ...a70f hudson.plugins.git.GitException: Could not checkout ...a70f ...<stack trace>... stderr: error: failed to read object ...f656 at offset ...1596 from .git/objects/pack/pack-...2475.pack fatal: packed object ...f656 (stored in .git/objects/pack/pack-...2475.pack) is corrupt

如果我将节点的工作区更改为本地驱动器,然后重新连接完全相同的计算机并重新运行完全相同的作业,则永远不会看到失败。Git 正确地克隆了我需要的一切,我的工作变得绿色。

如何解决我在网络共享中看到的问题?或者,我如何满足以下要求:

  • Jenkins 节点必须在可能随时销毁和重新创建的临时 VM 上运行
  • 工作区必须同时对多个 VM 可见(作业的严格工作区命名可防止多个节点读取/写入相同的文件)
  • 即使没有 Jenkins 节点在线,工作区也必须持久化
  • 联机的任何新节点都必须能够重新连接到工作区

如果有不需要网络共享的解决方案,我很乐意尝试其他方法!

在这里找到了一个解决方案: GIT 拉取错误 - 远程对象已损坏

出于某种原因,当工作区位于本地存储中时,默认的 git 配置值工作得很好。迁移到任何外部映射的存储解决方案时,需要修改 git 配置以防止

相关内容

最新更新