it-swarm.com.de

Don't Fail Jenkins Build, wenn die Ausführung von Shell fehlschlägt

Im Rahmen meines Erstellungsprozesses führe ich ein Git-Commit als Shell-Ausführungsschritt aus. Wenn jedoch keine Änderungen im Arbeitsbereich vorgenommen wurden, schlägt Jenkins die Erstellung fehl. Dies liegt daran, dass git einen Fehlercode zurückgibt, wenn keine Änderungen festgeschrieben werden müssen. Ich möchte den Build entweder abbrechen oder ihn nur als instabil markieren, wenn dies der Fall ist. Irgendwelche Ideen?

103
Ben

Ich konnte dies mit der hier gefundenen Antwort zum Laufen bringen:

Wie kann ich nichts ohne Fehler begehen?

git diff --quiet --exit-code --cached || git commit -m 'bla'
7
Ben

So stoppen Sie die weitere Ausführung, wenn Befehl fehlschlägt:

command || exit 0

So setzen Sie die Ausführung fort, wenn Befehl fehlschlägt:

command || true

171

Jenkins führt standardmäßig Shell-Build-Schritte mit /bin/sh -xe Aus. -x Bedeutet, dass jeder ausgeführte Befehl gedruckt wird. -e Bedeutet, dass der Vorgang mit einem Fehler beendet wird, wenn einer der Befehle im Skript fehlgeschlagen ist.

Ich denke, was in Ihrem Fall passiert ist, ist Ihr git-Befehl exit mit 1, und aufgrund des Standardparameters -e Nimmt die Shell den Exit-Code ungleich 0 auf, ignoriert den Rest des Skripts und markiert den Schritt als Fehlschlag. Wir können dies bestätigen, wenn Sie Ihr Build-Schritt-Skript hier veröffentlichen können.

In diesem Fall können Sie versuchen, #!/bin/sh So zu setzen, dass das Skript ohne Option ausgeführt wird. Oder führen Sie einen set +e oder einen ähnlichen Befehl über dem Erstellungsschritt aus, um dieses Verhalten zu überschreiben.


Bearbeitet: Eine andere Sache zu beachten ist, dass, wenn der letzte Befehl in Ihrem Shell-Skript Code ungleich 0 zurückgibt , der gesamte Build-Schritt wird auch bei diesem Setup als fehlgeschlagen markiert. In diesem Fall können Sie einfach einen echo -Befehl am Ende einfügen, um dies zu vermeiden.

Eine andere verwandte Frage

70
Xiawei Zhang

Wenn Push git nichts zu tun hat, wird der Exit-Status zurückgegeben. 1. Der Build-Schritt von Execute Shell wird als fehlgeschlagen markiert. Sie können OR statement || (double pipe) verwenden.

git commit -m 'some messasge' || echo 'Commit failed. There is probably nothing to commit.'

Das heißt, führen Sie das zweite Argument aus, wenn das erste fehlgeschlagen ist (zurückgegebener Exit-Status> 0). Der zweite Befehl gibt immer 0 zurück. Wenn nichts zu drücken ist (Status 1 verlassen -> zweiten Befehl ausführen), gibt das Echo 0 zurück und der Erstellungsschritt wird fortgesetzt.

Um Build als instabil zu markieren, können Sie den Jenkins Text Finder nach dem Build verwenden. Es kann die Konsolenausgabe durchlaufen, Muster (Ihr Echo) abgleichen und Build als instabil markieren.

37
ecervena

Es gibt noch eine andere Möglichkeit, Jenkins zu sagen, dass er nicht scheitern soll. Sie können Ihr Commit in einem Erstellungsschritt isolieren und die Shell so einstellen, dass es nicht fehlschlägt:

set +e
git commit -m "Bla."
set -e
16
joecks

Jenkins bestimmt den Erfolg/Misserfolg eines Schritts anhand des Rückgabewerts des Schritts. Für den Fall einer Shell sollte dies die Rückgabe des letzten Werts sein. Für Windows CMD- und (POSIX) Bash-Shells sollten Sie den Rückgabewert manuell festlegen können, indem Sie exit 0 Als letzten Befehl verwenden.

7
jwernerny

Zur (allgemeineren) Frage im Titel - um zu verhindern, dass Jenkins fehlschlägt, können Sie verhindern, dass Exit-Code 1 angezeigt wird. Beispiel für Ping:

bash -c "ping 1.2.3.9999 -c 1; exit 0"

Und jetzt können Sie z. Ausgabe von Ping erhalten:

output=`bash -c "ping 1.2.3.9999 -c 1; exit 0"`

Natürlich statt ping ... Sie können alle Befehle verwenden - einschließlich git commit.

7
Nux

Sie können das Text-Finder Plugin verwenden. Sie können dann in der Ausgabekonsole nach einem Ausdruck Ihrer Wahl suchen und den Build als Unstable markieren.

5
jphuynh

https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-Shell-script

wenn Sie eine returnStatus: true -Eigenschaft angeben, wird die Shell-Rückgabe ignoriert.

4
jaxxed

Bei mehreren Shell-Befehlen ignoriere ich die Fehler, indem ich Folgendes hinzufüge:

set +e commands true

enter image description here

3
Megha

Wenn Sie diese Befehle in den Shell-Block einfügen:

false
true

ihr Build wird als fehlgeschlagen markiert (mindestens 1 Exit-Code ungleich Null). Sie können also hinzufügen (set + e), um ihn zu ignorieren:

set +e
false
true

wird nicht scheitern. Dies schlägt jedoch auch mit (set + e) ​​fehl:

set +e
false

weil der letzte Shell-Befehl mit 0 beendet werden muss.

2
chenchuk

Das Folgende funktioniert für Mercurial, indem es nur festgeschrieben wird, wenn es Änderungen gibt. Daher schlägt der Build nur fehl, wenn das Festschreiben fehlschlägt.

hg id | grep "+" || exit 0
hg commit -m "scheduled commit"
1
Shaun Lebron

Eine weitere Antwort mit einigen Tipps kann für jemanden hilfreich sein:

denken Sie daran, Ihre Befehle zu trennen mit der folgenden Regel :

befehl1 && befehl2 - bedeutet, dass befehl2 nur ausgeführt wird, wenn befehl1 erfolgreich ist

befehl1 ; befehl2 - bedeutet, dass befehl 2 trotz des ergebnisses von befehl1 ausgeführt wird

beispielsweise:

String run_tests = sh(script: "set +e && cd ~/development/tests/ && gmake test ;set -e;echo 0 ", returnStdout: true).trim()
println run_tests 

wird mit den Befehlen set -e und echo 0 erfolgreich ausgeführt, wenn gmake test fehlschlägt (Ihre Tests sind fehlgeschlagen), während der folgende Code abgeschnitten hat:

String run_tests = sh(script: "set +e && cd ~/development/tests/ && gmake test && set -e && echo 0 ", returnStdout: true).trim()
println run_tests 

ein bisschen falsch und die Befehle set -e und echo 0 in && gmake test && set -e && echo 0 werden mit der Anweisung println run_tests übersprungen, weil fehlgeschlagen gmake test den Befehl abbricht Jenkins bauen. Um dieses Problem zu umgehen, können Sie zu returnStatus:true Wechseln, aber dann werden Sie die Ausgabe Ihres Befehls verpassen.

0
Sysanin