You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:20:14