如何让多个Jenkins构建从一个本地git仓库中工作?

32

我有一个GitHub仓库,它很大并且包含几个可以独立构建的部分。如果我为每个部分配置一个Jenkins作业(或两个),则最终需要多次拉取千兆字节级别的数据(每个作业都要克隆一次仓库)。

这不仅占用了磁盘空间,还消耗了带宽。

我想做的是创建一个“刷新本地仓库”的作业,它只克隆GitHub一次,然后将每个作业配置为从该仓库克隆自己并进行构建。然后通过设置子作业为依赖构建,我可以运行“刷新本地仓库”,让它从GitHub拉取所有最新内容,然后运行每个构建。

到目前为止,我已经使“刷新本地仓库”工作正常 - 它成功克隆了仓库,并且如果我转到工作区,就会看到它具有来自origin/master的HEAD提交。

问题在于其他作业 - 这些似乎没有获取更新。这是我如何配置其中一个作业的方式:

Git
 Repository URL file:////Users/malcolmbox/.jenkins/jobs/Refresh Local repo/workspace
 Branches to build  master

更新应该是最新提交,但却停留在几天前。

我该如何拉取最新的提交并做正确的事情?

澄清一下:.../刷新本地仓库/工作区已经提交了6b20268389064590147d5c73d2b6aceb6ba5fe70于3月28日。

依赖构建,在运行构建(因此可能会执行git克隆/拉取步骤)后,检出到提交的79a25992cc192376522bcb634ee0f7eb3033fc7e于3月26日-因此落后几天。

4个回答

35

如果您打开工作配置并单击git SCM配置的高级按钮,您将看到一个指定"克隆期间使用的参考存储库路径(可选)"的地方。

如果您有仓库的本地克隆,请将该路径添加到参考存储库字段中。

Git将使用本地克隆,并共享大多数位于磁盘上的git对象,仅从github拉取缺少的内容,从而实现快速克隆和节省磁盘空间。

或者,您已经配置了您的工作,并且它没有选择最新提交?如果是这样,请提供更多细节。考虑发布您的工作配置。


9
想澄清一下:最新的git插件现在有一个高级选项的弹出菜单,参考代码库在“高级克隆行为”下。 - sti
这个路径是什么样子的?也就是说,它是绝对文件系统路径吗?我能使用其他作业名称作为路径的根目录吗? - demaniak
我不确定,但我认为需要绝对路径。在文件系统中,作业名称没有意义,特别是在从机上。 - sti

2
请查看 Clone Workspace 插件。你可以使用它,或者配置一个作业从 Github 更新本地仓库,然后让其他所有作业都从这个本地仓库拉取代码。
这样做并不能解决工作空间仍然需要磁盘空间的问题,但据我所知,这没有简单的解决方案。你可以将构建步骤更改为位于工作空间外的共享目录,但这是 hacky 的方法,可能会影响其他东西。另外,你还可以使用提供去重功能的文件系统。

我不太担心磁盘空间,而且我相信git很聪明,在克隆本地repo时会尽可能使用链接。让所有其他作业从本地repo拉取是我想做的事情 - 但我无法弄清楚如何做。似乎它们即使本地repo有新提交,也不会拉取新提交。 - Malcolm Box
你如何触发构建?你尝试过轮询本地仓库并检查轮询日志吗? - Lars Kotthoff
我在次要构建中使用“Build after”触发器。 - Malcolm Box

1

我有过同样的经历。

我有一个工作要拉取真正的远程仓库,也就是Github。

其他的每个工作(有很多)都有一个像这样的“存储库URL”:

file:///C:/Program Files (x86)/Jenkins/jobs/webtest-local-repo/workspace/.git

它可以克隆,但后续的获取操作没有注意到任何更改。

在gitbash中也存在相同的问题,所以我猜这是一个git问题,而不是jenkins问题。

我的可怕的解决方法是让依赖的作业在构建完成后删除它们的工作区,以便每个git操作都是“克隆”。这很荒谬,但可能比让无数个作业同时访问同一个github仓库要好一些。

天哪!那也没用,因为虽然git可以成功地克隆仓库,但jenkins会记住先前的修订版本并再次构建完全相同的版本。也许这与this issue有关,我不知道,我已经非常厌倦了。我们放弃了,现在所有的作业都再次轮询github。也许我会尝试使用钩子。


0
  1. 创建一个多配置的Jenkins任务,只需检出您的repo并定期构建。它不必在每次提交时构建,因为您的其他repo将自动从实际远程拉取任何更改,如果在此repo中找不到它们。
  2. 打开配置矩阵的“标签”部分,并逐个勾选每个构建节点。
  3. 在其他作业上,单击git SCM配置的高级按钮,找到“克隆期间要使用的参考存储库路径(可选)”。输入$WORKSPACE/../ReferenceRepo/label/$NODE_NAME,其中ReferenceRepo是您上面创建的作业的名称。

为使此操作生效,您需要在每台机器上重新克隆每个作业。现在,它们应该尽可能使用参考存储库中的数据,从而节省您的构建节点上的磁盘空间和带宽。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接