J'ai une série d'étapes qui effectuent des vérifications rapides. Je veux toutes les exécuter, même s'il y a des échecs. Par exemple:
stage('one') {
node {
sh 'exit 0'
}
}
stage('two') {
node {
sh 'exit 1' // failure
}
}
stage('three') {
node {
sh 'exit 0'
}
}
L'étape two
échoue, donc l'étape three
par défaut n'est pas exécutée.
Normalement, ce serait un travail pour parallel
, mais je souhaite les afficher dans la vue de la scène. Dans la maquette ci-dessous:
two
échoue et three
ne s'exécute pas.two
échoue et est affiché comme tel, mais three
est toujours exécuté. Le vrai Jenkins afficherait probablement toute la compilation n ° 6 légèrement teintée de rouge, ce qui est bien sûr parfait.C'est maintenant possible. Vous trouverez ci-dessous un exemple de pipeline déclaratif, mais catchError
fonctionne également pour les pipelines scriptés.
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 seront exécutées, 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.
EDIT: Vous avez besoin de "Pipeline: étapes de base" 2.16 (14 mai 2019)
J'avais le même souci, j'ai pu le résoudre en procédant de la sorte.
La deuxième étape sera indiquée en rouge et marquée comme ayant échoué. Le reste des étapes continuera à fonctionner Vous pouvez définir un indicateur et, à la fin des étapes, en vérifiant cet indicateur, vous pouvez indiquer le statut de la construction entière.
node {
def build_ok = true
stage('one') {
sh 'exit 0'
}
try{
stage('two') {
sh 'exit 1' // failure
}
} catch(e) {
build_ok = false
echo e.toString()
}
stage('three') {
sh 'exit 0'
}
....
if(build_ok) {
currentBuild.result = "SUCCESS"
} else {
currentBuild.result = "FAILURE"
}
}
Cela devrait marcher. Cependant, toutes les cases sont rouges si une seule échoue, mais vous pouvez voir les cases avec une erreur marquée, vous permettant ainsi de distinguer facilement les tâches ayant échoué.
def indexes = ['one', 'two', 'three']
node() {
for (index in indexes) {
catchError {
stage(index) {
println index
sh '''echo "123"'''
}
}
}
}
Utilisation
propager: faux
flag pour passer à l’étape suivante lorsque l’étape précédente échoue.
exemple:
stage('<stage-name>'){
node('<node-name>'){
build job: '<job-name>', propagate: false
}
}
stage('<stage-name>'){
node('<node-name>'){
build job: '<job-name>'
}
}
Cela dépend si vous utilisez syntaxe de pipeline déclarative ou syntaxe de pipeline scriptée .
syntaxe déclarative du pipeline :
pipeline {
agent any
stages {
stage('one') {
steps {
sh 'exit 0'
}
}
stage('two') {
steps {
sh 'exit 1' // failure
}
}
}
post {
always {
sh 'exit 0'
}
}
}
Les blocs de post-condition contiennent étapes identiques à la section étapes .
syntaxe de pipeline scriptée :
node {
def build_ok = true
stage('one') {
sh 'exit 0'
}
try{
stage('two') {
sh 'exit 1' // failure
}
} catch(e) {
build_ok = false
echo e.toString()
}
stage('three') {
sh 'exit 0'
}
if(build_ok) {
currentBuild.result = "SUCCESS"
} else {
currentBuild.result = "FAILURE"
}
}
J'ai résolu le problème en utilisant les actions postées: https://jenkins.io/doc/pipeline/tour/post/
post {
always {
...
}
}