如何以编程方式检查Jenkins多分支流水线扫描是否完成?
解决多分支流水线扫描无法使用wait参数的问题
直接触发多分支流水线项目(如some-multi-branch-pipeline)时,wait: true参数不生效并报错ERROR: Waiting for non-job items is not supported,这是因为多分支流水线本身是项目容器,触发它实际是执行分支扫描动作,而非具体的可等待Job任务。以下是两种编程式检查扫描完成的方法:
方法一:循环检查扫描状态
通过Jenkins内部API获取多分支项目的扫描状态,循环等待直到扫描结束:
// 获取目标多分支流水线项目 def multibranchJob = Jenkins.instance.getItemByFullName("some-multi-branch-pipeline") // 触发分支扫描 multibranchJob.scheduleBuild2(0) // 循环检查扫描是否在运行 def isScanning = true while (isScanning) { sleep(10) // 每10秒检查一次,可根据需求调整间隔 isScanning = multibranchJob.getIndexing().isRunning() }
方法二:利用Future对象阻塞等待
scheduleBuild2方法会返回一个Future对象,调用其get()方法可直接阻塞当前流水线,直到扫描任务完成:
def multibranchJob = Jenkins.instance.getItemByFullName("some-multi-branch-pipeline") // 添加触发原因(可选) def triggerCause = new hudson.model.Cause.UserIdCause() // 触发扫描并获取Future对象 def scanFuture = multibranchJob.scheduleBuild2(0, triggerCause) // 阻塞等待扫描完成 scanFuture.get()
注意事项
- 确保流水线脚本拥有足够权限:在Jenkins全局安全配置中,需允许脚本访问Jenkins实例(若开启了脚本安全沙箱,可能需要将相关API加入审批签名)
- 两种方法均能精准响应扫描完成事件,避免固定sleep的时间浪费或等待不足的问题
内容的提问来源于stack exchange,提问作者Chris F
相关产品推荐
相关产品推荐

