Остановите работу конвейера jenkins рано

в нашей работе конвейера Дженкинса у нас есть несколько этапов, и я хотел бы, чтобы любой из этапов потерпел неудачу, а затем остановить сборку и не продолжать на дальнейших этапах.

вот пример одного из этапов:

stage('Building') {
    def result = sh returnStatus: true, script: './build.sh'
    if (result != 0) {
        echo '[FAILURE] Failed to build'
        currentBuild.result = 'FAILURE'
    }
}

сценарий завершится ошибкой, и результат сборки будет обновлен, но задание продолжит работу на следующих этапах. Как я могу прервать или остановить работу, когда это происходит?

2 ответов


в основном это то, что sh шаг делает. Если вы не получите результат в переменной, вы можете просто запустить:

sh "./build"

это выйдет, если скрипт повторит ненулевой код выхода.

Если вам нужно сначала сделать что-то, и нужно захватить результат, вы можете использовать шаг оболочки, чтобы выйти из задания

stage('Building') {
    def result = sh returnStatus: true, script: './build.sh'
    if (result != 0) {
        echo '[FAILURE] Failed to build'
        currentBuild.result = 'FAILURE'
        // do more stuff here

        // this will terminate the job if result is non-zero
        // You don't even have to set the result to FAILURE by hand
        sh "exit ${result}"  
    }
}

но следующее даст вам то же самое, но кажется более разумным сделать

stage('Building') {
    try { 
         sh './build.sh'
    } finally {
        echo '[FAILURE] Failed to build'
    }
}

также возможно вызвать возвращение в вашем код. Однако если вы находитесь внутри stage он только вернется из этой стадии. Так что

stage('Building') {
   def result = sh returnStatus: true, script: './build.sh'
   if (result != 0) {
      echo '[FAILURE] Failed to build'
      currentBuild.result = 'FAILURE'
      return
   }
   echo "This will not be displayed"
}
echo "The build will continue executing from here"

не выйдет из работы, но

stage('Building') {
   def result = sh returnStatus: true, script: './build.sh'
}
if (result != 0) {
  echo '[FAILURE] Failed to build'
  currentBuild.result = 'FAILURE'
  return
}

будет.


другой способ добиться такого поведения-создать исключение. На самом деле, это именно то, что делает сам Дженкинс. Таким образом, вы также можете установить статус сборки либо ABORTED или FAILURE. Этот пример прерывает построение:

stage('Building') {
    currentBuild.rawBuild.result = Result.ABORTED
    throw new hudson.AbortException('Guess what!')
    echo 'Further code will not be executed'
}

выход:

[Pipeline] stage
[Pipeline] { (Building)
[Pipeline] }
[Pipeline] // stage
[Pipeline] End of Pipeline
ERROR: Guess what!
Finished: ABORTED