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

时间:2018-11-19 20:25:47

标签: git jenkins polling mirroring

场景:我们的开发团队使用Jenkins进行持续集成,并且我们的某些代码是开源的,因此托管在GitHub.com上。

我们有相关GitHub存储库的本地镜像,并且我们的本地GitBlit服务器设置为定期轮询GitHub存储库以更新本地镜像。

这种“作品”;但是问题场景是这样的:

  1. 开发人员意识到他需要对开源代码库进行更改,因此将更改推送到GitHub存储库,并更新了我们封闭源Git存储库中的子模块以指向新修订版。
  2. 然后,本地开发人员在Jenkins上触发自动构建,以便他可以测试/验证更改是否在所有平台上都有效
  3. 由于GitHub存储库的本地镜像尚未更新以反映原始版本,因此Jenkins自动构建失败,因此当Jenkins尝试更新其各个工作区中的子模块时,本地镜像无法识别封闭源git存储库所指向的版本ID。

我们当前针对此问题的解决方法是将GitBlit设置为更频繁地轮询GitHub,但我不喜欢将其作为解决方案,因为它会导致Internet上出现更多周期性/不必要的流量,并且仍不能完全避免构建失败的可能性,例如如果开发人员先推送更改,然后立即触发构建。

是否存在针对该问题的已知“最佳实践”解决方案,该解决方案将自动为我们提供可靠的Jenkins-build-behavior并避免不断轮询GitHub?

2 个答案:

答案 0 :(得分:1)

您可以使用Github webhook来通知本地基础架构有关以下事件的信息:

  
      
  • 存储库已推送到
  •   
  • 拉取请求已打开
  •   
  • 已建立GitHub Pages网站
  •   
  • 新成员已添加到团队
  •   

请注意,这将最大程度地减少延迟,但是在某些情况下,例如网络问题或Github基础架构部分中断,仍然可能使您的构建失败。

设置Jenkins自动构建以在构建之前更新本地镜像可能是唯一安全的解决方案。

答案 1 :(得分:0)

我认为这里最好的解决方案是使用真实的Git存储库镜像,而不是尝试自己构建。如果无法访问webhooks(假设您不拥有GitHub存储库),那么您可以做的最好的事情就是轮询。

有可用的开源解决方案(可以想到Artifactory和Nexus),它们可以镜像Git存储库并提供缓存功能。我认为您会发现这些镜像比按一定间隔更新的脚本更可靠。而且,我认为他们可以执行类似的操作,例如在用户尝试提取时对上游存储库进行快速哈希验证,以便他们知道它们是否已过期(并会立即更新以提供正确的版本)。