Unser Jenkins-Server hat einen Job, der seit drei Tagen ausgeführt wird, aber nichts tut. Wenn Sie auf das kleine X in der Ecke klicken, wird nichts ausgeführt, und im Konsolenausgabeprotokoll wird auch nichts angezeigt. Ich habe unsere Build-Server überprüft und der Job scheint überhaupt nicht ausgeführt zu werden.
Gibt es eine Möglichkeit, Jenkins mitzuteilen, dass der Job "erledigt" ist, indem Sie eine Datei oder eine Sperre oder etwas anderes bearbeiten? Da wir viele Jobs haben, möchten wir den Server nicht wirklich neu starten.
Antworten:
Gehen Sie zu "Jenkins verwalten"> "Skriptkonsole", um ein Skript auf Ihrem Server auszuführen und den hängenden Thread zu unterbrechen.
Sie können alle Live-Threads abrufen
Thread.getAllStackTraces()
und den hängenden Thread unterbrechen.AKTUALISIEREN:
Die obige Lösung mit Threads funktioniert möglicherweise nicht mit neueren Jenkins-Versionen. Um gefrorene Pipelines zu unterbrechen, beziehen Sie sich stattdessen auf diese Lösung (von alexandru-bantiuc ) und führen Sie Folgendes aus:
quelle
t -> println(t.getName());
t.getName()=="SOME NAME"
?t.stop
stattdessen anrufen :Thread.getAllStackTraces().keySet().each() { t -> if (t.getName()=="YOUR THREAD NAME" ) { println(“Found, stopping now… “); t.stop(); } }
Ich hatte auch das gleiche Problem und behebte es über Jenkins Console.
Gehen Sie zu "Jenkins verwalten"> "Skriptkonsole" und führen Sie ein Skript aus:
Sie müssen nur Ihren Jobnamen und Ihre Jobnummer angeben.
quelle
Jenkins.instance.getItemByFullName("JobName").getBuildByNumber(JobNumber).delete();
Nach dem Ausführen dieser und einer anderen Jenkins-Neustart war der Zombie-Build endgültig verschwunden.finish
in AbstractBuild noch FreeSyleBuild noch MavenModulesetBuildgroovy.lang.MissingMethodException: No signature of method: hudson.model.FreeStyleBuild.finish() is applicable for argument types: (hudson.model.Result, java.io.IOException) values: [ABORTED, java.io.IOException: Aborting build] Possible solutions: find(), findAll(), find(groovy.lang.Closure) at
Wenn Sie einen Multibranch Pipeline- Job haben (und ein Jenkins-Administrator sind), verwenden Sie in der Jenkins Script Console dieses Skript:
Von https://issues.jenkins-ci.org/browse/JENKINS-43020
Wenn Sie sich nicht sicher sind, wie der vollständige Name (Pfad) des Jobs lautet, können Sie das folgende Snippet verwenden, um den vollständigen Namen aller Elemente aufzulisten:
Von https://support.cloudbees.com/hc/en-us/articles/226941767-Groovy-to-list-all-jobs
quelle
Ich benutze das Monitoring Plugin für diese Aufgabe. Nach der Installation des Plugins
Suchen Sie nach dem Jobnamen, der aufgehängt ist
Der Name des Threads beginnt so
Executor #2 for master : executing <your-job-name> #<build-number>
Klicken Sie ganz rechts in der Tabelle der Zeile, die Ihr gewünschter Job hat, auf die rote, runde Schaltfläche
quelle
Einmal stieß ich auf einen Build, der von der "Script Console" nicht gestoppt werden konnte. Schließlich habe ich das Problem mit folgenden Schritten gelöst:
quelle
Die erste vorgeschlagene Lösung ist ziemlich nah. Wenn Sie stop () anstelle von interrupt () verwenden, werden sogar außer Kontrolle geratene Threads beendet, die in einem groovigen Systemskript endlos ausgeführt werden. Dadurch wird jeder Build beendet, der für einen Job ausgeführt wird. Hier ist der Code:
quelle
contains
hier ist falsch und gefährlich. Wenn der Name Ihres Jobs "Tests ausführen" lautet, werden auch alle Jobs mit den Namen "Tests ausführen - Integration", "Tests ausführen - Einheit" usw. beendet. Wer dies verwendet, muss darauf achten, dies nicht zu tun Nicht verwandte Jobs unerwartet beendenWenn Sie einen unaufhaltsamen Pipeline-Job haben, versuchen Sie Folgendes:
Jenkins wird erkennen, dass der Job beendet werden sollte und stoppt den Build
quelle
Ohne die Skript Konsole oder zusätzliche Plugins zu verwenden, können Sie einfach abbrechen Build durch Eingabe
/stop
,/term
oder/kill
nach der Build - URL in Ihrem Browser.Wörtlich aus dem obigen Link zitieren:
quelle
Das Build-Timeout-Plugin kann in solchen Fällen nützlich sein. Der Job wird automatisch beendet, wenn er zu lange dauert.
quelle
Ich denke, es ist zu spät, um zu antworten, aber ich helfe einigen Leuten.
Ich habe nicht genug Ruf, um Bilder zu posten, sorry.
Hoffe es kann helfen
quelle
Die beste Antwort hat fast für mich funktioniert, aber ich hatte ein großes Problem: Ich hatte eine sehr große Anzahl (~ 100) von Zombie-Jobs aufgrund eines besonders zeitlich schlecht abgestimmten Jenkins-Neustarts, also manuell den Jobnamen und die Build-Nummer von jedem und Jeder Zombie-Job und das manuelle Töten war unmöglich. So habe ich die Zombie-Jobs automatisch gefunden und getötet:
Dieses Skript durchläuft alle Builds aller Jobs und
getResult().equals(null)
ermittelt, ob der Job beendet wurde oder nicht. Ein Build, der sich in der Warteschlange befindet, aber noch nicht gestartet wurde, wird nicht wiederholt (da dieser Build nicht vorhanden istjob.builds
), und ein Build, der bereits fertig ist, gibt etwas anderes alsnull
for zurückbuild.getResult()
. Ein legitim ausgeführter Job hat auch ein Build-Ergebnis von.null
Stellen Sie daher sicher, dass Sie keine laufenden Jobs haben, die Sie nicht beenden möchten, bevor Sie diesen ausführen.Die mehreren verschachtelten Schleifen sind hauptsächlich erforderlich, um jeden Zweig / PR für jedes Repository in einem Multibranch-Pipeline-Projekt zu ermitteln. Wenn Sie keine Multibranch-Pipelines verwenden, können Sie einfach alle Ihre Jobs direkt mit so etwas wie durchlaufen
Jenkins.instance.getItems().each
.quelle
runningBuilds = Jenkins.instance.getView('All').getBuilds().findAll() { it.getResult().equals(null) } runningBuilds.each { branch->branch.doKill() }
Ich habe mir die Jenkins-Quelle angesehen und es scheint, dass das, was ich versuche, unmöglich ist, da das Stoppen eines Jobs anscheinend über einen Thread-Interrupt erfolgt. Ich habe keine Ahnung, warum der Job hängt.
Bearbeiten:
Mögliche Gründe für unaufhaltsame Jobs:
quelle
In solchen Fällen benutze ich normalerweise Jenkins-Cli. Sie können das Glas von einer Seite herunterladen
http://your-jenkins-host:PORT/cli
. Dann renneZusatzinfo:
Sie können auch eine Reihe von Builds wie übergeben
350:400
. Allgemeine Hilfe beim AusführenKontextbefehlshilfe für
delete-builds
vonquelle
Die Antwort von Alexandru Bantiuc hat gut funktioniert, um den Bau zu stoppen, aber meine Testamentsvollstrecker waren immer noch beschäftigt. Ich konnte den Status des beschäftigten Executors wie folgt löschen
quelle
Hatte das gleiche Problem, aber es gab keinen Stack-Thread. Wir haben den Job mithilfe dieses Snippets in der Jenkins-Konsole gelöscht. Ersetzen Sie den Jobnamen und erstellen Sie die Nummer durch Ihre.
quelle
Kürzlich bin ich auf einen Knoten / Agenten gestoßen, bei dem ein Executor tagelang von einem Build "X" eines Pipeline-Jobs besetzt war, obwohl auf dieser Jobseite behauptet wurde, dass Build "X" nicht mehr existiert (verworfen nach 10 nachfolgenden Builds (!), As im Pipeline-Job konfiguriert). Verifiziert, dass auf Festplatte: Build "X" wirklich weg war.
Die Lösung: Es war der Agent / Knoten, der fälschlicherweise gemeldet hat, dass der besetzte Executor mit dem Ausführen von Build "X" beschäftigt war. Durch das Unterbrechen des Threads des Executors wurde dieser sofort freigegeben.
Andere Antworten berücksichtigt:
Thread.getAllStackTraces()
: kein passender Thread.getBuildByNumber()
: traf nicht zu, da der Build nicht mehr wirklich da war!Update:
Ich habe wieder eine ähnliche Situation erlebt, in der ein Executor tagelang mit einem (noch vorhandenen) fertigen Pipeline-Build beschäftigt war. Dieses Code-Snippet war die einzige funktionierende Lösung.
quelle
Ich hatte das gleiche Problem in der letzten halben Stunde ...
Konnte keinen Zombie-Build löschen, der in meiner Pipeline mit mehreren Zweigen ausgeführt wird. Sogar ein Neustart des Servers über die Benutzeroberfläche oder sogar über
sudo service jenkins restart
die Befehlszeile über hat die Ausführung blockiert ... Der Build konnte nicht gestoppt werden ... Er wurde immer wieder angezeigt.Ich war sehr verärgert, aber ... als ich in das Protokoll des Builds schaute, fand ich am Ende des Protokolls etwas Interessantes:
Die rot markierten Teile sind die "frustrierenden Teile" ... Wie Sie sehen, wollte ich den Build immer von der Benutzeroberfläche abbrechen, aber es hat nicht funktioniert ...
Aber es gibt einen Hyperlink mit Text
Click here to forcibly terminate running steps
... (erster grüner) Jetzt habe ich den Link gedrückt ...) Nach der Linkausführung erschien eine Nachricht überStill paused
mit einem anderen LinkClick here to forcibily kill entire build
(zweiter grüner) Nach dem Drücken dieses Links war auch der Build endlich schwierig getötet...Dies scheint also ohne spezielle Plugins zu funktionieren (mit Ausnahme des Build-Plugins für Multibranch-Pipelines selbst).
quelle
tail
anmelden und nur einen Protokoll-Viewer verwenden, um den Link zu erhalten?<a href="#" onclick="new Ajax.Request('[server]/jenkins/job/[pipeline_name]/[job_number]/kill'); return false">Click here to forcibly kill entire build</a>
Ich hatte viele Zombi-Jobs, also habe ich das folgende Skript verwendet:
quelle
Das funktioniert bei mir immer:
Danke an funql.org
quelle
Hatte ich jetzt zweimal das gleiche Problem, bestand das einzige Problem darin, den Tomcat-Server neu zu starten und den Build neu zu starten.
quelle
Ein von mir geschriebenes Dienstprogramm namens jkillthread kann verwendet werden, um jeden Thread in einem Java-Prozess zu stoppen, solange Sie sich bei dem Computer anmelden können, auf dem der Dienst unter demselben Konto ausgeführt wird.
quelle
SEHR EINFACHE LÖSUNG
Der Grund, warum ich dieses Problem sah, war ein falscher
http
Link auf der Seite, stattdessenhttps
sollte der Job gestoppt werden. Alles, was Sie tun müssen, ist, dasonclick
Attribut auf der HTML-Seite wie folgt zu bearbeitenonclick
Attribut, um dessen Wert zu bearbeitens
anhttp
habenhttps
Verwenden Sie den Screenshot als Referenz
quelle
Verwenden der Skriptkonsole unter https: // my-jenkins / script
quelle
Keine dieser Lösungen hat bei mir funktioniert. Ich musste den Computer neu starten, auf dem der Server installiert war. Der nicht zu tötende Job ist jetzt weg.
quelle
Sie können den Job einfach kopieren und den alten löschen. Wenn es keine Rolle spielt, dass Sie die alten Build-Protokolle verloren haben.
quelle
Hier ist, wie ich dieses Problem in der Version
2.100
mit Blue Ocean behoben habessh
in meine Jenkins Boxcd ~/.jenkins
(wo ich Jenkins aufbewahre)cd job/<job_name>/branches/<problem_branch_name>/builds
rm -rf <build_number>
Danach können Sie optional die Nummer in ändern
nextBuildNumber
(ich habe dies getan).Schließlich habe ich jenkins neu gestartet (
brew services restart jenkins
) Dieser Schritt wird offensichtlich unterschiedlich sein, je nachdem, wie Sie Jenkins verwalten und installieren.quelle
Geben Sie die Blue-Ocean-Benutzeroberfläche ein. Versuchen Sie, den Job von dort aus zu stoppen.
quelle