如何在不轮询的情况下保持本地git镜像的最新状态?

3
场景:我们的开发团队使用Jenkins进行持续集成,而我们的一些代码是开源的,因此托管在GitHub.com上。
我们有相关GitHub存储库的本地镜像,并且我们的本地GitBlit服务器设置为定期轮询GitHub存储库以更新本地镜像。
这“有点起作用”;但问题情况是这样的:
1. 开发人员意识到他需要更改开源代码库,因此将更改推送到GitHub存储库,并更新闭源Git存储库中的子模块以指向新版本。 2. 然后,本地开发人员触发Jenkins上的自动构建,以便测试/验证更改在所有平台上是否有效。 3. Jenkins自动构建失败了,因为GitHub存储库的本地镜像尚未更新以反映原始更改,因此当Jenkins尝试在其各个工作区中更新子模块时,本地镜像无法识别闭源git存储库所指向的修订ID。
我们目前解决这个问题的方法是设置GitBlit更频繁地轮询GitHub,但我不喜欢这种解决方案,因为它会在互联网上造成更多的周期性/不必要的流量,并且仍然无法完全避免构建失败的可能性,例如,在开发人员推送更改后立即触发构建的情况下。

是否有已知的“最佳实践”解决方案可以自动为我们提供可靠的Jenkins构建行为,并避免不断轮询GitHub?

2个回答

2
您可以使用Github Webhook来通知本地基础设施以下事件:
  • 推送存储库
  • 打开拉取请求
  • 构建GitHub Pages站点
  • 添加新成员到团队中
请注意,这将最小化延迟,但在某些情况下(例如网络问题或Github基础架构部分故障)仍可能导致构建失败。
在构建之前将Jenkins自动构建设置为更新本地镜像可能是唯一安全的解决方案。

2
但是如果他们不拥有上游的GitHub存储库,他就无法这样做。 - mkasberg
在这种情况下,我们确实拥有上游的 GitHub 存储库(尽管了解在我们不拥有它的情况下可以应用的解决方案也很重要,仅供将来参考)。 - Jeremy Friesner

0

我认为这里最好的解决方案是使用真正的Git仓库镜像,而不是尝试自己编写。如果没有Webhooks(假设您不拥有GitHub存储库),那么您能做的最好的事情就是轮询。

有一些开源解决方案可用(例如Artifactory和Nexus),它们可以镜像Git存储库并提供缓存功能。我认为您会发现这些镜像比按照一定时间间隔更新的脚本更可靠。此外,我认为它们可以在用户尝试拉取时对上游仓库运行快速哈希验证,因此他们知道是否过时(并将立即更新以提供正确的版本)。


“git clone --mirror”不算是真正的镜像吗? - Jeremy Friesner
1
据我所知,git clone --mirror 并不会自动更新镜像;它只是配置仓库以表现出镜像的行为。当然,编写脚本来实现这一点也没有问题,但如果你选择这种方式,我认为你所描述的问题并没有明显的解决方案。我预计,我提到的某些技术内部使用 git clone --mirror,但提供了我所说的额外功能。 - mkasberg

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