如何在Jenkins中一次只触发一次构建?

时间:2016-10-03 21:56:07

标签: git jenkins githooks

这是How to configure Git post commit hook

的扩展或变体

我遇到的问题是我每次提交需要一次构建。我想要的是一次触发一个构建的单个实例。当该单个实例正在运行时,新请求可能会累积,但在当前构建完成后,它们应合并到一个新构建中。

显然,触发应该是有意义相关的git修订版,通常来自同一个分支,构建应该总是在最接近HEAD的触发修订版上执行(这有意义吗?)。

所以,为了这个问题,假设每个人都在推动掌握,我放置一个git钩子来触发构建。如何使待处理的请求合并为单个请求而不是作为单独的构建排队?

通过使用轮询可以轻松配置此行为,但我不想出于各种不相关的原因(大量作业+需要轮询单个作业消耗的多个回购)来使用轮询。

Jenkins parameterized job that only queues one build提供了一种可能性:使用"启动器"快速终止并通过"组合排队的git哈希"启动实际工作的工作。这种方法的问题在于启动器作业需要在启动工作作业之前检查回购。鉴于git repo很大,这会带来不可接受的延迟。

1 个答案:

答案 0 :(得分:1)

您是否需要通过git hooks触发构建?

因为如果没有,您可以轻松地获得所需的行为,将您的作业触发器更改为存储库轮询,并具有适当的超时。 让我们说五分钟,这为这些新版本提供了足够的时间来叠加并立即构建。

此外,您可以使用Throttle Concurrent Builds plugin并添加避免并发构建的约束。

修改 除了添加Quiet Period之外,还可以选择保留git钩子。哪个是Jenkins核心功能,可以通过管理Jenkins 部分访问。

<强> EDIT2: 当我阅读您的新评论时,我考虑了Parametrized Scheduler Plugin并添加了一个参数来指定存储库URL,但这并不是为了定期修改它的调度而进行轮询,这不是您想要的

根据新的要求,我会做一些听起来有点像Jerry Rig的事情: 我会创建另一个名为 your-project-executor 的工作,这个人会定期构建(每2分钟左右)并运行一个shell脚本,它会有一个很大的if-else块,这将是git fetch和检查不同预定义存储库中的更改,如果给定存储库有更改,那么这将使用所需参数(REPO_URL等等)触发当前作业。

要检查更改,您可以将HEAD当前修订版哈希存储在执行程序作业工作区的属性文件中,然后将其与git rev-parse HEAD的输出进行比较。

<强> EDIT3: 设置构建速率的示例: enter image description here 这将每小时消耗一次队列。