Отменить текущий сбор от трубопровода в Дженкинсе

У меня есть трубопровод Дженкинса, который имеет несколько этапов, например:

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
  }
}
...