在工作流/管道插件中访问阶段结果

7

我可以帮忙翻译,以下是您需要翻译的内容:

我有一个包含不同阶段的流水线。我希望当前任务能够检查上一次构建中已经通过了多少个阶段,并将其记录在控制台中。

请考虑下面是我的当前流水线:

node(){
 stage "1"
 do something

 stage "2"
 do something else
}

我需要一个Groovy脚本,能够生成类似于以下内容的东西。
println currentBuild.previousBuild.getStage("1").result

我的代码的目的是跟踪构建过程中不同阶段的成功和失败。是否有其他替代方法?


你有一些Groovy代码可以获取阶段列表及其结果吗?以某种方式使用REST API似乎有点过度杀伐。 - sorin
3个回答

11

您肯定可以使用Pipeline REST API插件,对我来说它在Jenkins 2.13中可用。

通过解析生成的JSON,您可以以类似于您期望的方式获取阶段的状态。 对于api调用,我个人使用http_request插件。

从文档中GET /job/:job-name/:run-id/wfapi/describe返回:

{
    "_links": {
        "self": {
            "href": "/jenkins/job/Test%20Workflow/16/wfapi/describe"
        },
        "pendingInputActions": {
            "href": "/jenkins/job/Test%20Workflow/16/wfapi/pendingInputActions"
        }
    },
    "id": "2014-10-16_13-07-52",
    "name": "#16",
    "status": "PAUSED_PENDING_INPUT",
    "startTimeMillis": 1413461275770,
    "endTimeMillis": 1413461285999,
    "durationMillis": 10229,
    "stages": [
        {
            "_links": {
                "self": {
                    "href": "/jenkins/job/Test%20Workflow/16/execution/node/5/wfapi/describe"
                }
            },
            "id": "5",
            "name": "Build",
            "status": "SUCCESS",
            "startTimeMillis": 1413461275770,
            "durationMillis": 5228
        },
        {
            "_links": {
                "self": {
                    "href": "/jenkins/job/Test%20Workflow/16/execution/node/8/wfapi/describe"
                }
            },
            "id": "8",
            "name": "Test",
            "status": "SUCCESS",
            "startTimeMillis": 1413461280998,
            "durationMillis": 4994
        },
        {
            "_links": {
                "self": {
                    "href": "/jenkins/job/Test%20Workflow/16/execution/node/10/wfapi/describe"
                }
            },
            "id": "10",
            "name": "Deploy",
            "status": "PAUSED_PENDING_INPUT",
            "startTimeMillis": 1413461285992,
            "durationMillis": 7
        }
    ]
}

在 postbuild 中有获取此信息的方法吗? - coding_idiot
@coding_idiot,有趣的问题,你有当前的构建号码,API是否返回任何内容? - hakamairi

8
您可以迭代构建的所有阶段并进行您需要的操作:
    WorkflowRun run = Jenkins.instance.getItemByFullName("####YOUR_JOB_NAME####")._getRuns()[0]
    FlowExecution exec = run.getExecution()
    PipelineNodeGraphVisitor visitor = new PipelineNodeGraphVisitor(run)
    def flowNodes = visitor.getPipelineNodes()

    for (Iterator iterator = flowNodes.iterator(); iterator.hasNext();)
    {
        def node = iterator.next()
        if (node.getType() == FlowNodeWrapper.NodeType.STAGE)
        {
               String stageName = node.getDisplayName()
               def stageResult = node.getStatus().getResult()

               println "Result of stage ${stageName} is ${stageResult}"
        }
    }

通过剩余的exec分配(你可能想要删除它),我猜测你首先尝试通过工作流API进行操作,然后注意到了那里的逆向(?)节点遍历,切换到了蓝色海洋访问者API。这个猜测正确吗?:)基于execution属性的API似乎确实有点难以处理。自从你发表答案以来,对此有什么进展吗?(顺便说一下,+1让我知道了如何使用API获取阶段,之前找不到任何明确的文档!) - OzgurH

2

以下是一个示例代码,用于迭代所有流程节点并获取您想要的任何信息:

import org.jenkinsci.plugins.workflow.graph.FlowGraphWalker
import org.jenkinsci.plugins.workflow.graph.FlowNode

try {
    // just for demo, a success step and a failure step
    node {
        sh 'true'
        sh 'false'
    }
} finally {
    FlowGraphWalker walker = new FlowGraphWalker(currentBuild.rawBuild.getExecution())
    for (FlowNode flowNode: walker) {
        // do whatever you want with flowNode
        echo flowNode.dump()
    }
}

他询问如何获取阶段信息,而不是步骤信息。你知道如何获取阶段信息吗? - Adir D
@AdirD stage是一个FlowNode,其descriptorId为descriptorId=org.jenkinsci.plugins.workflow.support.steps.StageStep - link89

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接