Voici le code avec lequel je joue
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
}
}
Est-il possible pour moi de marquer l'échec de l'étape 'tests de bout en bout' sans échouer tout le travail? Propager faux marque toujours la scène comme vraie, ce qui n'est pas ce que je veux, mais propager vrai marque le travail comme ayant échoué, ce que je ne veux pas non plus.
Stage prend un bloc maintenant, alors enveloppez la scène en try-catch. La prise d'essai à l'intérieur de la scène la fait réussir.
La nouvelle fonctionnalité mentionnée plus tôt sera plus puissante. Pendant ce temps:
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
}
}
Cela ressemble à JENKINS-26522 . Actuellement, le mieux que vous puissiez faire est de définir un résultat global:
if (result.equals("SUCCESS")) {
stage 'deploy'
build 'deploy'
} else {
currentBuild.result = e2e.result
// but continue
}
J'ai récemment essayé d'utiliser la réponse de vaza Afficher un stade de pipeline Jenkins comme ayant échoué sans échouer tout le travail comme modèle pour l'écriture d'une fonction qui exécute un travail dans une étape propre nommée comme le nom du travail. Étonnamment, cela a fonctionné, mais peut-être que quelques grands experts l’ont regardé :)
Voici à quoi cela ressemble si l’un des emplois est annulé:
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')
}
C'est désormais possible, même avec des pipelines déclaratifs:
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'
}
}
}
}
Dans l'exemple ci-dessus, toutes les étapes vont s'exécuter, le pipeline réussira, mais l'étape 2 s'affichera comme ayant échoué:
Comme vous l'avez peut-être deviné, vous pouvez choisir librement le buildResult
et le stageResult
, au cas où vous voudriez qu'il soit instable ou autre. Vous pouvez même échouer à la construction et continuer l'exécution du pipeline.
Assurez-vous simplement que votre Jenkins est à jour, car il s'agit d'une fonctionnalité relativement nouvelle.
Vous pouvez ajouter une tâche d'échec explicite, telle que "sh" pas de commande "" dans la phase.
if (result.equals("SUCCESS")) {
stage 'deploy'
build 'deploy'
} else {
try {
sh "not exist command"
}catch(e) {
}
}
stage
, gérez l'exception et choisissez le statut de construction.node("node-name") {
try {
stage("Process") {
error("This will fail")
}
} catch(Exception error) {
currentBuild.result = 'SUCCESS'
return
}
stage("Skipped") {
// This stage will never run
}
}
node("node-name") {
try {
stage("Process") {
error("This will fail")
}
} catch(Exception error) {
currentBuild.result = 'ABORTED'
return
}
stage("Skipped") {
// This stage will never run
}
}