Подтвердить что ты не робот

Завершить работу трубопровода Дженкинса

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

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

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

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

4b9b3361

Ответ 1

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

sh "./build"

Это приведет к завершению, если script возвращает ненулевой код выхода.

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

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
}

будет.

Ответ 2

Другим способом достижения этого поведения является выброс Исключения. Фактически, это именно то, что делает сам Дженкинс. Таким образом, вы также можете установить статус сборки как 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

Ответ 3

Поскольку Jenkins v2 это также должно работать

error('Failed to build')

Работа закончится с:

ERROR: Failed to build
Finished: ERROR