Jenkins API - получить текущий этап конвейера сборки

Я пытаюсь сделать мой конвейер сборки более полезным, и мне нужен способ завершить предыдущие сборки, если они еще не завершены.

У меня есть следующее определение должности:

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 не содержит имени стадии, он содержит более узкий шаг потока внутри сборки.

Итак, вопрос: как получить текущий этап предыдущей сборки для конкретной работы Jenkins?


person ybondar    schedule 23.10.2019    source источник


Ответы (1)


Имея 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();
person GJP    schedule 22.06.2021