Wie setze ich "killSoftly" für einen bestimmten Jenkins-Job?

11

Mein Jenkins-Build hängt zwischen Build- und Post-Build-Schritten.

Die Konsolenausgabe zeigt, dass es eine Wartezeit von 6 Minuten gibt (aber ich habe Wartezeiten von bis zu einer Stunde gesehen):

10:53:26 BUILD FAILED in 1m 7s
10:53:26 4 actionable tasks: 4 executed
10:53:26 Build step 'Invoke Gradle script' changed build result to FAILURE
10:53:26 Build step 'Invoke Gradle script' marked build as failure
11:09:29 [CucumberReport] Using Cucumber Reports version 4.9.0

Ich fand dieses und diese Fragen , die ähnliche Probleme haben, und sie sagen , dass die Lösung setzt -DSoftKillWaitSeconds=0in jenkins.xml.

Ich brauche jedoch eine Möglichkeit, die Option nur für bestimmte Jobs festzulegen, ohne die globalen Jenkins-Einstellungen zu beeinträchtigen (ich möchte mich nicht mit anderen Projekten herumschlagen).

BEARBEITEN:

Wenn ich den Job vor dem Schritt [CucumberReport] manuell abbreche, werden weiterhin Gurkenberichte generiert.

Ich habe auch das Kontrollkästchen Build abbrechen aktiviert, wenn es in den Build-Umgebungsoptionen nicht funktioniert. Die No ActivityTimeout -Strategie ist auf (Timeout-Sekunden = 2) festgelegt.

Wenn ich das Projekt mit diesen Einstellungen erstelle, schlägt der Build wie zuvor mit "Abgebrochen nach 0 Sekunden" im Erstellungsverlauf fehl, aber die Konsolenausgabe ist dieselbe. (Es ändert sich nichts, Gurkenberichte werden jedoch nach einer bestimmten Zeitspanne generiert.)

Kumpel Mrše
quelle
Was möchten Sie mit dem Parameter erreichen? Vielleicht gibt es dafür eine einfachere Lösung.
Michael Kemmerzell
Ich möchte die Wartezeit nach der Erstellungsphase verkürzen. Wie Sie der Konsolenausgabe entnehmen können, dauert es zwischen den Build- und Post-Build-Schritten 6 Minuten.
Mate Mrše
Können Sie einige Teile Ihrer Pipeline bereitstellen? Ich bezweifle, dass Jenkins einfach feststeckt - hier muss etwas passieren.
Michael Kemmerzell
Können Sie genauer angeben, welche Teile der Pipeline von Interesse sind, damit ich einige bearbeiten und freigeben kann, da ich den tatsächlichen Code nicht freigeben kann?
Mate Mrše
Können Sie nicht einfach eine timeoutOption in Ihrer Pipe festlegen ? Sie sollten auf jeden Fall eine vereinfachte Version Ihrer Pipe veröffentlichen. Es ist schwer zu "erraten", was falsch sein könnte. Außerdem ist diese Frage wahrscheinlich besser geeignet, um unter devops.stackexchange.com
tftd

Antworten:

4

Es ist nicht möglich, einen auftragsspezifischen Wert für auszuwählenSoftKillWaitSeconds (der Wert wird vom Jenkins-Kern an einer Stelle abgeleitet, an der der Auftragsname nicht bekannt ist).

Meine Empfehlung ist, die Abbruchbehandlung in Ihrem Job selbst zu korrigieren , damit sie nicht von einem "Soft-Kill-Timeout" abhängt. Wenn Sie auf einem Unix-ish-System ausgeführt werden, können Sie dies sicherstellen, indem Sie Ihren Job in einer neuen Prozessgruppe ( set -min Bash) ausführen und (zum Beispiel) einen geeigneten Exit-Trap einrichten.

Alex O.
quelle
Könnten Sie, da ich neu bei Jenkins bin, das Thema "Ausführen Ihres Jobs in einer neuen Prozessgruppe (Set -m in Bash) und (zum Beispiel) Einrichten einer geeigneten Exit-Trap" erweitern?
Mate Mrše
Dies hat nichts mit Jenkins an sich zu tun. Sie können diesen Ansatz verwenden, wenn Ihr Job einen Build-Schritt "Shell ausführen" umfasst (oder wenn Sie ihn so ändern können). Verwenden Sie dann "set -m", um eine neue Prozessgruppe zu erstellen, und verwenden Sie einen Trap wie hier gezeigt , um sicherzustellen, dass alle Prozesse in der Gruppe beendet werden.
Alex O
3

Wir verwenden das Build-Timeout-Plugin, um feststeckende Jobs mit einer auf No Activityoder eingestellten Timeout-Strategie zu beenden Absolute. Für mich ist dies ein guter Ansatz, wenn Sie Freestyle-Projekte verwenden. Der Grund, warum Ihr Build "Nach 0 Sekunden abgebrochen" ist, ist, dass höchstwahrscheinlich unvollendete untergeordnete Prozesse vorhanden sind. Aus der Dokumentation :

Da in Java Threads nur an einer Reihe fester Speicherorte unterbrochen werden können, wird der Abbruchvorgang möglicherweise nicht wirksam, je nachdem, wie ein Build hängt. Zum Beispiel,

  • Wenn Jenkins darauf wartet, dass untergeordnete Prozesse abgeschlossen werden, kann dies sofort abgebrochen werden.
  • Wenn Jenkins in einer Endlosschleife steckt, kann er niemals abgebrochen werden.
  • Wenn Jenkins eine Netzwerk- oder Datei-E / A in der Java-VM ausführt (z. B. langwierige Dateikopie oder SVN-Aktualisierung), kann diese nicht abgebrochen werden.

Sie können die absolute Timeout-Strategie ausprobieren. Sie können eine globale Variable definieren, damit Sie den Timeout-Wert in Jobs nicht wiederholen:

  1. Gehen Sie zu "Jenkins verwalten"> "System konfigurieren".
  2. Überprüfen Sie "Umgebungsvariablen" in "Globale Eigenschaften".
  3. Fügen Sie einen Umgebungsvariablennamen hinzu = "GLOBAL_TIMEOUT_MINUTES" value = "20".
  4. Wechseln Sie zu einer Konfigurationsseite eines Projekts.
  5. Aktivieren Sie unter "Build-Umgebung" die Option "Build abbrechen, wenn er nicht mehr funktioniert".
  6. Wählen Sie "Absolut" für "Timeout-Strategie". Natürlich auch für andere Strategien anwendbar.
  7. Setzen Sie "$ {GLOBAL_TIMEOUT_MINUTES}" für "Timeout".
  8. Stellen Sie die Timeout-Aktion "Build abbrechen" ein.

Wenn dies nicht funktioniert, können Sie versuchen, in den Protokollen https: // your-jenkins-server / log oder in einem Thread-Dump nachzuschauen.
Das Hängen kann durch eine neue / alte Version eines Plugins verursacht werden. Versuchen Sie herauszufinden, was die unvollendeten untergeordneten Prozesse sind. Versuchen Sie, die Aktionen nach dem Erstellen einzeln zu deaktivieren, um die Aktion zu finden, die möglicherweise die Ursache des Problems ist. Sie können /superuser/1401879/debugging-what-happens-when-a-jenkins-build-unexpectedly-pauses-or-hangs sehen

KB
quelle
Upvoted für nützliche Informationen löst mein Problem jedoch nicht. Ich habe bereits versucht, ein Timeout-Plugin zu erstellen, aber ohne Erfolg.
Mate Mrše