Параллельное выполнение заданий Jenkins Pipelines после закрытия

У меня есть сервер Jenkins, использующий плагин Pipeline. Здесь я хочу запустить несколько сборок параллельно и дождаться завершения сборки, прежде чем перейти к следующему этапу моего конвейера.

Я смогу сделать это успешно, если явно напишу задания сборки, например:

parallel 'one': {
    build job: 'job1', 
        parameters: [
            [$class: 'StringParameterValue', name: 'CONFIG', value: "foo"]
        ],
        propagate: false,
        wait: true
},  'two': {
    build job: 'job2', 
        parameters: [
            [$class: 'StringParameterValue', name: 'CONFIG', value: "foo"]
        ],
        propagate: false,
        wait: true
},  'three': {
    build job: 'job3', 
        parameters: [
            [$class: 'StringParameterValue', name: 'CONFIG', value: "foo"]
        ],
        propagate: false,
        wait: true
}

Однако на самом деле количество заданий, которые необходимо создать, будет переменным, поэтому явно выписать их невозможно. Я попытался обернуть сборки в закрытие следующим образом:

def createParallel = { String parallelName ->
    parallelName: {
        build job: 'jobX', 
            parameters: [
                [$class: 'StringParameterValue', name: 'CONFIG', value: "foo"]
            ],
            propagate: false,
            wait: true
    }
}

parallel (
    createParallel('one'), 
    createParallel('two'), 
    createParallel('three')
)

Проблема с этим методом заключается в том, что сборки на самом деле не запускаются параллельно - они строятся по одной, ожидая завершения предыдущей сборки. Что я делаю неправильно?


person Software2    schedule 16.08.2016    source источник


Ответы (3)


Вы не указываете никаких параметров сборки, поэтому Jenkins намеренно объединяет элементы очереди.

person Jesse Glick    schedule 16.08.2016
comment
Ах, мои извинения. Я удалил их из этого примера, чтобы сделать его более читабельным. У реальной версии есть параметры. Тем не менее, я действительно не понимаю, почему две версии дают разные результаты. Разве они не должны объединяться без параметров? - person Software2; 16.08.2016

Установите wait: false и build никогда не ждите следующей сборки, но если вам нужно запустить следующий этап, вы должны получить результат

person Anbin Anil    schedule 19.11.2020

Короткий ответ заключается в том, что в настоящее время это невозможно сделать в Jenkins из-за ошибок JENKINS-33051 и JENKINS-25979.

То, что я делал с вышеупомянутым, по сути, создавало три параллели, каждая с одним параметром. Что нужно сделать, так это поместить замыкания в список, а затем распространить список как параметры, например:

def list = [ createParallel('one'), createParallel('two'),  createParallel('three') ]
parallel (*list)

К сожалению, сейчас в Jenkins это не реализовано.

person Software2    schedule 16.08.2016
comment
parallel берет карту, а не список. вы можете сделать это, построив карту вручную или через inject, а затем передав ее в parallel - person Brandon; 19.08.2020