Контрольно-пропускной пункт в декларативном трубопроводе Jenkins
Я смотрю на документацию Cloudbees, которая гласит:
Правильный подход заключается в том, чтобы всегда держать шаг контрольной точки вне любого блока узла, не связанного ни с агентом, ни с рабочей областью.
Пример примера приведен для скриптового конвейера. Я пытался реализовать это в декларативном конвейере, но получаю ошибку. Единственный способ заставить это работать:
stage ('Promotion Checkpoint') {
steps {
checkpoint 'Ready for Manual intervention'
timeout(time: 60, unit: 'SECONDS') {
input message: 'Do you want to proceed?'
}
}
}
Насколько я понимаю, этап в Декларативном конвейере похож на узел в Скриптовом конвейере. Я не могу заставить контрольно-пропускной пункт работать за пределами стадии или шага, что, по-видимому, является моей интерпретацией предложения от Cloudbees. Может ли кто-нибудь помочь с правильным использованием вне контрольной точки?
1 ответ
Вы сталкиваетесь с проблемой декларативных конвейеров, которые делают вещи, которые должны работать вне агента и рабочей области, немного запутанными.
"Нормальный" декларативный конвейер имеет агента, определенного вверху
pipeline {
agent any
stages {
stage("Build") {
echo 'Build'
}
}
}
Но теперь все метки этапа будут использовать один и тот же агент и рабочее пространство. Это облегчает написание "стандартных" конвейеров, но делает невозможным использование команды без какого-либо агента. Итак, используя checkpoint
или написание конвейера, не блокирующего исполнителя при использовании input
становится невозможным.
Таким образом, предложенный правильный путь для декларативного конвейера заключается в использовании agent none
на верхнем уровне конвейера и укажите agent any
или же agent none
в каждом stage
,
В документации CloudBees есть два примера. Вы также можете найти такие обходные пути для input
в документации Jenkins.
Таким образом, одно решение с использованием переключателя агента будет выглядеть так:
pipeline {
agent none
stages {
stage("Build") {
agent any
steps {
echo "Building"
}
}
stage("Checkpoint") {
agent none //running outside of any node or workspace
steps {
checkpoint 'Completed Build'
}
}
stage("Deploy") {
agent any
steps {
sh 'Deploying'
}
}
}
}
Существует также один с использованием node
блок в декларативном конвейере.
pipeline {
agent none
stages{
stage("Build"){
// no agent defined will be solved with node
steps{
node('') { // this is equivalent to 'agent any'
echo "Building"
}
checkpoint "Build Done"
}
}
stage("Deploy") {
agent any
steps {
echo 'Deploy'
}
}
}
}