У меня есть небольшой пример декларативного конвейера Jenkins, который должен параллельно работать на агентах «Windows» и «Linux».Цель состоит в том, чтобы динамически построить матрицу конфигурации (например, конфигурации Release / Debug; различные параметры CMake и т. Д.) И позволить всем комбинациям работать параллельно.Однако я застрял в построении конвейера, который выполняет параллельные шаги из подготовленной переменной.
Это версия скрипта, в которой параллельные этапы явно указаны в блоке parallel{}
:
pipeline {
agent any
stages {
stage ("Parallel Build") {
parallel {
stage ("Windows") {
steps {
echo "TEST Windows"
}
}
stage ("Linux") {
steps {
echo "TEST Linux"
}
}
}
}
}
}
Мой план состоит в том, чтобы динамически создавать этапы в блоке parallel{}
(в зависимости от требуемых конфигураций), но я не уверен насчет синтаксиса или возможного вообще.
Примерно так:
def stage_list = {
stage ("Windows") { <=== How to correctly create the stage_list?
steps {
echo "TEST Windows"
}
}
stage ("Linux") {
steps {
echo "TEST Linux"
}
}
}
pipeline {
agent any
stages {
stage ("Parallel Build") {
parallel stage_list <== How to replace a block with variable?
}
}
}
Выше приведено сообщение об ошибкев Дженкинс:
WorkflowScript: 17: Expected a block for parallel @ line 17, column 9.
stage ("Parallel Build") {
^
WorkflowScript: 17: Expected one of "steps", "stages", or "parallel" for stage "Parallel Build" @ line 17, column 9.
stage ("Parallel Build") {
^
Кто-нибудь есть идеи, как это можно сделать?
Редактировать : После первых двух ответов я хотел бы обновитьмой вопрос немного.
Я проверил предложенный способ создания переменной stage_list
.Однако, если я добавлю этот вызов parallel stage_list
в мою исходную структуру, я получу ту же ошибку, что и раньше.Он работает хорошо при использовании с script
, как это
pipeline {
agent any
stages {
stage ("Parallel Build") {
steps {
script {
parallel stepsForParallel
}
}
}
}
}
Может кто-нибудь объяснить мне разницу?Почему он работает с steps
и script
, но не без них?
Редактировать 2: По соображениям документации я хотел закончить свой вопрос тем, что сделал срешить проблему:
Ответ SmartToms и официальная документация Дженкинса по Синтаксис конвейера с Docker ясно дал понять, что декларативный конвейер и скриптовый конвейер - это два отдельных подхода, которые необходимо обрабатывать по-разному (обратите внимание нассылка «Переключить конвейер сценариев» под каждым примером).
Одним из способов решения моего вопроса является использование скриптового конвейера - если кому-то интересен пример для этого, вот ссылка на гистологию с конвейерным скриптом , которая показывает принцип.