Jak ustawić „killSoftly” dla konkretnego zadania Jenkinsa?

11

Moja kompilacja Jenkins zawiesza się między krokami kompilacji i po kompilacji.

Dane wyjściowe konsoli wskazują, że jest to 6-minutowe oczekiwanie (ale widziałem oczekiwania do jednej godziny):

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

Znalazłem to i to pytania, które mają podobne problemy, a oni mówią, że rozwiązaniem jest ustawienie -DSoftKillWaitSeconds=0w jenkins.xml.

Potrzebuję jednak sposobu, aby ustawić opcję tylko dla określonych zadań, bez bałaganu przy globalnych ustawieniach Jenkinsa (nie chciałbym zadzierać z innymi projektami).

EDYTOWAĆ:

Gdy ręcznie przerywam zadanie, przed krokiem [CucumberReport] raporty Ogórków są nadal generowane.

Zaznaczono także opcję Przerwij kompilację, jeśli utknęła w polu Środowisko kompilacji, ze strategią No ActivityLimit czasu ustawioną na (Limit czasu sekund = 2).

Kiedy skompiluję projekt z tymi ustawieniami, kompilacja zakończy się niepowodzeniem, a komunikat „Przerwano po 0 sekundach” pokazany w Historii kompilacji, jak poprzednio, ale dane wyjściowe konsoli będą takie same. (Nic się nie zmienia, raporty Ogórka zostaną wygenerowane, ale po pewnym czasie).

Mate Mrše
źródło
Co chcesz osiągnąć za pomocą parametru? Może jest na to łatwiejsze rozwiązanie.
Michael Kemmerzell
Chcę skrócić czas oczekiwania po fazie kompilacji. Jak widać z danych wyjściowych konsoli, pomiędzy krokami kompilacji i po kompilacji jest 6 minut oczekiwania.
Mate Mrše
Czy możesz podać niektóre części swojego rurociągu? Wątpię, żeby Jenkins po prostu utknął - coś tu musi się wydarzyć.
Michael Kemmerzell
Czy możesz sprecyzować, które części potoku byłyby interesujące, abym mógł edytować i udostępniać niektóre, ponieważ nie jestem w stanie udostępnić rzeczywistego kodu?
Mate Mrše
Nie możesz po prostu ustawić timeoutopcji w fajce? Zdecydowanie powinieneś opublikować uproszczoną wersję swojej fajki. Trudno „odgadnąć”, co może być nie tak. Ponadto, to pytanie prawdopodobnie lepiej pasuje do devops.stackexchange.com
tftd

Odpowiedzi:

4

Nie można wybrać wartości specyficznej dla zadaniaSoftKillWaitSeconds (wartość pochodzi z rdzenia Jenkinsa w punkcie, w którym nazwa zadania nie jest znana).

Moje zalecenie to poprawienie obsługi przerywania w samym zadaniu , aby nie zależało od „limitu czasu miękkiego zabicia”. Jeśli korzystasz z systemu uniksowego, możesz to zapewnić, uruchamiając zadanie w nowej grupie procesów ( set -mw bash) i (na przykład) ustawiając odpowiednią pułapkę wyjścia.

Alex O
źródło
Skoro jestem nowy w Jenkins, czy mógłbyś rozwinąć „uruchamianie zadania w nowej grupie procesów (ustaw -m w bash) i (na przykład) ustawianie właściwej pułapki wyjścia”?
Mate Mrše
Nie ma to związku z samą Jenkins. Możesz użyć tego podejścia, jeśli twoje zadanie obejmuje etap kompilacji „Wykonaj powłokę” (lub jeśli możesz to zmienić, aby to zrobiło). Następnie użyj „set -m”, aby utworzyć nową grupę procesów, i użyj pułapki, jak pokazano tutaj, aby upewnić się, że wszystkie procesy w grupie zostaną zabite.
Alex O
3

Używamy wtyczki Build-timeout do zabijania zablokowanych zadań ze strategią timeout ustawioną na No Activitylub Absolute. Dla mnie jest to dobre podejście, gdy używasz projektów freestyle. Powodem, dla którego twoja kompilacja jest „przerywana po 0 sekundach”, jest to, że najprawdopodobniej istnieją niedokończone procesy potomne. Z dokumentacji :

Ponieważ Java pozwala na przerywanie wątków tylko w zestawie ustalonych lokalizacji, w zależności od tego, jak zawiesi się kompilacja, operacja przerwania może nie zadziałać. Na przykład,

  • jeśli Jenkins czeka na zakończenie procesów potomnych, może natychmiast przerwać.
  • jeśli Jenkins utknie w nieskończonej pętli, nigdy nie można go przerwać.
  • jeśli Jenkins wykonuje operacje sieciowe / sieciowe we / wy na maszynie wirtualnej Java (takie jak długa kopia pliku lub aktualizacja SVN), nie można jej przerwać.

Możesz wypróbować strategię bezwzględnego limitu czasu. Możesz zdefiniować zmienną globalną, aby nie powtarzać wartości limitu czasu w zadaniach:

  1. Wybierz „Zarządzaj Jenkins”> „Konfiguruj system”.
  2. Zaznacz „Zmienne środowiskowe” w „Właściwościach globalnych”.
  3. Dodaj nazwę zmiennej środowiskowej = „GLOBAL_TIMEOUT_MINUTES” wartość = „20”.
  4. Przejdź do strony konfiguracji projektu.
  5. Zaznacz „Przerwij kompilację, jeśli utknęła” w „Kompilacji środowiska”.
  6. Wybierz „Absolutne” dla „Strategii limitu czasu”. Oczywiście dotyczy to także innych strategii.
  7. Ustaw „$ {GLOBAL_TIMEOUT_MINUTES}” na „Limit czasu”.
  8. Ustaw limit czasu „Przerwij kompilację”.

Jeśli to nie działa, możesz spróbować zajrzeć do dzienników https: // your-jenkins-server / log lub do zrzutu wątku.
Zawieszenie może być spowodowane nową / starą wersją wtyczki. Spróbuj znaleźć, jakie są niedokończone procesy potomne. Spróbuj wyłączyć akcje po kompilacji jeden po drugim, aby znaleźć tę, która może być przyczyną problemu. Możesz zobaczyć /superuser/1401879/debugging-what-happens-when-a-jenkins-build-u nieoczekiwanie-pauzuje- lub -hangs

KB
źródło
Jednak głosowanie za przydatne informacje nie rozwiązuje mojego problemu. Próbowałem już kompilować limit czasu, ale bez powodzenia.
Mate Mrše