动态并行流水线

Dynamic parallel pipeline

我有一个 Jenkins DSL 管道,我在其中创建一些动态 steps,我想知道如何 运行 parallel 中的所有步骤。

由于我使用 script 将字符串拆分为一个迭代数组,parallel 似乎在抱怨,因为它必须在 stage 标记之间

这是一个代码示例

    stages {
        stage('BuildAll') {
                script {
                    parallel {
                        "${names}".split(",").each { name->
                            stage(name) {
                                sh "env | grep -i NODE_NAME"
                            }
                        }
                    }
            }
        }
    }

因为您是 运行 script 指令中的 parallel 函数,所以您必须使用并行函数的脚本语法:

Takes a map from branch names to closures and an optional argument failFast which > will terminate all branches upon a failure in any other branch:

   parallel firstBranch: {
       // do something
   }, secondBranch: {
       // do something else
   },
   failFast: true|false

因此您可以使用 collectEntries 方法迭代您的列表并生成将传递给并行函数的 Map。类似于:

stages {
    stage('BuildAll') {
        steps {
            script {
                parallel names.split(',').collectEntries { name ->
                    ["Execution ${name}": {   // Map key is the branch name
                        // Following code will be executed in parallel for each branch
                        stage(name) {
                            sh "env | grep -i NODE_NAME"
                        }
                    }]
                }
            }
        }
    }
}

另一种选择是定义地图,然后调用并行:

stages {
    stage('BuildAll') {
        steps {
            script {
                def executions = names.split(',').collectEntries { name ->
                    ["Execution ${name}": {
                        stage(name) {
                            sh "env | grep -i NODE_NAME"
                        }
                    }]
                }
                parallel executions
            }
        }       
    }
}