2016-10-03 83 views
3

这是How to configure Git post commit hook如何在Jenkins中一次远程触发一次构建?

的延伸或变体我的问题是,我希望每一个致力于构建。我想要的是一次触发一个构建的单个实例。当单个实例正在运行时,新的请求可能会累积,但是当前的构建完成后,它们应该合并到一个新的构建中。

显然,触发应该在通常来自同一分支的有意义的git修订版本上,并且构建应始终在最接近HEAD的触发修订版上执行(这是否合理?)。

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

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

Jenkins parameterized job that only queues one build提供了一种可能性:使用快速终止的“启动器”作业并使用“组合排队的混帐哈希”启动实际的工作作业。这种方法的问题在于启动器工作需要在启动工作任务之前检查回购。鉴于一个大的git回购,这引起了无法接受的延迟。

+0

我想到的一点是,我允许作业在队列中累积,每当作业运行时,它完全忽略触发运行的git commit并只检出HEAD,然后运行一个小系统groovy脚本清除所有比作业启动时间更早的请求的队列,从而在启动构建之后但在队列上运行脚本之前留下任何新请求,所以即使在运行脚本之前也不会错过运行没有更多的新请求进来... –

+0

队列清理的麻烦是,直到新的运行被触发,数百个新的请求可以堆积起来,渲染左侧的作业历史是无用的。 –

+0

另一个想法是不直接触发长时间运行的单件作业,而是触发一个小型系统常规工作,然后管理长时间运行的作业的队列。在每次调用时,它都会检查实际作业是否正在运行,如果没有,则启动它。如果队列为空,则排队,否则清空队列并排队新作业。 –

回答

1

您是否有通过git钩子触发构建的需求?

因为如果没有,您可以很容易地得到所需的行为,将您的作业触发器更改为存储库轮询,并且超时。 让我们说五分钟,这给了这些新版本的足够时间来堆积起来并且一次建成。

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

编辑: 还有保持你的git钩子,但增加一个Quiet Period的选项。这是詹金斯的核心功能,可通过管理詹金斯部分到达。

EDIT2: 当我读过你的新意见,我想过Parametrized Scheduler Plugin并添加参数指定库的URL,但这不是轮询更改它的调度定期构建,这是不是你想要的。

在新规定的光,我会做一些听起来有点像杰里钻机: 我会创造另一个作业称为您的项目执行人这家伙将定期(每隔2分钟左右构建),然后运行一个shell脚本,该脚本会包含一个大的if-else块,这样可以获取并检查不同预定义存储库中的更改,如果给定的存储库发生更改,则会使用所需参数触发当前作业REPO_URL等)。

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

EDIT3:设置生成率 例子: enter image description here 这将每小时一次消耗你的队列中。

+0

主要问题是我需要轮询多个回购,因为工作消耗多个回购。 –

+0

另一个用例是在另一个作业的下游触发的作业。我知道在这种情况下,有一个名为“Combine Queued git hashes”的复选框,它可以实现我想要的功能,但实现远程触发构建意味着要执行两个签出(一个用于使用Combined Queued git运行实际作业的作业哈希,然后一个用于实际工作)。想想看看一个15G的git仓库...... –

+0

有一点需要记住的是,你不需要克隆仓库来检查它是否有新的变化。你只需要获取索引... –