Покажите стадию трубопровода Дженкинса как потерпевшую неудачу без провала всей работы
Здесь код, который я играю с
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 обновлен, так как это довольно новая функция.