Jenkins管道是否可以采用可变级?

bq8i3lrv  于 2023-01-25  发布在  Jenkins
关注(0)|答案(1)|浏览(144)

根据我使用Jenkins声明性语法管道的经验,我知道您可以有条件地跳过when子句的一个阶段。

run_one = true
run_two = false
run_three = true

pipeline {
    agent any

    stages {
        stage('one') {
            when {
                expression { run_one }
            }
            steps {
                echo 'one'
            }
        }
        stage('two') {
            when {
                expression { run_two }
            }
            steps {
                echo 'two'
            }
        }
        stage('three') {
            when {
                expression { run_three }
            }
            steps {
                echo 'three'
            }
        }
    }
}

...在上面的代码块中,有三个阶段,onetwothree,每个阶段的执行都取决于布尔变量。
即,该范例是存在已知阶段的固定超集,其中各个阶段可以有条件地跳过。

Jenkins管道脚本是否支持不存在已知阶段的固定超集且可“查找”阶段以进行条件执行的模型?

用伪代码来描述它,可能是以下几种情况:

my_list = list populated _somehow_, maybe reading a file, maybe Jenkins build params, etc.

pipeline {
    agent any

    stages {
        if (stage(my_list[0]) exists) {
            run(stage(my_list[0]))
        }
        if (stage(my_list[1]) exists) {
            run(stage(my_list[1]))
        }
        if (stage(my_list[2]) exists) {
            run(stage(my_list[2]))
        }
    }
}


我想用另一种方式来思考我的问题:有没有一种方法可以从一些动态的阶段集合中动态地构建一个管道?

u5i3ibmn

u5i3ibmn1#

对于动态阶段,您可以编写完全脚本化的管道,也可以使用带有脚本部分的声明性管道(例如,通过使用script {…}步骤或调用您自己的函数)。有关概述,请参阅声明性与脚本化管道语法和管道语法概述。
声明式管道在Blue Ocean中得到了更好的支持,所以我个人会将其作为起点。缺点可能是需要有一个固定的根阶段,但我通常将其命名为“start”或“init”,这样看起来就不会太尴尬。
在脚本部分中,可以将stage作为 function 调用,因此可以完全动态地使用它。

pipeline {
    agent any

    stages {
        stage('start') {
            steps {
                createDynamicStages()
            }
        }
    }
}

void createDynamicStages() {
    // Stage list could be read from a file or whatever
    def stageList = ['foo', 'bar']
    
    for( stageName in stageList ) {
        stage( stageName ) {
            echo "Hello from stage $stageName"
        }
    }
}

这显示在蓝海这样:

相关问题