Jenkins API-获取构建的当前管道阶段

时间:2019-10-23 16:29:51

标签: jenkins jenkins-pipeline devops jenkins-groovy jenkins-job-dsl

我正在尝试使构建管道更有用,并且如果尚未完成以前的构建,我需要一种方法来终止它们。

我有下一个工作定义:

pipeline {
  stages {
     stage('A'){...}
     stage('B'){...}
     stage('C'){...}
  }
}

如果所有先前的构建不在“ C”阶段,我需要终止所有构建。

我使用Jenkins API获取特定工作的先前版本:

@NonCPS
def cancelPreviousBuilds() {
    def buildNumber = env.BUILD_NUMBER.toInteger()
    def currentJob = Jenkins.getInstance().getItemByFullName(env.JOB_NAME)
    currentJob.builds
        .find{ build -> build.isBuilding() && build.number.toInteger() < buildNumber && currentStageName(build) != 'C' }
        .each{ build -> build.doStop() }
}

因此,我当前的选择器是currentStageName函数的实现。 我无法获得舞台的名称。 我已经找到了一些代码,但是对我来说不合适:

@NonCPS
def currentStageName(currentBuild) {
    FlowGraphWalker walker = new FlowGraphWalker(currentBuild.getExecution())
    for (FlowNode flowNode: walker) {
       if(flowNode.isActive()) {
          return flowNode.getDisplayName();
       }
    }
}

FlowNode对象不包含阶段名称,它在内部包含更狭窄的流程步骤。

所以问题是: 如何获得特定詹金斯工作的先前构建的当前阶段?

1 个答案:

答案 0 :(得分:0)

给定一个 FlowNode,您可以通过检查是否 node instanceof StepEndNode 来检查它是否是阶段的开始。如果是,您可以使用其 LabelAction 类来获取阶段的名称:

    static String getLabel(FlowNode node) {
        LabelAction labelAction = node.getAction(LabelAction.class);
        if (labelAction != null) {
            return labelAction.getDisplayName();
        }
        return null;
    }

我认为它对您的情况没有用,但您也可以通过查找相应的起始节点从标记阶段结束的节点(StepEndNode)获取它:

FlowNode startNode = ((StepEndNode) node).getStartNode();