Как узнать длительность этапа с параллельным блоком этапов - PullRequest
0 голосов
/ 02 июля 2019

Я разработал общую библиотеку jenkins в groovy, которая собирает информацию о сборках и этапах работы jenkins. Я сделал это с помощью переменной currentBuild .

Я могу правильно определить длительность этапов, но проблема в том, что когда конвейер выполняет этап с параллельными подэтапами внутри, я хочу думать, что продолжительность этапа равна максимальной длительности. его подэтапов. То, как я это делаю, позволяет мне видеть продолжительность каждой стадии, но не зная, находится ли стадия в параллельном блоке или нет.

Предположим, у нас есть этот конвейер

@Library('shared-library') _
pipeline {
    agent any
    stages {
        stage("Parallel block") {
            parallel {
                stage("Stage 1") {
                    steps {
                        sleep(time:2, unit:"SECONDS")
                        echo "1"
                    }
                }
                stage("Stage 2") {
                    steps {
                        sleep(time:3, unit:"SECONDS")
                        echo "2"
                    }
                }
                stage("Stage 3") {
                    steps {
                        sleep(time:1, unit:"SECONDS")
                        echo "3"
                    }
                }
            }
        }
        stage ("Publish") {
            steps {
                script {
                    callSharedLibrary()
                }
            }
        }
    }
}

Этот ввод дает мне следующий вывод

id: 6 , name: Parallel block, status: SUCCESS, duration: 87
id: 14 , name: Stage 1, status: SUCCESS, duration: 2118
id: 16 , name: Stage 2, status: SUCCESS, duration: 3103
id: 18 , name: Stage 3, status: SUCCESS, duration: 1099

Но я хочу, чтобы Parallel block длительность была Stage 2 длительность, которая является максимальной.

Можно ли каким-либо образом связать эти три этапа с его родителем или узнать, происходит ли этап из параллельного блока?

Вот код, который собирает информацию внутри разделяемой библиотеки, которая вызывается заданием jenkins

def stages = RunExt.create(currentBuild.getRawBuild()).createWrapper().getStages()
for (StageNodeExt stage in stages) {
        def id = stage.getId()
        def name = stage.getName()
        def status = stage.getStatus().toString()
        def duration = stage.getDurationMillis().toString()
}
...