我正在尝试使用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)。
您知道我该如何解决吗?
答案 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