代码之家  ›  专栏  ›  技术社区  ›  Jeremy Friesner

如何在没有轮询的情况下让本地git镜像保持最新?

  •  1
  • Jeremy Friesner  · 技术社区  · 7 年前

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

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

    这类作品;但问题是:

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

    我们目前解决这个问题的方法是将GitBlit设置为更频繁地轮询GitHub,但我不喜欢将其作为一种解决方案,因为它会在互联网上造成更多周期性/不必要的流量,并且仍然不能完全避免生成失败的可能性,例如,在开发人员推动更改,然后立即触发生成的情况下。

    对于这个问题,是否有一个已知的“最佳实践”解决方案可以自动为我们提供可靠的Jenkins构建行为,并避免经常轮询GitHub?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Karol Dowbecki    7 年前

    你可以用 Github webhook 要将以下事件通知本地基础结构:

    • 将存储库推送到
    • 一个拉取请求被打开
    • 一个GitHub页面网站已经建立
    • 新成员将添加到团队中

    请注意,这将最大限度地减少延迟,但在某些情况下,例如网络问题或Github基础设施部分中断,它仍可能导致构建失败。

    将Jenkins autobuild设置为在生成之前更新本地镜像可能是唯一安全的解决方案。

        2
  •  0
  •   mkasberg    7 年前

    我认为最好的解决方案是使用一个真正的Git存储库镜像,而不是尝试运行自己的镜像。如果不访问webhooks(假设您不拥有GitHub存储库),最好的办法就是轮询。

    有一些开源解决方案(可以想到Artifactory和Nexus)可以镜像Git存储库并提供缓存功能。我想你会发现,这些镜像比按一定时间间隔更新的脚本可靠得多。此外,我认为他们可以做一些事情,比如当用户试图拉取时,对上游回购进行快速哈希验证,这样他们就知道它们是否过时(并将立即更新以提供正确的版本)。