Отменить текущий сбор от трубопровода в Дженкинсе
У меня есть трубопровод Дженкинса, который имеет несколько этапов, например:
node("nodename") {
stage("Checkout") {
git ....
}
stage("Check Preconditions") {
...
if(!continueBuild) {
// What do I put here? currentBuild.xxx ?
}
}
stage("Do a lot of work") {
....
}
}
Я хочу иметь возможность отменить (не обязательно) сборку, если определенные предварительные условия не выполняются, и нет никакой реальной работы. Как я могу это сделать? Я знаю, что переменная currentBuild
доступна, но я не могу найти для нее документацию.
Ответы
Ответ 1
Вы можете пометить сборку как ABORTED, а затем использовать шаг error
, чтобы остановить сборку:
if (!continueBuild) {
currentBuild.result = 'ABORTED'
error('Stopping early…')
}
В представлении Stage это покажет, что сборка остановлена на этом этапе, но общая сборка будет отмечена как прерванная, а не неудачная (см. серый значок для сборки # 9):
![Вид этапа трубопровода]()
Ответ 2
После некоторого тестирования я нашел следующее решение:
def autoCancelled = false
try {
stage('checkout') {
...
if (your condition) {
autoCancelled = true
error('Aborting the build to prevent a loop.')
}
}
} catch (e) {
if (autoCancelled) {
currentBuild.result = 'ABORTED'
echo('Skipping mail notification')
// return here instead of throwing error to keep the build "green"
return
}
// normal error handling
throw e
}
Это приведет к следующему виду этапа:
![enter image description here]()
неудачная стадия
Если вам не нравится неудачный этап, вы должны использовать return. Но имейте в виду, что вы должны пропустить каждый этап или оболочку.
def autoCancelled = false
try {
stage('checkout') {
...
if (your condition) {
autoCancelled = true
return
}
}
if (autoCancelled) {
error('Aborting the build to prevent a loop.')
// return would be also possible but you have to be sure to quit all stages and wrapper properly
// return
}
} catch (e) {
if (autoCancelled) {
currentBuild.result = 'ABORTED'
echo('Skipping mail notification')
// return here instead of throwing error to keep the build "green"
return
}
// normal error handling
throw e
}
Результат:
![enter image description here]()
пользовательская ошибка в качестве индикатора
Вы также можете использовать пользовательское сообщение вместо локальной переменной:
final autoCancelledError = 'autoCancelled'
try {
stage('checkout') {
...
if (your condition) {
echo('Aborting the build to prevent a loop.')
error(autoCancelledError)
}
}
} catch (e) {
if (e.message == autoCancelledError) {
currentBuild.result = 'ABORTED'
echo('Skipping mail notification')
// return here instead of throwing error to keep the build "green"
return
}
// normal error handling
throw e
}
Ответ 3
Следуя этой документации от Jenkins, вы должны иметь возможность генерировать ошибку, чтобы остановить сборку и установить результат сборки следующим образом:
currentBuild.result = 'ABORTED'
Надеюсь, что это поможет.
Ответ 4
То, что мы используем, это:
try {
input 'Do you want to abort?'
} catch (Exception err) {
currentBuild.result = 'ABORTED';
return;
}
"Возврат" в конце гарантирует, что дальнейший код не выполняется.
Ответ 5
Я обработал декларативным способом, как показано ниже:
На основе блока catchError он выполнит постблок. Если результат публикации попадает в категорию ошибок, блок ошибок будет выполнен, чтобы остановить следующие этапы, такие как Production, PreProd и т.д.
pipeline {
agent any
stages{
stage('Build') {
steps{
catchError {
sh 'sudo bash path/To/Filename.sh'
}
}
post {
success {
echo 'Build stage successful'
}
failure {
echo 'Compile stage failed'
error('Build is aborted due to failure of build stage')
}
}
}
stage ('Production'){
steps {
sh 'sudo bash path/To/Filename.sh'
}
}
}
}
Ответ 6
Чтобы остановить конвейер с результирующим "прерванным", вы должны установить currentBuild.result
в 'ABORTED'
, а затем прекратить выполнение конвейера с помощью return
.
stage("Check Preconditions") {
...
if(continueBuild == false) {
currentBuild.result = 'ABORTED'
return
}
}
...