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) 在本例中分配给所有方法。
你知道我该如何解决这个问题吗?
您的问题在于如何(错误)使用 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)
| 归档时间: |
|
| 查看次数: |
12819 次 |
| 最近记录: |