这是How to configure Git post commit hook如何在Jenkins中一次远程触发一次构建?
的延伸或变体我的问题是,我不希望每一个致力于构建。我想要的是一次触发一个构建的单个实例。当单个实例正在运行时,新的请求可能会累积,但是当前的构建完成后,它们应该合并到一个新的构建中。
显然,触发应该在通常来自同一分支的有意义的git修订版本上,并且构建应始终在最接近HEAD的触发修订版上执行(这是否合理?)。
所以,为了这个问题,假设每个人都在推动主,并且我放置了一个git钩子来触发构建。我该如何做到这一点,以便待处理的请求合并到单个请求中而不是作为单独的构建排队?
此行为通过使用轮询可以进行简单配置,但我不想为各种不相关的原因(大量作业+需要轮询单个作业所消耗的多个回购)使用轮询。
Jenkins parameterized job that only queues one build提供了一种可能性:使用快速终止的“启动器”作业并使用“组合排队的混帐哈希”启动实际的工作作业。这种方法的问题在于启动器工作需要在启动工作任务之前检查回购。鉴于一个大的git回购,这引起了无法接受的延迟。
我想到的一点是,我允许作业在队列中累积,每当作业运行时,它完全忽略触发运行的git commit并只检出HEAD,然后运行一个小系统groovy脚本清除所有比作业启动时间更早的请求的队列,从而在启动构建之后但在队列上运行脚本之前留下任何新请求,所以即使在运行脚本之前也不会错过运行没有更多的新请求进来... –
队列清理的麻烦是,直到新的运行被触发,数百个新的请求可以堆积起来,渲染左侧的作业历史是无用的。 –
另一个想法是不直接触发长时间运行的单件作业,而是触发一个小型系统常规工作,然后管理长时间运行的作业的队列。在每次调用时,它都会检查实际作业是否正在运行,如果没有,则启动它。如果队列为空,则排队,否则清空队列并排队新作业。 –