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.

Alex
źródło
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.

Alex
źródło
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ć.

CSchulz
źródło
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

MrMesees
źródło
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.
Ben Amos
źródło
Dla mnie to nie działa - wykonywane są kolejne etapy.
Łukasz K.