【发布时间】:2017-12-08 20:35:59
【问题描述】:
我不确定我是否在标题中很好地总结了这一点,所以欢迎提出建议。
Jenkins 配置:
- 具有 0 个执行程序的 Jenkins linux 主机。
- 许多不同的代理/代理执行者。
- 许多声明性管道作业大多具有脚本化阶段。
- 声明性管道指定
agent { label "some-label" } - 许多受信任的共享库(在主 Jenkins 配置中配置的库)是使用 git 作为 VCS 加载的。
- 上面的大多数共享库都是有意隐式加载的,而不是显式加载的。
假设: 当共享库被隐式加载时,它们总是被克隆到主服务器上,并且脚本在执行实际的管道代码之前被加载到内存中。
问题: 对于每个运行的管道,在任何管道代码可以序列化并在代理上运行之前,在主服务器上克隆 X 个受信任的共享库。 我没有办法知道你可以告诉 Jenkins 一次只在主服务器上运行 N 个克隆。最终结果是,当大量管道同时运行时,同时在 master 上运行的 git clone 的数量很大,这会压倒 Jenkins 服务器或 git 服务器并导致构建失败(要么由于超时或其他相关原因)。
解决方法(排序)
隐式加载尽可能少的受信任共享库,然后显式加载它们,同时从 Lockable Resources Plugin 包裹在 lock ... { } 中,以限制 git 克隆的数量。
但这并不能真正解决需求,因为您需要使用隐式加载与显式加载是有特定原因的。
希望我遗漏了一些明显的东西:)
【问题讨论】:
-
我相信你不能改变詹金斯的行为本身(现在)是正确的。我认为对此的大多数答案都是意见,但我会集思广益一些想法。 *通过限制连接和带宽在网络级别做一些事情。 * 将一些库合并在一起,因为它们无论如何都是隐式加载的。 * 定期将存储库从您的 VCS 同步到 Jenkins 主服务器,并将全局库配置点放在这些本地文件资源中。 * 确保 VCS 的大小和调整正确,可能使用只读副本。这些只是需要考虑的几件事,祝你好运!
标签: jenkins jenkins-pipeline throttling