是否可以在循环中创建并行的Jenkins声明管道阶段?

Fra*_*ell 21 jenkins jenkins-pipeline

我在项目中的不同子项目上有一个长期运行的Gradle任务列表.我想使用Jenkins声明性管道并行运行它们.

我希望这样的东西可能会起作用:

projects = [":a", ":b", ":c"]

pipeline {
    stage("Deploy"){
        parallel {
             for(project in projects){
               stage(project ) {
                   when {
                       expression {
                            someConditionalFunction(project)
                       }
                   }
                   steps {
                       sh "./gradlew ${project}:someLongrunningGradleTask"
                  }
                }   
             }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不用说,由于它是期待阶段而不是for,因此会产生编译错误.关于如何克服这个问题的任何想法?谢谢

小智 34

我试图使用声明性管道语法来减少现有Jenkinsfile中的重复代码.最后,我能够围绕脚本语法和声明语法之间的区别.

通过使用script {}块包装脚本管道语法,可以在声明性管道中使用脚本管道语法.

看看下面的例子:从睡眠命令中唤醒后,您将看到所有三个并行阶段同时完成.

def jobs = ["JobA", "JobB", "JobC"]

def parallelStagesMap = jobs.collectEntries {
    ["${it}" : generateStage(it)]
}

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

pipeline {
    agent any

    stages {
        stage('non-parallel stage') {
            steps {
                echo 'This stage will be executed first.'
            }
        }

        stage('parallel stage') {
            steps {
                script {
                    parallel parallelStagesMap
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,这使用脚本化的管道阶段;当您将代理、何时、工具或类似的声明性结构添加到 generateStage 中时,它会失败:( (4认同)

Rob*_*les 5

并行需要一个map结构。您正在做一些由内而外的操作。构建地图,然后将其传递给并行,而不是尝试在并行内部进行迭代。

此页面上的选项2 显示了一种与您尝试的操作类似的方法。

此链接中,您可以找到一种类似于矩阵/多配置作业的复杂方式: