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

如何使用动态数据在Jenkins管道中构建并行和顺序阶段的组合,jenkins,jenkins-pipeline,devops,jenkins-declarative-pipeline,Jenkins,Jenkins Pipeline,Devops,Jenkins Declarative Pipeline,我正在尝试建立一个Jenkins管道,它具有并行和顺序阶段的组合。我可以用静态数据实现同样的功能,但在使用动态数据时,即使用参数化构建并从构建参数读取数据时,无法使其正常工作 下面的代码片段可以正常工作 pipeline { agent any stages { stage('Parallel Tests') { parallel { stage('Ordered Tests Set') { stages {

我正在尝试建立一个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"
                }
            }   
        }

    }
}
}

给我以下的执行结果

现在我想从我的构建参数中读取值,然后循环各个阶段。这是我尝试过的,但无法实现。这段代码片段取自几个月前我在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
                }
            }
        }
    }
}

声明性和脚本化管道语法不会在管道中混合使用,请参阅。因为您是基于参数动态创建管道定义的,所以您很可能完全使用脚本语法,除非您的用例与
matrix
匹配

从管道定义中删除声明性语法将产生如下结果。请注意,我没有在live 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
}

到底什么不起作用?顺序部分不起作用。我仍然能够运行并行阶段,但是“有序作业集”,这部分不起作用。非常好。我的印象是,通过使用脚本标记,我们仍然可以在声明式中使用脚本管道的一些功能,但我想总会有一些限制。当然,我的要求是使用matrix,但我想先做一些工作,您的答案完美地回答了我的问题。在我的场景中,任何指向正确方向的指针都将同样有帮助,我们将不胜感激。现在我可以使用substring并使其工作,尽管它很难看,但它会让我重新启动并使用动态值运行。谢谢,我会接受你的回答。事实上,
script
步骤是一个转义填充,在声明性步骤中使用脚本语法。例如,当步骤返回一些需要处理的值时,它可以很好地用于更简单的用例。然而,当Declarative主要用于包装一些
script
标记时,这表明管道定义对于声明性语法来说可能过于动态。