如何使用动态数据在Jenkins管道中构建并行和顺序阶段的组合
我正在尝试建立一个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 {
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
标记时,这表明管道定义对于声明性语法来说可能过于动态。