#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)]
}