Параллельная работа Дженкинса с использованием цикла for - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь запустить список сборок параллельно, используя цикл 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 голосов
/ 27 июня 2018

Ваша проблема заключается в том, как вы (неправильно) используете концепцию замыкания 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) }
}
...