如何使用动态数据在 Jenkins 管道中构建并行和顺序阶段的组合

Mai*_*nak 6 jenkins devops jenkins-pipeline jenkins-declarative-pipeline

我正在尝试构建一个结合了并行和顺序阶段的 Jenkins 管道。我能够使用静态数据完成相同的任务,但在使用动态数据时(即使用参数化构建并从构建参数读取数据时)无法使其工作。

下面的代码片段工作正常

pipeline {
agent any
stages {
    stage('Parallel Tests') {
        parallel {
            stage('Ordered Tests Set') {
                stages {
                    stage('Building seq test 1') {
                        steps {
                             echo "build seq test 1"
                            }
                    }
                    stage('Building seq test 2') {
                        steps {
                               echo "build seq test 2"
                        }
                    }
                    
                }
            }

            stage('Building Parallel test 1') {
                steps {
                    echo "Building Parallel test 1"
                }
            }
            stage('Building Parallel test 2') {
                steps {
                   echo "Building Parallel test 2"
                }
            }   
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

}

给我以下执行结果 在此输入图像描述

现在我想从构建参数中读取值并循环阶段。这是我尝试过但无法使其发挥作用的方法。这段代码摘自几个月前我在 SO 中发现的另一个答案,但现在无法追踪,否则会添加链接 -

def parallelStagesMap = params['Parallel Job Set'].split(',').collectEntries {
    ["${it}" : generateStage(it)]
}

def orderedStagesMap = params['Ordered Job Set'].split(',').collectEntries {
    ["${it}" : generateStage(it)]
}

def orderedMap (){
    def orderedStagesMapList= [:]
    orderedStagesMapList['Ordered Tests Set']= {
        stage('Ordered Tests Set') {
            stages{
                orderedStagesMap
            }        
        }
    }
    return orderedStagesMapList;
}

def generateStage(job) {
    return {
        stage("stage: ${job}") {
            echo "This is ${job}."
        }
    }
}

pipeline {
    agent none
    stages {
        stage ("Parallel Stage to trigger Tests"){
            steps {
                script {
                    parallel orderedMap()+parallelStagesMap
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

due*_*mir 4

声明式和脚本化管道语法不会在管道中混合,请参阅管道语法。由于您是根据参数动态创建管道定义,因此您很可能应该完全使用脚本语法,除非您的用例匹配matrix

从管道定义中删除声明性语法将给出如下所示的内容。请注意,我没有在实时 Jenkins 实例上测试它。

def parallelStagesMap = params['Parallel Job Set'].split(',').collectEntries {
    ["${it}" : generateStage(it)]
}

def orderedStagesMap = params['Ordered Job Set'].split(',').collectEntries {
    ["${it}" : generateStage(it)]
}

def orderedMap (){
    def orderedStagesMapList= [:]
    orderedStagesMapList['Ordered Tests Set']= {
        stage('Ordered Tests Set') {
            orderedStagesMap.each { key, value ->
                value.call()
            }
        }
    }
    return orderedStagesMapList;
}

def generateStage(job) {
    return {
        stage("stage: ${job}") {
            echo "This is ${job}."
        }
    }
}

stage("Parallel Stage to trigger Tests") {
    parallel orderedMap()+parallelStagesMap
}
Run Code Online (Sandbox Code Playgroud)