Jenkins 管道将阶段作为变量?

Jenkins Pipeline Make a Stage as a Variable?

stages {
    stage('Setup') {
    }
    stage('Parallel Stage') {
        parallel {
            stage('Executor 1') {
            }
            stage('Executor 2') {
            } 
            stage('Executor 3') {
            } 
            stage('Executor 4') {
            }                                          
        }
    }
}

以上是我的 Jenkins 管道的骨架,它有一个设置阶段,然后是一个并行阶段,该阶段将相同的事情执行四次以缩短执行时间。

有没有办法将阶段定义为变量以减少 4 倍的代码重复并减少我必须进行的编辑次数?

是的,最好的方法是定义一个生成阶段并可以并行调用的函数。

假设您正在将这些阶段并行执行到 1 个代理中。

在下面的示例管道中,generateStage 是一个用函数替换嵌套阶段的函数。

def jobs = ["Executor1", "Executor2", "Executor3"]
 
def parallelStagesMap = jobs.collectEntries {
    ["${it}" : generateStage(it)]
}
 
def generateStage(job) {
    return {
        stage("${job}") {
                echo "Running stage ${job}."
        }
    }
}
 
pipeline {
    agent any
 
    stages {
        stage('setup') {
            steps {
                echo 'This stage will be executed first.'
            }
        }
 
        stage('parallel stage') {
            steps {
                script {
                    parallel parallelStagesMap
                }
            }
        }
    }
}

管道的输出如下:

详情请看我的回答

唯一的缺点是您不能在 stages 之后直接执行此管道安排,这就是为什么在脚本中调用 parallelStageMap 的原因。