Как запустить параметризованное задание из конвейера?

#jenkins #groovy #jenkins-pipeline #jenkins-groovy

#дженкинс #groovy #дженкинс-конвейер #дженкинс-заводной

Вопрос:

У меня есть задание, которое имеет N (N, представляющее количество параметров выбора) параметров выбора. Я хочу передать каждый параметр выбора в конвейер. Конвейер должен создавать задание с каждым выбранным параметром (например, имя параметра — «Проект» с вариантами {A, B, C}. Конвейеру необходимо создать задание для каждого выбора, указанного в параметре проекта).

Я бесконечно исследовал Google / stackoverflow и не нашел хорошего решения для этого.

Ответ №1:

Итак, предположим, что заданием с вариантами выбора является конвейер B, а вызывающий его со всеми параметрами — A.

В задании A вы должны либо жестко запрограммировать различные параметры, либо просто указать параметр текстового поля, в котором вы можете ввести желаемые варианты. Где-то в вашем конвейере (в пределах a script -блока, если вы используете декларативный стиль) вам нужно сделать что-то вроде этого:

 //for every selected choice
params.choices.split("n").each{ choice ->
     build job: "myJob", parameters: [string(name: "nameOfChoiceParam", value: choice)]
}
 

Как вы можете видеть, параметры внутреннего выбора — это не что иное, как строковые параметры.

Редактировать:

Если вы хотите построить это параллельно, вам нужно использовать скриптовые конвейеры (я думаю, может быть, это работает и в декларативных). parallel Функция ожидает a Map<String, Closure> , и существует много способов его генерации, но один из них:

 def steps = params.choices.split("n").collectEntries{ choice ->
    [(choice): {
        build job: "myJob", parameters: [string(name: "nameOfChoiceParam", value: choice)] 
    }]
}
parallel steps
 

Если вы хотите сделать это для всех доступных узлов, вам нужно сначала сгенерировать список всех возможностей ( combiniations это помогло бы) или вы могли бы использовать старый добрый вложенный цикл for .

Когда есть 30 вариантов, вы можете не получить столько за счет распараллеливания, и есть много факторов (сколько исполнителей на узел и т.д.). В целом было бы быстрее просто поместить туда код напрямую, а не запускать отдельный конвейер, особенно если мы говорим о choices * nodes = 30 * 4 = 120 выполнении.

Комментарии:

1. Допустим, я хочу запустить конвейер B (конвейер со всеми вариантами) в конвейере A, но параллельно (например, конвейер B содержит 30 различных вариантов, и я хочу запустить конвейер A со всеми 30 вариантами одновременно из конвейера B на 4 разных узлах). Как мне это сделать?

2. Я получаю следующую ошибку… «WorkflowScript: 19: Ожидаемый шаг @ строка 19, столбец 23. def action = params.choices.collectEntries{ выбор ->

3. Вы должны обернуть его внутри блока сценария script { ... }

4. Я продолжаю получать исключение нулевого указателя «Невозможно вызвать метод split() для нулевого объекта»

5. Убедитесь, что вы используете params.<your parameter> . Может быть, просто распечатайте это. Null в этом контексте указывает на неправильное имя параметра

Ответ №2:

Необходимо выполнить довольно много манипуляций, чтобы получить варианты выбора из другого задания. Было бы проще просто жестко запрограммировать их. Если вы хотите получить к нему доступ динамически, вы могли бы сделать что-то вроде этого:

 def choices = Jenkins.instance.getItemByFullName("myJob")
                 .getProperty(hudson.model.ParametersDefinitionProperty)
                 .getParameterDefinition("parameterName").getChoices()

choices.each{choice ->
    build job: "myJob", parameters: [string(name: "parameterName", value: choice)] 
}