如何从其他Job程序化触发构建重放及实现Job构建优先级管控
实现Jenkins构建优先级的方案
一、重放被取消构建的方法
你已经保存了被取消的构建编号buildNumbers,可以通过以下代码重新触发这些构建:
1. 兼容Pipeline与FreeStyle Job的重放代码
def TARGET_JOB = "你的目标Job完整名称" def job = Jenkins.instance.getItemByFullName(TARGET_JOB) // 按原队列顺序重放构建,避免打乱原有执行逻辑 buildNumbers.each { buildNum -> def originalBuild = job.getBuildByNumber(buildNum) if (originalBuild) { // 获取原构建的参数(如果有) def paramsAction = originalBuild.getAction(hudson.model.ParametersAction.class) def triggerParams = paramsAction ?: new hudson.model.ParametersAction() if (!dryRun) { // 复用原参数触发新构建 job.scheduleBuild2(0, new hudson.model.Cause.UserIdCause(), triggerParams) } println "重新触发构建 #${buildNum}" } else { println "警告:找不到编号为 #${buildNum} 的构建" } }
注意事项
- 重放时必须按原队列顺序触发,否则会破坏原本的任务执行逻辑
- 如果原构建无参数,直接调用
job.scheduleBuild2(0)即可 - 执行脚本的用户需要拥有目标Job的构建权限
二、更优雅的构建优先级实现方案
除了取消重放的思路,还有几种更高效的方式实现优先级:
1. 用Priority Sorter插件直接配置优先级
- 安装插件后,在目标Job的配置页找到「Priority Sorter」选项,设置优先级数值(数值越大优先级越高)
- 高优先级的构建会自动插队到队列最前面,无需手动取消任务,完美适配禁用并发的Job
2. 自定义队列拦截器调整顺序
通过Groovy脚本实现队列任务拦截,在构建进入队列时直接调整优先级:
import hudson.model.Queue import jenkins.model.Jenkins // 自定义队列任务调度器 class PriorityDispatcher extends Queue.TaskDispatcher { @Override boolean canRun(Queue.Task task) { // 匹配目标Job if (task.fullDisplayName.contains("你的目标Job名称")) { // 设置高优先级,数值越大越靠前 task.priority = 100 } return super.canRun(task) } } // 注册调度器到Jenkins队列 Jenkins.instance.queue.dispatchers.add(new PriorityDispatcher())
- 这种方式无需取消已有构建,直接在队列层面调整顺序,逻辑更简洁
3. 触发构建时直接指定优先级
通过脚本触发构建时,附带优先级参数:
def job = Jenkins.instance.getItemByFullName("你的目标Job名称") // 设置优先级为100(数值越大优先级越高) job.scheduleBuild2(0, new hudson.model.Cause.UserIdCause(), null, new hudson.model.ParametersAction(), new hudson.model.PriorityAction(100) )
内容的提问来源于stack exchange,提问作者Thomas Freiling
相关产品推荐
相关产品推荐

