Как я могу запустить каждую итерацию параллельного цикла for в конвейере Jenkins? - PullRequest
2 голосов
/ 07 мая 2019

У меня есть конвейерное задание, которое выполняет некоторую последовательность действий (например, Build >> Run >> Report). Я поместил эту последовательность в цикл for, поскольку я могу получить параметр, сколько раз мне следует повторять одну и ту же последовательность. Пожалуйста, найдите пример кода, который я написал.

for (int i = 0; i < <param_val>; ++i){
    node{
        stage('Build') {
            build 'Build'
        }
        stage('Run') {
           build 'Run'
        }
        stage('Reporting') {
           build 'Reporting'
        }
    }
}

Теперь мой код ожидает выполнения одной полной последовательности, а затем продолжает выполнение следующей последовательности. Это отнимает много времени. У меня есть больше подчиненных агентов, и я могу выполнять последовательность параллельно. Как запустить каждую итерацию параллельного цикла for?

Я подумал о решении: иметь конвейер, имеющий фактическую последовательность

node{
        stage('Build') {
            build 'Build'
        }
        stage('Run') {
           build 'Run'
        }
        stage('Reporting') {
           build 'Reporting'
        }
    }

есть еще один конвейер с циклом for, который запустит первый конвейер с ожиданием: false:

for (int i = 0; i < <param_val>; ++i){
    build(job: 'pipeline-1', wait: false)
}

Это работает? Или у нас есть лучший вариант сделать то же самое с одним конвейером?

Ответы [ 2 ]

5 голосов
/ 07 мая 2019

Поместите код внутри цикла в замыкание:

def oneNode = { c ->
    node {
        build job: 'Build', parameters: [string(name: 'Component', value: c)]
        build 'Run'
        build 'Reporting'
    }
}

Затем создайте карту всех замыканий, которые вы хотите запустить одновременно:

def jobs = [:]
def components = params.Componets.split(",")
for (int i = 0; i < components.size(); ++i) {
    def component = components[i].trim()
    jobs[component] = {
        oneNode(component)
    }
}

И, наконец, используйте parallel шаг с полученной картой:

stage('Build, run, report') {
    <the code from the above steps>
    parallel jobs
}
0 голосов
/ 13 мая 2019

Это сработало для меня.

def jobs = [:]
def components = params.Componets.split(",")
stage('Build, run, report') {
    for (int i = 0; i < components.size(); ++i) {
        def index = i
        def component = components[index].trim()
        jobs[i] = {
            node {
                build job: 'Build', parameters: [string(name: 'Component', value: component)]
                build 'Run'
                build 'Reporting'
            }
        }
    }
    parallel jobs
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...