Ваша проблема заключается в том, как вы (неправильно) используете концепцию замыкания 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
(я также использовал немного более идиоматический Groovy, такой как интерполяция строк).
Более элегантное, менее многословное, Groovy-подобное решение, которое выполняет итерацию по ряду проектов:
(0..<projectsList.size()).each { i ->
branches["Build ${projectsList[i]}"] = { buildProject(i) }
}