Als Teil meines Erstellungsprozesses führe ich ein Git-Commit als Ausführungs-Shell-Schritt aus. Wenn jedoch keine Änderungen im Arbeitsbereich vorgenommen werden, 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 einfach als instabil markieren, wenn dies der Fall ist. Irgendwelche Ideen?
132
Antworten:
So stoppen Sie die weitere Ausführung, wenn der Befehl fehlschlägt:
command || exit 0
So setzen Sie die Ausführung fort, wenn der Befehl fehlschlägt:
command || true
quelle
|| exit 0
im ersten Fall nicht. Wenncommand
false zurückgegeben wird, wird die Ausführung gestoppt. Die zweite Option ist jedoch sehr hilfreich!exit 0
weil jeder Exit-Code ungleich Null den Build fehlschlagen wird.Jenkins führt
/bin/sh -xe
standardmäßig Shell-Build-Schritte aus.-x
bedeutet, jeden ausgeführten Befehl zu drucken.-e
bedeutet, mit einem Fehler zu beenden, wenn einer der Befehle im Skript fehlgeschlagen ist.Ich denke also, 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 Fehler. Wir können dies bestätigen, wenn Sie Ihr Build-Step-Skript hier veröffentlichen können.Wenn dies der Fall ist, können Sie versuchen,
#!/bin/sh
so zu setzen , dass das Skript ohne Option ausgeführt wird. oder führen Sie zusätzlichset +e
zum Build-Schritt einen oder einen ähnlichen Vorgang aus, um dieses Verhalten zu überschreiben.Bearbeitet: Eine andere zu beachtende Sache ist, dass, wenn der letzte Befehl in Ihrem Shell-Skript Nicht-0-Code zurückgibt , der gesamte Erstellungsschritt auch bei diesem Setup als fehlgeschlagen markiert wird. In diesem Fall können Sie einfach einen
echo
Befehl am Ende einfügen, um dies zu vermeiden.Eine andere verwandte Frage
quelle
Wenn es nichts zu pushen gibt, gibt git den Exit-Status zurück. 1. Der Shell-Build-Schritt ausführen wird als fehlgeschlagen markiert. Sie können die OR-Anweisung || verwenden (Doppelrohr).
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 (Exit-Status 1 -> 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, das Muster (Ihr Echo) abgleichen und den Build als instabil markieren.
quelle
Es gibt noch eine andere Möglichkeit, Jenkins zu sagen, dass er nicht scheitern soll. Sie können Ihr Commit in einem Build-Schritt isolieren und die Shell so einstellen, dass sie nicht fehlschlägt:
quelle
set -e
dass Sie nach dem Befehl, den Sie ausführen möchten, unabhängig vom Exit-Code hinzufügen . Andernfalls führen Sie möglicherweise Befehle aus, die Sie nicht beabsichtigen. Ich wollte den Fehler selbst behandeln, also tat ich etwas wie: `set + e commit -m" bla "EXIT_CODE =" $ {?} "Set -e # handle Exit-Code-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. Sowohl für Windows CMD- als auch für (POSIX) Bash-Shells sollten Sie in der Lage sein, den Rückgabewert manuell festzulegen, indem Sie
exit 0
als letzten Befehl verwenden.quelle
exit 0
mit "Windows-Batch-Befehl ausführen" in mehreren Builds meiner Windows Jenkins-Installation und es funktioniert wie erwartet. Es muss noch etwas los sein. Könnten Sie den relevanten Teil des Konsolenprotokolls veröffentlichen?#!/bin/sh -xv
der das Skript gestoppt wird, wenn ein Fehler auftritt.Ich konnte dies mit der hier gefundenen Antwort zum Laufen bringen:
Wie kann man nichts ohne Fehler festschreiben?
quelle
git diff
Befehl ausführen , und wenn dies fehlschlägt,git commit
Befehlgit diff
ausführen . Grundsätzlich wird das Festschreiben nur ausgeführt, wenn etwas gefunden wurde, das festgeschrieben werden soll. Die Antwort von @jwernerny war jedoch korrekt, die Sieexit 0
als letzte Anweisung hinzufügen sollten Ich kann mir ein Szenario vorstellen, in dem dies fehlschlagen würde, wenn Sie einen Linux-Shell-Schritt ausführen würden, aber in Batch sollte dies immer funktionieren./bin/sh -xe
standardmäßig aus, wie hier erwähnt (in der Mitte). Sie können also versuchen,#!/bin/bash
einenset +e
Schritt über den Build-Schritt zu setzen oder zu tun , um dieses Verhalten zu überschreiben.Bei der (allgemeineren) Frage im Titel: Um zu verhindern, dass Jenkins fehlschlägt, können Sie verhindern, dass der Exit-Code 1 angezeigt wird. Beispiel für Ping:
Und jetzt können Sie zB Ping ausgeben:
Natürlich
ping ...
können Sie stattdessen auch beliebige Befehle verwenden - einschließlichgit commit
.quelle
https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script
Wenn Sie eine returnStatus: true-Eigenschaft einfügen, wird die Shell-Rückgabe ignoriert.
quelle
Sie können das Text-Finder-Plugin verwenden . Sie können die Ausgabekonsole auf einen Ausdruck Ihrer Wahl überprüfen und dann den Build als markieren
Unstable
.quelle
Bei mehreren Shell-Befehlen ignoriere ich die Fehler, indem ich Folgendes hinzufüge:
set +e commands true
quelle
Wenn Sie diese Befehle in den Shell-Block einfügen:
Ihr Build wird als fehlgeschlagen markiert (mindestens 1 Exit-Code ungleich Null). Sie können also hinzufügen (set + e), um ihn zu ignorieren:
wird nicht scheitern. Dies schlägt jedoch auch dann fehl, wenn (set + e) vorhanden ist:
weil der letzte Shell-Befehl mit 0 beendet werden muss.
quelle
Das Folgende funktioniert für mercurial, indem es nur festgeschrieben wird, wenn es Änderungen gibt. Der Build schlägt also nur fehl, wenn das Commit fehlschlägt.
quelle
Eine andere Antwort mit einigen Tipps kann für jemanden hilfreich sein:
Denken Sie daran, Ihre Befehle mit der folgenden Regel zu trennen :
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:
wird erfolgreich ausgeführt mit
set -e
undecho 0
Befehle, wenn diesgmake test
fehlschlägt (Ihre Tests sind fehlgeschlagen), während der folgende Code abgeschnitten wurde:Ein bisschen falsch und Befehle
set -e
undecho 0
In&& gmake test && set -e && echo 0
werden mit derprintln run_tests
Anweisung übersprungen , dagmake test
ein Fehlschlagen den Jenkins-Build abbricht. Als Problemumgehung können Sie zu wechselnreturnStatus:true
, aber dann werden Sie die Ausgabe Ihres Befehls verpassen.quelle
Diese Antwort ist korrekt, gibt jedoch nicht das
|| exit 0
oder|| true
geht in den Shell-Befehl ein . Hier ist ein vollständigeres Beispiel:Das Obige wird funktionieren, aber das Folgende wird fehlschlagen:
Vielleicht ist es für andere offensichtlich, aber ich habe viel Zeit verschwendet, bevor ich das realisiert habe.
quelle