Avec jenkins build flow plugin, cela était possible:
ignore(FAILURE){
build( "system-check-flow" )
}
Comment faire cela avec la syntaxe Declarative Pipeline?
Pour ignorer une étape ayant échoué dans le pipeline déclaratif, vous avez essentiellement deux options:
script
step et try-catch
block (similaire à la proposition précédente de R_K mais dans un style déclaratif)stage('someStage') { steps { script { try { build job: 'system-check-flow' } catch (err) { echo err } } echo currentBuild.result } }
catchError
stage('someStage') { steps { catchError { build job: 'system-check-flow' } echo currentBuild.result } }
Dans les deux cas, la construction ne sera pas abandonnée sauf exception dans build job: 'system-check-flow'
. Dans les deux cas, l'étape echo
(et toute autre action suivante) sera exécutée.
Mais il y a un différence importante entre ces deux options. Dans le premier cas, si la section try
lève une exception, l’état général de la construction ne sera pas modifié (donc echo currentBuild.result
=> SUCCESS
). Dans le second cas, votre construction globale échouera (donc echo currentBuild.result
=> FAILURE
).
Ceci est important, car vous pouvez toujours échouer la construction globale dans le premier cas (en définissant currentBuild.result = 'FAILURE'
) mais vous ne pouvez pas réparer créez une deuxième option (currentBuild.result = 'SUCCESS'
_ ne fonctionnera pas).
En plus de simplement faire passer l'étape, il est maintenant également possible de faire échouer l'étape, mais de continuer le pipeline et de passer la construction:
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 cette fonctionnalité n'est disponible que depuis "Pipeline: étapes de base" 2.16 (14 mai 2019) . Avant cela, catchError
est toujours disponible mais sans paramètres:
steps {
catchError {
sh "exit 1"
}
}
Je cherchais une réponse depuis longtemps et j'ai trouvé un hack pour ça! Je mets le bloc try/catch sur toute la scène:
try {
stage('some-stage') {
//do something
}
} catch (Exception e) {
echo "Stage failed, but we continue"
}
try {
stage("some-other-stage") { // do something }
} catch (Exception e) {
echo "Stage failed, but we still continue"
}
En conséquence, vous obtiendrez quelque chose comme ceci:
Ce n'est toujours pas idéal, mais cela donne les résultats nécessaires.
Dans les versions récentes, il est possible de passer propogate=false
option pour construire l’étape.
lien: https://jenkins.io/doc/pipeline/steps/pipeline-build-step/
exemple: build job:"jobName", propagate:false
Pour mon pipeline de décalcomanies, j'ai trouvé une autre solution:
stage('Deploy test')
{
steps
{
bat returnStatus: true, script: 'sc stop Tomcat9'
// The return value of the step will be the status code!
// evaluate return status yourself, or ignore it
}
}
Il en va de même pour la commande sh afin d’exécuter des scripts sur les plates-formes Unix.
L'exemple ignore l'état de retour, car Tomcat est peut-être déjà arrêté en raison d'une exécution de pipeline ayant échoué précédemment.
Dans le nouveau pipeline, vous pouvez utiliser try-catch pour y parvenir.
node{
try{
build job: 'system-check-flow'
}
catch (err){
echo "system-check-flow failed"
}
try{
build job: 'job2'
}
catch (err){
echo "job2 failed"
}
}
Ici, il créera le travail 'System-Check-Flow'. Si cela échoue, l'erreur sera détectée, ignorée, puis passera à la génération 'job2'