使用 for 循环并行詹金斯作业

Has*_*far 3 groovy jenkins 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
             }
     }

}           
Run Code Online (Sandbox Code Playgroud)

Build items 方法从全局列表中获取项目名称并使用 maven 构建它。

问题是,索引 15 的项目(不应该构建)正在并行构建 15 次。就好像它一直在等待,直到 for 循环结束,然后将相同的可用 i 值 (15) 在本例中分配给所有方法。

你知道我该如何解决这个问题吗?

Oct*_*dor 9

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

这里很好地描述了到底发生了什么。这确实是其他提供函数式编程功能的语言(例如 JavaScript)的常见“陷阱”。

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

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

(我还使用了更惯用的 Groovy,如字符串插值)。

一个更优雅、更简洁、类似 Groovy 的解决方案可以迭代项目范围,如下所示:

(0..<projectsList.size()).each { i ->
    branches["Build ${projectsList[i]}"] = { buildProject(i) }
}
Run Code Online (Sandbox Code Playgroud)