Jenkins参数化作业仅排队一个版本 [英] Jenkins parameterized job that only queues one build

查看:185
本文介绍了Jenkins参数化作业仅排队一个版本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

想象一下,詹金斯(Jenkins)作业A需要1分钟才能运行,而作业B则需要5分钟.

Imagine a Jenkins job A which takes 1 minute to run, and job B which takes 5 minutes.

如果我们将作业A配置为触发作业B,而作业B正在运行,则作业A可能在B完成之前运行了5次.但是,Jenkins并未将5个构建添加到作业B的队列中,这很棒,因为否则,快速的作业A会为缓慢的较差的作业B创建不断增加的构建积压.

If we configure job A to trigger job B, while job B is running job A may run 5 times before B completes. However, Jenkins doesn't add 5 builds to job B's queue, which is great because otherwise speedy job A would be creating an ever-growing backlog of builds for poor slow job B.

但是,现在我们想使用参数参数化的将作业A触发器B作为参数化作业触发插件.参数化的作业 do 排队积压,这意味着作业A正在为作业B高兴地创建大量构建,而这可能无法跟上.

However, now we want to have job A trigger B as a parameterized job, using the parameterized trigger plugin. Parameterized jobs do queue up a backlog, which means job A is happily creating a huge pile of builds for job B, which can't possibly keep up.

每次触发队列时都将新的参数化构建添加到队列中是很有意义的,因为参数可能不同.詹金斯不应该总是认为新的参数化构建不需要先前排队的构建.

It does make sense to add a new parameterized build to the queue each time it's triggered, since the parameters may be different. Jenkins should not always assume that a new parameterized build renders previously queued ones unnecessary.

但是,在我们的情况下,我们实际上希望这样做.作业A构建并打包我们的应用程序,然后作业B将其部署到生产环境中,并运行大量的集成测试.我们还有一个版本C,它可以部署到另一个环境并进行更多测试,因此这对我们来说是一个不断升级的模式.

However, in our case we actually would like this. Job A builds and packages our application, then Job B deploys it to a production-like environment and runs a heavier set of integration tests. We also have a build C which deploys to another environment and does even more testing, so this is an escalating pattern for us.

我们希望参数化作业B的队列仅保留最后一个版本;每个新版本都会替换队列中当前的任何作业.

We would like the queue for our parameterized job B to only keep the last build added to it; each new build would replace any job currently in the queue.

有什么好的方法可以做到这一点吗?

Is there any nice way to achieve this?

推荐答案

向作业B添加一个系统Groovy脚本"预构建步骤,该步骤检查同名的(较新的)排队的作业,并在找到后进行救助:

Add a "System Groovy Script" pre-build step to job B that checks for (newer) queued jobs of the same name, and bails out if found:

def name = build.properties.environment.JOB_NAME
def queue = jenkins.model.Jenkins.getInstance().getQueue().getItems()
if (queue.any{ it.task.getName() == name }) {
  println "Newer " + name + " job(s) in queue, aborting"
  build.doStop()
} else {
  println "No newer " + name + " job(s) in queue, proceeding"
}

这篇关于Jenkins参数化作业仅排队一个版本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆