如何更新Jenkins任务并在更新后立即应用新参数运行
Jenkins Job DSL更新任务后立即启动的解决方案
根因说明
Job DSL 执行pipelineJob配置块时,只会将配置变更暂存到内存缓冲区,所有配置修改要等到整个DSL脚本执行完成后才会正式写入Jenkins的任务配置存储。同一脚本内紧跟pipelineJob调用启动任务的逻辑,读取的是未修改前的旧任务配置,因此新参数不会生效。
单脚本实现方案
方案1:启动时显式传入最新参数(最推荐)
更新任务配置时你已经持有最新的folders变量值,启动任务时直接显式传入参数即可,无需等待配置落地,稳定性最高:
// 创建或更新流水线任务 pipelineJob("secondJob") { stringParam('Folders', folders,'New folders') // 其余任务配置 } // 启动时直接传入最新参数,wait: false 对应原queue的非阻塞效果 build job: "secondJob", parameters: [string(name: 'Folders', value: folders)], wait: false
方案2:轮询等待配置生效后启动
如果你必须依赖任务的默认参数配置(比如同时更新了大量参数不想逐个传递),可以增加轮询逻辑校验配置更新完成后再启动任务:
import jenkins.model.Jenkins def targetJobName = "secondJob" def expectedFoldersVal = folders // 创建或更新流水线任务 pipelineJob(targetJobName) { stringParam('Folders', expectedFoldersVal,'New folders') // 其余任务配置 } // 最多轮询10秒,每500毫秒校验一次配置 def maxRetry = 20 def retryCount = 0 def configUpdated = false while (retryCount < maxRetry && !configUpdated) { def job = Jenkins.instance.getItemByFullName(targetJobName) def currentDefaultVal = job.getProperty(ParametersDefinitionProperty.class)?.getParameterDefinition('Folders')?.defaultValue if (currentDefaultVal == expectedFoldersVal) { configUpdated = true break } sleep(500) retryCount++ } if (configUpdated) { queue(targetJobName) } else { throw new Exception("任务配置更新超时,请检查权限或Job DSL运行状态") }
注意:该方案需要Jenkins脚本安全模块批准对应的方法调用权限。
方案3:配置块内后置触发启动
你也可以直接在pipelineJob的configure块末尾追加启动逻辑,配置写入完成后会自动执行启动操作:
import jenkins.model.Jenkins pipelineJob("secondJob") { stringParam('Folders', folders,'New folders') // 其余任务配置 configure { project -> // 配置落地后直接加入执行队列 Jenkins.instance.queue.schedule(project, 0) } }
使用建议
优先选择方案1,无需额外权限配置也没有轮询开销,适配绝大多数业务场景。如果任务属于某个文件夹或者多分支流水线下的子任务,注意传入任务的完整路径即可。
内容的提问来源于stack exchange,提问作者worldpotato
相关产品推荐
相关产品推荐

