如何通过平行的阶段块知道阶段的持续时间

时间:2019-07-02 15:42:59

标签: jenkins shared-libraries jenkins-groovy

我已经用时髦的方法开发了詹金斯shared library,它可以收集有关詹金斯工作的构建和阶段的信息。我是通过currentBuild变量完成的。

我可以正确地获得阶段持续时间,但是问题是,当管道执行内部具有 parallel 子阶段的阶段时,我想将阶段持续时间视为最大 >其子阶段的持续时间。我的操作方式使我可以看到每个阶段的持续时间,但是却不知道一个阶段是否在并行块中。

假设我们有这个管道

@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的持续时间,这是最大的时间。

是否可以将这三个阶段绑定到其父阶段,或者知道某个阶段是否来自并行块?因此我可以计算最大值,并根据需要处理主阶段的持续时间。

这是在共享库中收集信息的代码,被詹金斯的工作称为

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()
}

0 个答案:

没有答案