webentwicklung-frage-antwort-db.com.de

Wie implementiere ich die Post-Build-Phase mit dem Jenkins Pipeline-Plug-In?

Nach dem Lesen von Jenkins Tutorial Erklären Pipeline Plug-In scheint es, dass Plug-In die Implementierung von Post-Build - Schritten ermöglichen sollte. Die Dokumentation ist jedoch in Bezug auf spezifische Anweisungen eher begrenzt.

Zum Beispiel frage ich mich, wie man das implementiert:

  • Nur ausführen, wenn Build erfolgreich ist 
  • Nur ausführen, wenn der Build erfolgreich ist oder instabil ist 
  • Führen Sie unabhängig vom Build-Ergebnis aus
  • Nur ausführen, wenn Build erfolgreich ist

    stage 'build'
    ... build
    ... tests
    stage 'post-build'
    ...
    

    (Oder fügen Sie -Dmaven.test.failure.ignore=false zum MAVEN_OPTS hinzu)

  • Nur ausführen, wenn der Build erfolgreich ist oder instabil ist

    stage 'build'
    ... build
    try {
        ... tests
    } catch {
        ...
    }
    stage 'post-build'
    ...
    

    (Oder fügen Sie -Dmaven.test.failure.ignore=true zum MAVEN_OPTS hinzu)

  • Ausführen unabhängig vom Build-Ergebnis - Könnte es mit try / catch / finally erfolgen? 

    try {
        stage 'build'
        ...
    } catch {
        ...
    } finally {
        stage 'post-build'
        ...
    }
    

(Ich habe festgestellt, dass der endgültige Build-Status auf SUCCESS gesetzt ist, auch wenn einige Stufen, z. B. 'build', aufgrund der letzten Stufe fehlgeschlagen sind. Muss der endgültige Build-Status explizit festgelegt werden dh .currentBuild.result = 'UNSTABLE'?)

40
luka5z

Am besten verwenden Sie die Nacherstellungsaktion im Pipeline-Skript.

Fehler behandeln
Deklarative Pipeline unterstützt robuste Fehler Standardmäßige Behandlung über den Post-Abschnitt, in dem eine .__ deklariert werden kann. Anzahl verschiedener "Nachbedingungen" wie: immer, instabil, Erfolg, Misserfolg und verändert. Der Abschnitt Pipeline-Syntax enthält Weitere Informationen zur Verwendung der verschiedenen Postbedingungen.

Jenkinsfile (Deklarative Pipeline)

pipeline {
    agent any
    stages {
        stage('Test') {
            steps {
                sh 'make check'
            }
        }
    }
    post {
        always {
            junit '**/target/*.xml'
        }
        failure {
            mail to: [email protected], subject: 'The Pipeline failed :('
        }
    }
}

Die Dokumentation ist unten https://jenkins.io/doc/book/pipeline/syntax/#post

31

Wenn Sie try/catch verwenden und möchten, dass ein Build als instabil oder fehlgeschlagen markiert wird, müssen Sie currentBuild.result = 'UNSTABLE' usw. verwenden Tests in den Junit-Ergebnissen. In den meisten Fällen müssen Sie sich jedoch selbst festlegen, wenn Sie Fehler feststellen.

Die zweite Option, wenn Sie nicht fortfahren möchten, ist das erneute Auftreten des Fehlers. 

stage 'build'
... build
try {
    ... tests
} catch(err) {
    //do something then re-throw error if needed.
    throw(err)
}
stage 'post-build'
...
4
DanielD

FWIW: Wenn Sie gescriptete Pipelines verwenden und nicht deklarativ sind, sollten Sie einen try/catch/finally-Block verwenden, wie in den anderen Antworten vorgeschlagen. Wenn Sie im finally-Block nachahmen möchten, was die deklarative Pipeline bewirkt, können Sie entweder Folgendes direkt in den Block einfügen oder es als Funktion definieren und diese Funktion aus Ihrem finally-Block aufrufen:

def currResult = currentBuild.result ?: 'SUCCESS'
def prevResult = currentBuild.previousBuild?.result ?: 'NOT_BUILT'

// Identify current result
boolean isAborted = (currResult == 'ABORTED')
boolean isFailure = (currResult == 'FAILURE')
boolean isSuccess = (currResult == 'SUCCESS')
boolean isUnstable = (currResult == 'UNSTABLE')

boolean isChanged = (currResult != prevResult)
boolean isFixed = isChanged && isSuccess && (prevResult != 'ABORTED') && (prevResult != 'NOT_BUILT')
boolean isRegression = isChanged && currentBuild.resultIsWorseOrEqualTo(prevResult)

onAlways()
if (isChanged) {
    onChanged()
    if (isFixed) {
        onFixed()
    } else if (isRegression) {
        onRegression()
    }
}
if (isSuccess) {
    onSuccess()
} else {
    if (isAborted) {
        onAborted()
    }
    onUnsuccessful()
    if (isFailure) {
        onFailure()
    }
    if (isUnstable) {
        onUnstable()
    }
}
onCleanup()

Die verschiedenen onXYZ()-Aufrufe sind Funktionen, die Sie definieren würden, um diese bestimmte Bedingung zu behandeln, anstatt die schönere Syntax der deklarativen post-Blöcke zu verwenden.

1
Will

try-catch-Blöcke können eingerichtet werden, um Fehler wie im realen Anwendungscode zu behandeln.

Zum Beispiel:

try {
    node {
        sh 'sleep 20' // <<- can abort here
    }
} catch (Exception e) {
    println 'catch'
} finally {
    println 'finally'
}

node {
    println 'second'
}

try {
    node {
        sh 'sleep 20' // <<- can abort here again
    }
} catch (Exception e) {
    println 'catch'
} finally {
    println 'finally'
}

Und hier ist eine Beispielausgabe mit zwei Abbrüchen.

Started by user me
Replayed #3
[Pipeline] node
Running on my-node in /var/lib/jenkins-slave/workspace/my-job
[Pipeline] {
[Pipeline] sh
[my-job] Running Shell script
+ sleep 20

Aborted by me

Sending interrupt signal to process

/var/lib/jenkins-slave/workspace/[email protected]/durable-9e1a15e6/script.sh: line 2: 10411 Terminated              sleep 20
[Pipeline] }
[Pipeline] // node
[Pipeline] echo
catch
[Pipeline] echo
finally
[Pipeline] node
Running on my-node in /var/lib/jenkins-slave/workspace/my-job
[Pipeline] {
[Pipeline] echo
second
[Pipeline] }
[Pipeline] // node
[Pipeline] node
Running on my-node in /var/lib/jenkins-slave/workspace/my-job
[Pipeline] {
[Pipeline] sh
[my-job] Running Shell script
+ sleep 20

Aborted by me

Sending interrupt signal to process
/var/lib/jenkins-slave/workspace/[email protected]/durable-d711100c/script.sh: line 2: 10416 Terminated              sleep 20
[Pipeline] }
[Pipeline] // node
[Pipeline] echo
catch
[Pipeline] echo
finally
[Pipeline] End of Pipeline
Finished: ABORTED

Dies funktioniert natürlich für alle Ausnahmen, die während der Ausführung auftreten.

1
allprog