如何在Jenkins声明式流水线中触发并禁用其他构建,等待完成后再启用?
Jenkins声明式流水线实现触发任务并临时禁用的方案
以下是直接可行的实现方案,核心利用Jenkins Pipeline内置方法与Jenkins实例API完成流程,确保目标任务在当前流水线执行期间不会被其他调度触发:
pipeline { agent any stages { stage('触发并禁用目标任务') { steps { script { // 异步触发目标任务,不立即等待完成 def targetBuild = build(job: '你的目标任务名', wait: false) // 立即禁用目标任务,阻止后续调度 def targetJob = Jenkins.instance.getItemByFullName('你的目标任务名') targetJob.disable() echo "已禁用目标任务:${targetJob.name}" // 等待目标构建启动并执行完成 targetBuild.waitForStart() targetBuild.waitForCompletion() echo "目标任务构建#${targetBuild.number}已执行完成" } } } } post { always { script { // 无论流水线执行结果如何,最终都重新启用目标任务 def targetJob = Jenkins.instance.getItemByFullName('你的目标任务名') targetJob.enable() echo "已重新启用目标任务:${targetJob.name}" } } } }
关键细节说明:
- 异步触发+手动等待:用
wait: false异步触发任务,避免流水线阻塞在触发步骤,同时拿到构建对象targetBuild,后续通过waitForStart()和waitForCompletion()精准控制等待逻辑 - 任务禁用/启用:通过
Jenkins.instance.getItemByFullName()获取任务实例,调用disable()/enable()完成状态切换,需确保执行流水线的账号拥有目标任务的Configure权限 - 容错处理:将启用任务放在
post的always块中,避免因流水线异常失败导致目标任务一直处于禁用状态 - 路径适配:如果目标任务在Jenkins文件夹中,需填写完整路径,例如
FolderName/你的目标任务名
额外适配方案:
若你的Jenkins环境禁用了直接调用Jenkins实例API的权限,可以改用disableJob和enableJob步骤(需安装Pipeline Utility Steps插件),替换代码中的禁用/启用逻辑为:
disableJob(job: '你的目标任务名') // ... enableJob(job: '你的目标任务名')
内容的提问来源于stack exchange,提问作者Roshan007
相关产品推荐
相关产品推荐

