Nasz serwer Jenkins ma zadanie, które działa od trzech dni, ale nic nie robi. Kliknięcie małego X w rogu nic nie robi, a dziennik wyjściowy konsoli również nic nie pokazuje. Sprawdziłem na naszych serwerach kompilacji i wygląda na to, że zadanie w ogóle nie działa.
Czy istnieje sposób, aby powiedzieć Jenkinsowi, że praca została „wykonana”, edytując plik, blokadę lub coś w tym rodzaju? Ponieważ mamy dużo zadań, tak naprawdę nie chcemy restartować serwera.
Odpowiedzi:
Idź do "Manage Jenkins"> "Script Console", aby uruchomić skrypt na serwerze i przerwać zawieszony wątek.
Możesz pobrać wszystkie wątki na żywo
Thread.getAllStackTraces()
i przerwać ten, który się zawiesił.AKTUALIZACJA:
Powyższe rozwiązanie wykorzystujące wątki może nie działać na nowszych wersjach Jenkinsa. Aby przerwać zamrożone rurociągi, odwołaj się do tego rozwiązania (autorstwa alexandru-bantiuc ) i uruchom:
źródło
t -> println(t.getName());
t.getName()=="SOME NAME"
?t.stop
zamiast tego musiałem zadzwonić :Thread.getAllStackTraces().keySet().each() { t -> if (t.getName()=="YOUR THREAD NAME" ) { println(“Found, stopping now… “); t.stop(); } }
Miałem też ten sam problem i naprawiłem go przez Jenkins Console.
Przejdź do „Manage Jenkins”> „Script Console” i uruchom skrypt:
Musisz tylko określić JobName i JobNumber.
źródło
Jenkins.instance.getItemByFullName("JobName").getBuildByNumber(JobNumber).delete();
po wykonaniu tego i siebie nawzajem, Jenkins zrestartował, kompilacja zombie w końcu zniknęła.finish
w AbstractBuild ani FreeSyleBuild ani 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
Jeśli masz Multibranch Pipeline -job (a jesteś administratorem Jenkinsa), użyj w konsoli skryptów Jenkins tego skryptu:
Z https://issues.jenkins-ci.org/browse/JENKINS-43020
Jeśli nie masz pewności, jaka jest pełna nazwa (ścieżka) zadania, możesz użyć następującego fragmentu kodu, aby wyświetlić pełną nazwę wszystkich elementów:
Od https://support.cloudbees.com/hc/en-us/articles/226941767-Groovy-to-list-all-jobs
źródło
Do tego zadania używam wtyczki Monitoring . Po instalacji wtyczki
Wyszukaj zawieszoną nazwę stanowiska
Nazwa wątku zaczyna się w ten sposób
Executor #2 for master : executing <your-job-name> #<build-number>
Kliknij czerwony, okrągły przycisk po prawej stronie w tabeli wiersza, w którym znajduje się Twoja wybrana praca
źródło
Kiedyś napotkałem kompilację, której nie można zatrzymać za pomocą „konsoli skryptów”. W końcu rozwiązałem problem, wykonując następujące czynności:
źródło
Pierwsze proponowane rozwiązanie jest dość bliskie. Jeśli użyjesz stop () zamiast przerywania (), zabije to nawet uciekające wątki, które działają bez końca w groovym skrypcie systemowym. To zabije każdą kompilację, która działa do pracy. Oto kod:
źródło
contains
tutaj jest niepoprawne i niebezpieczne - jeśli nazwa twojego zadania to „Uruchom testy”, zabije również wszystkie zadania o nazwie „Uruchom testy - integracja”, „Uruchom testy - jednostka” itp. Każdy, kto korzysta z tej funkcji, będzie musiał uważać, aby tego nie robić nieoczekiwanie zakończyć niepowiązane praceJeśli masz niepowstrzymane zadanie Pipeline, wypróbuj następujące rozwiązania:
Jenkins zda sobie sprawę, że zadanie powinno zostać zakończone i zatrzyma kompilację
źródło
Bez konieczności korzystania z konsoli skryptu lub dodatkowych wtyczek, można po prostu przerwanie kompilacji wpisując
/stop
,/term
lub/kill
po kompilacji URL w przeglądarce.Cytując dosłownie z powyższego linku:
źródło
Wtyczka Build-Timeout może się przydać w takich przypadkach. Jeśli zajmie to zbyt dużo czasu, automatycznie zabije zadanie.
źródło
Myślę, że jest już za późno, aby odpowiedzieć, ale moja pomoc niektórym ludziom.
Nie mam wystarczającej reputacji, aby publikować zdjęcia.
Mam nadzieję, że to pomoże
źródło
Top odpowiedź niemal pracował dla mnie, ale miałem jeden poważny problem: Miałem bardzo dużą liczbę (~ 100) miejsc pracy zombie ze względu na szczególnie słabo timed Jenkins restarcie, więc ręcznie znalezienie nazwę stanowiska i numer kompilacji każdego i każda praca zombie, a potem ręczne zabicie ich było niewykonalne. Oto jak automatycznie znalazłem i zabiłem zadania zombie:
Ten skrypt przegląda wszystkie kompilacje wszystkich zadań i używa go
getResult().equals(null)
do określenia, czy zadanie zostało zakończone. Kompilacja, która znajduje się w kolejce, ale nie została jeszcze uruchomiona, nie zostanie poddana iteracji (ponieważ tej kompilacji nie będziejob.builds
), a ukończona już kompilacja zwróci coś innego niżnull
forbuild.getResult()
. Legalnie działająca praca będzie również miała wynik kompilacjinull
, więc przed uruchomieniem tego upewnij się, że nie masz uruchomionych zadań, których nie chcesz zabijać.Wiele zagnieżdżonych pętli jest głównie niezbędnych do odkrycia każdej gałęzi / PR dla każdego repozytorium w projekcie Multibranch Pipeline; jeśli nie używasz potoków wielobranżowych, możesz po prostu zapętlić wszystkie swoje zadania bezpośrednio za pomocą czegoś takiego jak
Jenkins.instance.getItems().each
.źródło
runningBuilds = Jenkins.instance.getView('All').getBuilds().findAll() { it.getResult().equals(null) } runningBuilds.each { branch->branch.doKill() }
Sprawdziłem źródło Jenkinsa i wydaje się, że to, co próbuję zrobić, jest niemożliwe, ponieważ wydaje się, że zatrzymanie pracy jest wykonywane przez przerwanie wątku. Nie mam pojęcia, dlaczego praca się wisi ..
Edytować:
Możliwe przyczyny niepowstrzymanej pracy:
źródło
W takich przypadkach zwykle używam jenkins-cli. Możesz pobrać jar ze strony
http://your-jenkins-host:PORT/cli
. Następnie uruchomićInformacje pomocnicze:
Możesz także przekazać szereg kompilacji, takich jak
350:400
. Ogólna pomoc dostępna przez bieganieKontekst poleceń pomoc dla
delete-builds
oźródło
Odpowiedź Alexandru Bantiuca działała dobrze, gdy zatrzymałem kompilację, ale moi wykonawcy nadal byli zajęci. Byłem w stanie wyczyścić status zajętości executora za pomocą następujących poleceń
źródło
Wystąpił ten sam problem, ale nie było wątku stosu. Usunęliśmy zadanie, używając tego fragmentu kodu w konsoli Jenkins. Zastąp nazwę stanowiska i numer budynku swoim.
źródło
Niedawno natknąłem się na węzeł / agenta, w którym jeden wykonawca był zajęty przez kilka dni kompilacją „X” zadania potoku, chociaż strona z zadaniami twierdziła, że kompilacja „X” już nie istnieje (została odrzucona po 10 kolejnych kompilacjach (!), Ponieważ skonfigurowane w zadaniu potoku). Zweryfikowano, że na dysku: kompilacja „X” naprawdę zniknęła.
Rozwiązanie: to agent / węzeł błędnie zgłosił, że zajęty executor był zajęty wykonywaniem kompilacji „X”. Przerwanie wątku tego executora natychmiast go zwolniło.
Uwzględniono inne odpowiedzi:
Thread.getAllStackTraces()
: brak pasującego wątku.getBuildByNumber()
: nie mają zastosowania, ponieważ kompilacji już nie było!Aktualizacja:
Ponownie doświadczyłem podobnej sytuacji, w której Executor był zajęty przez wiele dni (wciąż istniejącą) ukończoną budową rurociągu. Ten fragment kodu był jedynym działającym rozwiązaniem.
źródło
Miałem ten sam problem przez ostatnie pół godziny ...
Nie udało się usunąć kompilacji zombie działającej w moim potoku wielooddziałowym. Nawet serwer restartował się przez interfejs użytkownika, a nawet z wiersza poleceń,
sudo service jenkins restart
blokował wykonanie ... Budowanie nie dało się zatrzymać ... Zawsze się powtarzało.Byłem bardzo zirytowany, ale ... przeglądając dziennik kompilacji, znalazłem coś ciekawego na końcu dziennika:
Części zaznaczone na czerwono to „frustrujące części” ... Jak widać, zawsze chciałem przerwać kompilację z interfejsu użytkownika, ale to nie działało ...
Ale jest hiperłącze z tekstem
Click here to forcibly terminate running steps
... (pierwszy zielony) Teraz nacisnąłem link ...) Po uruchomieniu linkuStill paused
pojawił się komunikat o kolejnym LinkClick here to forcibily kill entire build
(drugi zielony) Po wciśnięciu tego linku również budowanie w końcu było trudne zabity...Wydaje się więc, że działa to bez żadnych specjalnych wtyczek (z wyjątkiem samej wtyczki kompilacji multibranch-pipeline).
źródło
tail
lub dziennika, aby uzyskać link?<a href="#" onclick="new Ajax.Request('[server]/jenkins/job/[pipeline_name]/[job_number]/kill'); return false">Click here to forcibly kill entire build</a>
Miałem wiele zadań zombi, więc użyłem następującego skryptu:
źródło
To działa dla mnie za każdym razem:
Dzięki funql.org
źródło
Dwa razy zdarzyło mi się ten sam problem, jedyną naprawą sofy było ponowne uruchomienie serwera Tomcat i ponowne uruchomienie kompilacji.
źródło
Narzędzie, które napisałem o nazwie jkillthread, może zostać użyte do zatrzymania dowolnego wątku w dowolnym procesie Java, o ile możesz zalogować się do maszyny z uruchomioną usługą na tym samym koncie.
źródło
BARDZO PROSTE ROZWIĄZANIE
Powodem, dla którego widziałem ten problem, był nieprawidłowy
http
link na stronie zamiast tego,https
który powinien zatrzymać pracę. Wszystko, co musisz zrobić, to edytowaćonclick
atrybut na stronie html, wykonując następujące czynnościonclick
atrybut, aby edytować jego wartośćs
dohttp
miećhttps
Użyj zrzutu ekranu w celach informacyjnych
źródło
Używając konsoli Script pod adresem https: // my-jenkins / script
źródło
Żadne z tych rozwiązań nie działało dla mnie. Musiałem zrestartować komputer, na którym został zainstalowany serwer. Nie można już zabić pracy.
źródło
Możesz po prostu skopiować zadanie i usunąć stare. Jeśli nie ma znaczenia, że utraciłeś stare dzienniki kompilacji.
źródło
Oto jak rozwiązałem ten problem w wersji
2.100
z Blue Oceanssh
do mojego Jenkinsacd ~/.jenkins
(gdzie trzymam Jenkinsa )cd job/<job_name>/branches/<problem_branch_name>/builds
rm -rf <build_number>
Następnie możesz opcjonalnie zmienić numer w
nextBuildNumber
(zrobiłem to).Wreszcie zrestartowałem jenkins (
brew services restart jenkins
). Ten krok będzie oczywiście inny w zależności od tego, jak zarządzasz i instalujesz Jenkins.źródło
Wejdź do interfejsu użytkownika błękitnego oceanu. Spróbuj od tego momentu zatrzymać pracę.
źródło