使用for循环的并行jenkins作业

时间:2018-06-27 08:14:52

标签: jenkins groovy jenkins-pipeline

我正在尝试使用for循环并行运行构建列表,因为代码越来越大。

我有一个包含项目名称的全局列表

@Field def final String[] projectsList = ['project1','project2', 'project3'....]
stages {
    stage('Parallel Build') {
        steps{
            script{
                   def branches = [:]
                   for(int i = 0;i<15;i++) {
                        branches["Build "+projectsList[i]] = {buildProject(i)}
                   }
                   parallel branches
             }
     }

}           

Build projects方法从全局列表中获取项目的名称,并使用maven进行构建。

问题是,索引15(不应构建)的项目正在并行构建15次。好像在等待for循环结束,然后在这种情况下为所有方法分配相同的可用i值(15)。

您知道我该如何解决吗?

1 个答案:

答案 0 :(得分:1)

您的问题在于如何(错误地)使用Groovy闭包概念,即您在循环主体中定义闭包的部分,该闭包使用迭代变量i,即{{1 }}:)

here很好地描述了到底发生了什么。实际上,这是与其他提供功能性编程功能的语言(例如JavaScript)的共同“陷阱”。

最简单(虽然几乎不是最优雅的)解决方案是在循环中定义一个变量 ,该变量接收当前的{ buildProject(i) }值并在闭包中使用该值:

i

(我还使用了一些惯用的Groovy,例如String插值法。)

迭代一系列项目的更优雅,更简洁,类似于Groovy的解决方案是:

def branches = [:]
for(i = 0; i < 15; i++) {
    def curr = i
    branches["Build ${projectsList[i]}"] = { buildProject(curr) }
}
parallel branches