Я использую Jenkins Pipeline с декларативным синтаксисом, в настоящее время со следующими этапами:
- Подготовка
- Сборка (два параллельных набора шагов)
- Тест (также два параллельных набора шагов)
- Спросите, где/где развернуть
- Deploy
Для шагов 1, 2, 3 и 5 мне нужно и агента (исполнителя), потому что они выполняют фактическую работу в рабочей области. Для шага 4 мне это не нужно, и я бы не хотел блокировать моих доступных исполнителей во время ожидания ввода пользователя. Это, по-видимому, упоминается как "облегченный" или "легкий" исполнитель для классического синтаксиса сценария, но я не могу найти никакой информации о том, как добиться этого с помощью декларативного синтаксиса.
До сих пор я пробовал:
- Настройка агента непосредственно в параметрах конвейера, а затем установка
agent none
на сцене. Это не влияет, и конвейер работает как normalt, блокируя исполнитель во время ожидания ввода. В документации также упоминается, что это не будет иметь никакого эффекта, но я думал, что все равно сделаю это. - Настройка
agent none
в параметрах конвейера, а затем установка агента для каждого этапа, кроме # 4. К сожалению, но, как ожидается, это выделяет новое рабочее пространство для каждого этапа, что, в свою очередь, требует, чтобы я запихнул и разблокировал. Это бесполезно и дает дополнительные проблемы на параллельных этапах (2 и 3), потому что я не могу иметь код вне конструкцииparallel
. Я предполагаю, что параллельные шаги выполняются в одном и том же рабочем пространстве, поэтому удержание/нерест в обоих случаях приведет к неудачным результатам.
Вот контур моего файла Jenkins:
pipeline {
agent {
label 'build-slave'
}
stages {
stage("Prepare build") {
steps {
// ...
}
}
stage("Build") {
steps {
parallel(
frontend: {
// ...
},
backend: {
// ...
}
)
}
}
stage("Test") {
steps {
parallel(
jslint: {
// ...
},
phpcs: {
// ...
},
)
}
post {
// ...
}
}
stage("Select deploy target") {
steps {
script {
// ... code that determines choiceParameterDefinition based on branch name ...
try {
timeout(time: 5, unit: 'MINUTES') {
deployEnvironment = input message: 'Deploy target', parameters: [choiceParameterDefinition]
}
} catch(ex) {
deployEnvironment = null
}
}
}
}
stage("Deploy") {
when {
expression {
return binding.variables.get("deployEnvironment")
}
}
steps {
// ...
}
}
}
post {
// ...
}
}
Мне что-то не хватает, или это просто невозможно в текущей версии?