Najczystszy sposób na przedwczesne zakończenie pracy Jenkins Pipeline jako sukces?


55

Mam zadanie, które utworzy pliki, chyba że jedna z podawanych wartości odpowiada starszej wartości. Jaki jest najczystszy sposób w Jenkins, aby przerwać lub zakończyć pracę bez tego FAILED? Wyjście jest poprawnym zachowaniem, więc chcę zaznaczyć kompilację SUCCESS.

Skończy się na takim wyrażeniu if;

stage ('Check value') {

     if( $VALUE1 == $VALUE2 ) {
       //if they do match exit as a success, else continue with the rest of the job 
    }

}

Nie chcę rzucać kodu błędu, chyba że może to w jakiś sposób przełożyć się na oznaczenie udanej kompilacji.


1
Po prostu exit 0...
— Tensibai,

Myślałem, że oznacza to porażkę? Jeśli się mylę i potraficie pokazać dokumentację, chętnie przyjmę to jako odpowiedź
— Alex

Cóż, tylko skrypty bash, wyjście 0 oznacza sukces, wyjście niezerowe oznacza niepowodzenie ...
— Tensibai 13.04.17

To nie jest w skrypcie bash, to samo zadanie potoku, więc Groovy. Czy to coś zmienia?
— Alex

W groovy, po prostu spróbuję return 0, na każdym końcu groovy kodu, który nie zgłasza wyjątku, tak myślę. Pozwolę, aby ktoś z większym doświadczeniem w jenkins 2 potwierdził lub
— osłabił

Odpowiedzi:


46

Domyśliłam się. Poza jakimikolwiek etapami (w przeciwnym wypadku zakończy się to sukcesem) wykonaj następujące czynności;

if( $VALUE1 == $VALUE2 ) {
   currentBuild.result = 'SUCCESS'
   return
}

return zatrzyma etap lub węzeł, na którym pracujesz, dlatego tak ważne jest uruchomienie go poza etapem, a ustawienie currentBuild.resultzapobiegnie jego awarii.


po prostu powracający powinien pozostawić kompilację ze statusem wyszarzenia i bez rezultatu ... więc nie do końca taki sam, jak kompilacja zakończona niepowodzeniem.
— zremisował

1
Jak powrócić i pominąć wszystkie pozostałe etapy?
— Jess Bowers

1
@JessBowers polega na tym, gdzie umieścisz fragment kodu. Jeśli zrobisz to na poziomie węzła, a nie na poziomie, zakończy to całe zadanie.
— Alex

4
Pamiętaj, że działa tylko w przypadku potoku skryptowego, a nie deklaratywnego
— kagarlickij

@kagarlickij - Prawidłowe, deklaratywne potoki nie istniały, gdy napisano tę odpowiedź!
— Alex

10

Możesz również użyć błędu, aby wyjść z bieżącego etapu, wtedy nie musisz brać pod uwagę bieżącej hierarchii etapów i podobnych rzeczy:

def autoCancelled = false

try {
  stage('checkout') {
    ...
    if (your condition) {
      autoCancelled = true
      error('Aborting the build.')
    }
  }
} catch (e) {
  if (autoCancelled) {
    currentBuild.result = 'SUCCESS'
    // return here instead of throwing error to keep the build "green"
    return
  }
  // normal error handling
  throw e
}

Ale prowadziłoby to do czerwonego etapu, jeśli błąd wystąpi w danym etapie.

wprowadź opis zdjęcia tutaj

To zależy od twoich wymagań, z którego sposobu chcesz skorzystać.


Jeśli zamierzasz to zrobić w ten sposób, stwórz nową podklasę RuntimeExceptionrzucania zamiast łapania wszystkich wyjątków i sprawdzania flagi
— Michał Mrożek

1

Szczerze mówiąc, nie powinieneś specjalnie używać komendy exit, ale istnieje Wtyczka warunkowa BuildStep, która może osiągnąć ten sam efekt końcowy (kod, który nie działa).

Jeszcze się z tym nie spotkałem, więc nie korzystałem z wtyczki.

Istnieją również warunki warunkowe, które można znaleźć w poprzednim poście Przepełnienie stosu na Jenkins: Jenkins Pipeline Warunkowy krok / etap


1
Chociaż twoja odpowiedź wydaje się być poprawna (nie sprawdziłem jej na żywo, ponieważ znalazłem inne obejście), nie sądzę, aby „Szczerze mówiąc nie powinieneś wychodzić” to dobry sposób na jej rozpoczęcie; oczywiście istnienie tych metod oznacza, że ​​czasami trzeba wyjść.
— Alex

Co byś zasugerował? Przechodzisz na zakończenie? Dodanie kwalifikatora „ogólnie”? Przekazałeś „informację zwrotną”, ale nie jest mi łatwo powiedzieć, jaki jest zamiar lub działanie, bądź mniej zwięzły.
— MrMesees

Poczekaj chwilę. Czy to twoje pytanie? Jeśli tak, TBH nie chciałbyś usłyszeć, że nie powinieneś wychodzić, ale żadna z metod, które sugerowałem, nie zapewnia wyjścia, omijają uruchamianie kodu ... Bezpośrednio wspierają moją pozycję.
— MrMesees

1
Ach, rozumiem, myślę, że źle zinterpretowałem twoje stwierdzenie jako „robienie czegoś, aby zakończyć pracę jest złe” zamiast „nie powinieneś używać dosłownego exitpolecenia” - jeśli tak, przepraszam, to moje nieporozumienie.
— Alex

3
Próbowałem to wyjaśnić, wcale nie trzeba przepraszać, język to kapryśna bestia, szczególnie w Internecie :)
— MrMesees

0

Executor.interrupt(Result)Metoda jest najczystszym, najbardziej bezpośredni sposób udało mi się znaleźć, aby zatrzymać build przedwcześnie i oznaczyć ją jako sukces.

script {
    currentBuild.getRawBuild().getExecutor().interrupt(Result.SUCCESS)
}

Plusy :

  • Działa w potoku deklaratywnym, podobnie jak w skrypcie.
  • Brak prób / łapania lub wyjątków do obsługi.
  • Oznacza etap wywoływania i wszelkie kolejne etapy jako zielone / przekazywanie w interfejsie użytkownika.

Wady :

  • Wymaga szeregu zatwierdzeń skryptu w trakcie procesu, w tym takiego, który jest uważany za niepewny . Zatwierdź i używaj ostrożnie.

Dla mnie to nie działa - wykonywane są kolejne etapy.
— Łukasz K.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.