Покажите стадию трубопровода Дженкинса как потерпевшую неудачу без провала всей работы

Здесь код, который я играю с

node {
    stage 'build'
    echo 'build'

    stage 'tests'
    echo 'tests'

    stage 'end-to-end-tests'
    def e2e = build job:'end-to-end-tests', propagate: false
    result = e2e.result
    if (result.equals("SUCCESS")) {
        stage 'deploy'
        build 'deploy'
    } else {
        ?????? I want to just fail this stage
    }
}

Можно ли мне пометить этап "от конца до конца" как неудачный, не пропустив всю работу? Пропагандировать false всегда всегда означает, что эта сцена является истиной, а это не то, что я хочу, но Propagate true отмечает работу как неудачную, которую я тоже не хочу.

Ответ 1

Этап теперь занимает блок, поэтому оберните сцену в try-catch. Уловка внутри сцены делает ее успешной.

Новая функция, упомянутая ранее, будет более мощной. Тем временем:

try {
   stage('end-to-end-tests') {
     node {      
       def e2e = build job:'end-to-end-tests', propagate: false
       result = e2e.result
       if (result.equals("SUCCESS")) {
       } else {
          sh "exit 1" // this fails the stage
       }
     }
   }
} catch (e) {
   result = "FAIL" // make sure other exceptions are recorded as failure too
}

stage('deploy') {
   if (result.equals("SUCCESS")) {
      build 'deploy'
   } else {
      echo "Cannot deploy without successful build" // it is important to have a deploy stage even here for the current visualization
   }
}

Ответ 2

Звучит как JENKINS-26522. В настоящее время лучше всего установить общий результат:

if (result.equals("SUCCESS")) {
    stage 'deploy'
    build 'deploy'
} else {
    currentBuild.result = e2e.result
    // but continue
}

Ответ 3

Недавно я пытался использовать ответ vaza. Показывать этап конвейера Jenkins как неудачный, не сбивая всю работу в качестве шаблона для написания функции, выполняющей задание на собственной стадии, называемой именем задания. Удивительно, но это сработало, но, может быть, некоторые любопытные эксперты взглянули на это :)

Вот как это выглядит, если одно из заданий прервано: enter image description here

def BuildJob(projectName) {
    try {
       stage(projectName) {
         node {      
           def e2e = build job:projectName, propagate: false
           result = e2e.result
           if (result.equals("SUCCESS")) {
           } else {
              error 'FAIL' //sh "exit 1" // this fails the stage
           }
         }
       }
    } catch (e) {
        currentBuild.result = 'UNSTABLE'
        result = "FAIL" // make sure other exceptions are recorded as failure too
    }
}

node {
    BuildJob('job1')
    BuildJob('job2')
}

Ответ 4

Вы можете добавить явную задачу с отказом, например, "sh" не существует команды "" на этапе.

if (result.equals("SUCCESS")) {
   stage 'deploy'
   build 'deploy'
} else {
   try {
       sh "not exist command"
   }catch(e) {
   }
}

Ответ 5

Шаги решения

  • Вы должны выдать ошибку на этапе, чтобы пометить ее как ошибку
  • Вне рамок stage обработайте исключение и выберите статус сборки
  • Это делает эффект желаемым несколькими пользователями здесь, включая меня, @user3768904, @Sviatlana

Успех с неудачным примером шага

node("node-name") {
  try {
    stage("Process") {
      error("This will fail")
    }
  } catch(Exception error) {
    currentBuild.result = 'SUCCESS'
    return
  }
  stage("Skipped") {
     // This stage will never run
  }
}

enter image description here

Прервано с ошибкой Шаг Пример

node("node-name") {
  try {
    stage("Process") {
      error("This will fail")
    }
  } catch(Exception error) {
    currentBuild.result = 'ABORTED'
    return
  }
  stage("Skipped") {
     // This stage will never run
  }
}

enter image description here

Ответ 6

Теперь это возможно, даже с декларативными конвейерами:

pipeline {
    agent any
    stages {
        stage('1') {
            steps {
                sh 'exit 0'
            }
        }
        stage('2') {
            steps {
                catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
                    sh "exit 1"
                }
            }
        }
        stage('3') {
            steps {
                sh 'exit 0'
            }
        }
    }
}

В приведенном выше примере все этапы будут выполнены, конвейер будет успешным, но этап 2 будет показан как неудачный:

Pipeline Example

Как вы уже догадались, вы можете свободно выбирать buildResult и stageResult, если вы хотите, чтобы он был нестабильным или что-то еще. Вы даже можете потерпеть неудачу при сборке и продолжить выполнение конвейера.

Просто убедитесь, что ваш Jenkins обновлен, так как это довольно новая функция.