如何在Jenkins中列出任务的已跳过阶段?现有脚本失效
问题根源
你用execution.getCurrentHeads()的思路错了——这个方法在构建完成后,只会返回流水线的最终结束节点(就是你输出里的FlowEndNode),根本不会包含各个阶段的节点,自然列不出阶段信息。
修正方案
要获取所有阶段(包括被跳过的),得递归遍历整个流水线的节点树,而不是只取"当前头部"节点。同时还要判断阶段的执行状态,精准筛选出被跳过的实例。
下面是修正后的可运行脚本:
def jobName = "cleanup-monthly" def buildNumber = 84 def job = Jenkins.instance.getItemByFullName(jobName) if (job != null) { def build = job.getBuildByNumber(buildNumber) if (build != null && build instanceof WorkflowRun) { def run = build as WorkflowRun def execution = run.getExecution() println "Job Name: ${jobName}" println "Build Number: ${buildNumber}" println "Status: ${build.result}" println "\nSkipped Stages:" // 递归遍历所有节点的工具函数 def traverseNodes = { node, indent -> // 检查当前节点是否为阶段节点 def stageAction = node.getAction(org.jenkinsci.plugins.workflow.actions.StageAction) if (stageAction != null) { def stageName = stageAction.getDisplayName() // 获取阶段的执行结果 def stageResult = node.getAction(org.jenkinsci.plugins.workflow.actions.FlowNodeAction)?.getResult() // 判断是否为跳过状态 if (stageResult == org.jenkinsci.plugins.workflow.support.steps.StageStepExecution.StageResult.SKIPPED) { println "${indent}- ${stageName}" } } // 递归遍历子节点,处理嵌套阶段 node.getChildren().each { child -> traverseNodes(child, indent + " ") } } // 从流水线的起始节点开始遍历 execution.getDefinition().getStartNodes().each { startNode -> traverseNodes(startNode, "") } } else { println "Build not found for job: ${jobName} and build number: ${buildNumber}" } } else { println "Job not found: ${jobName}" }
关键改动说明
- 替换
getCurrentHeads()为递归遍历全节点树:从流水线起始节点出发,遍历所有子节点,确保不会遗漏任何阶段(包括嵌套阶段) - 增加跳过状态判断:通过
StageResult.SKIPPED精准筛选出被跳过的阶段,直接匹配你的核心需求 - 支持嵌套阶段:递归逻辑自动处理层级结构,输出用缩进区分嵌套关系,可读性更强
批量扫描扩展提示
如果要在全Jenkins环境排查所有任务的跳过阶段,只需在外层加一个遍历所有任务的循环:
Jenkins.instance.getAllItems(Job.class).each { job -> // 这里可以循环处理每个任务的最近N次构建,比如取最近10次 (1..10).each { buildNum -> // 把上面的单任务逻辑放这里,替换jobName和buildNumber为当前循环值 } }
内容的提问来源于stack exchange,提问作者Venkat Akurathi
相关产品推荐
相关产品推荐

