web-dev-qa-db-fra.com

Le pipeline Jenkins échoue si l'étape est instable

Actuellement, mon pipeline échoue (rouge), lorsqu'un travail maven est instable (jaune).

node {
    stage 'Unit/SQL-Tests'
    parallel (
       phase1: { build 'Unit-Tests' }, // maven
       phase2: { build 'SQL-Tests' } // Shell
    )
    stage 'Integration-Tests'
    build 'Integration-Tests' // maven
}

Dans cet exemple, le résultat du test unitaire du travail est instable, mais il apparaît comme ayant échoué dans le pipeline.

Comment puis-je modifier les travaux/pipeline/jenkins pour que (1) l'étape du pipeline soit instable au lieu d'échouer et (2) l'état du pipeline instable au lieu d'échouer.

J'ai essayé d'ajouter le MAVEN_OPTS paramètre -Dmaven.test.failure.ignore=true, mais cela n'a pas résolu le problème. Je ne sais pas comment envelopper le build 'Unit-Test' dans une logique qui peut capturer et traiter le résultat.

Ajouter un sous-pipeline avec cette logique ne fait pas l'affaire, car il n'y a pas d'option pour extraire de Subversion (cette option est disponible dans un travail Maven normal). Je ne voudrais pas utiliser le paiement en ligne de commande si possible.

15
michaelbahr

Quelle que soit l'étape instable ou échouée, le résultat final de la construction dans votre script sera échoué.

Vous pouvez ajouter propagate à false par défaut pour éviter l'échec du flux.

def result = build job: 'test', propagate: false

À la fin du flux, vous pouvez rendre le résultat final en fonction de ce que vous avez obtenu de la variable "résultat".

Par exemple

currentBuild.result='UNSTABLE'

Voici un exemple détaillé Comment définir le résultat de la construction actuelle dans Pipeline

Br,

Tim

19
Tim

Leçons apprises:

  • Jenkins mettra à jour le pipeline en continu en fonction du currentBuild.result valeur qui peut être SUCCESS, UNSTABLE ou FAILURE ( source ).
  • Le résultat de build job: <JOBNAME> peut être stocké dans une variable. Le statut de génération est dans variable.result.
  • build job: <JOBNAME>, propagate: false empêchera tout le build de tomber en panne immédiatement.
  • currentBuild.resultne peut qu'empirer . Si cette valeur était précédemment FAILED et reçoit un nouveau statut SUCCESS via currentBuild.result = 'SUCCESS' il restera FAILED

Voici ce que j'ai finalement utilisé:

node {
    def result  // define the variable once in the beginning
    stage 'Unit/SQL-Tests'
    parallel (
       phase1: { result = build job: 'Unit', propagate: false }, // might be UNSTABLE
       phase2: { build 'SQL-Tests' }
    )
    currentBuild.result = result.result  // update the build status. jenkins will update the pipeline's current status accordingly
    stage 'Install SQL'
    build 'InstallSQL'
    stage 'Deploy/Integration-Tests'
    parallel (
       phase1: { build 'Deploy' },
       phase2: { result = build job: 'Integration-Tests', propagate: false }
    )
    currentBuild.result = result.result // should the Unit-Test be FAILED and Integration-Test SUCCESS, then the currentBuild.result will stay FAILED (it can only get worse)
    stage 'Code Analysis'
    build 'Analysis'
}
22
michaelbahr