2016-08-02 18 views
9

Zur Zeit schlägt meine Pipeline fehl (rot), wenn ein Maven-Job instabil ist (gelb).Jenkins-Pipeline schlägt fehl, wenn Schritt instabil ist

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

In diesem Beispiel ist das Ergebnis des Job-Unit-Tests instabil, wird jedoch in der Pipeline als fehlgeschlagen angezeigt.

Wie kann ich die Jobs/pipeline/jenkins so ändern, dass der (1) Pipeline-Schritt instabil statt fehlgeschlagen ist und (2) der Status der Pipeline instabil ist statt fehlgeschlagen.

Ich habe versucht, den MAVEN_OPTS Parameter -Dmaven.test.failure.ignore=true hinzuzufügen, aber das hat das Problem nicht gelöst. Ich bin mir nicht sicher, wie man das build 'Unit-Test' in irgendeine Logik wickeln kann, die das Ergebnis fangen und verarbeiten kann.

Das Hinzufügen einer Subpipeline mit this logic führt nicht zum Erfolg, da es keine Option zum Auschecken aus Subversion gibt (diese Option ist in einem normalen maven-Job verfügbar). Ich möchte die Befehlszeile nicht verwenden, wenn möglich.

Antwort

10

Unabhängig davon, ob der Schritt UNSTABLE oder FAILED ist, wird das endgültige Build-Ergebnis in Ihrem Skript als FEHLER angezeigt.

Sie können propagate standardmäßig zu false hinzufügen, um zu vermeiden, dass der Datenfluss fehlschlägt.

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

Am Ende der Strömung, Sie Urteil kann das Endergebnis auf, was Sie aus dem „Ergebnis“ Variable bekamen.

Zum Beispiel

currentBuild.result='UNSTABLE' 

Hier ist ein Detail Beispiel How to set current build result in Pipeline

Br,

Tim

13

Lessons learned:

  • Jenkins wird die Pipeline nach dem currentBuild.result Wert kontinuierlich aktualisieren, die entweder SUCCESS, UNSTABLE oder FAILED
  • Das Ergebnis build job: <JOBNAME> kann in einer Variablen gespeichert werden, sein kann. Der Build-Status ist in variable.result.
  • build job: <JOBNAME>, propagate: false wird verhindern, dass der gesamte Build sofort ausfällt.
  • currentBuild.resultcan only get worse. Wenn dieser Wert zuvor FAILED war und erhält einen neuen Status SUCCESS durch currentBuild.result = 'SUCCESS' wird es FAILED

bleibt Dies ist, was ich schließlich verwendet:

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' 
} 
+2

Und man kann nicht ein 'SUCCESS' Ergebnis gesetzt, wenn Es wurde bereits auf "FAILED" gesetzt (wie hier [http://stackoverflow.com/questions/38221836/how-to-manipulate-the-build-result-of-a-jenkins-pipeline-job besprochen]). – StephenKing

+1

Danke für die Info, hinzugefügt, dass die Antwort. – michaelbahr

+0

Ich habe das gleiche Problem.Ich verstehe immer noch nicht den Grund.Warum wird Instable als FEHLGESCHLAGEN betrachtet, wenn das Stage View-Plugin "Unstable" (gelb) unterstützt? Warum musst du currentBuild.result die ganze Zeit einstellen und nicht nur das Schlimmste nehmen? – lqbweb