W ramach procesu kompilacji uruchamiam polecenie git commit jako krok wykonywania powłoki. Jeśli jednak nie ma zmian w obszarze roboczym, Jenkins kończy się niepowodzeniem kompilacji. Dzieje się tak, ponieważ git zwraca kod błędu, gdy nie ma żadnych zmian do zatwierdzenia. Chciałbym albo przerwać kompilację, albo po prostu oznaczyć ją jako niestabilną, jeśli tak jest. Jakieś pomysły?
132
Odpowiedzi:
Aby zatrzymać dalsze wykonywanie w przypadku niepowodzenia polecenia :
command || exit 0
Aby kontynuować wykonywanie, gdy polecenie nie powiedzie się:
command || true
źródło
|| exit 0
w pierwszym przypadku, jeślicommand
zwróci false, wykonanie zostanie zatrzymane. To powiedziawszy, druga opcja jest bardzo pomocna!exit 0
ponieważ każdy niezerowy kod zakończenia zakończy się niepowodzeniem podczas kompilacji.Jenkins
/bin/sh -xe
domyślnie wykonuje kroki budowania powłoki przy użyciu .-x
oznacza wydrukowanie każdego wykonanego polecenia.-e
oznacza wyjście z niepowodzeniem, jeśli któraś z komend w skrypcie nie powiodła się.Więc myślę, że to, co wydarzyło się w twoim przypadku, to wyjście polecenia git z 1, a z powodu domyślnego
-e
parametru powłoka pobiera kod wyjścia inny niż 0, ignoruje resztę skryptu i oznacza krok jako niepowodzenie. Możemy to potwierdzić, jeśli możesz opublikować tutaj skrypt kroku kompilacji.W takim przypadku możesz spróbować ustawić
#!/bin/sh
tak, aby skrypt był wykonywany bez opcji; lub wykonajset +e
lub cokolwiek podobnego w górnej części etapu kompilacji, aby zastąpić to zachowanie.Edytowano: Inną rzeczą, na którą należy zwrócić uwagę, jest to, że ostatnie polecenie w skrypcie powłoki zwraca kod inny niż 0 , cały krok kompilacji nadal będzie oznaczony jako niepowodzenie nawet przy tej konfiguracji. W takim przypadku możesz po prostu umieścić
echo
polecenie na końcu, aby tego uniknąć.Kolejne powiązane pytanie
źródło
Jeśli nie ma nic do przekazania, git zwraca kod zakończenia 1. Wykonaj krok budowania powłoki jest odpowiednio oznaczany jako nieudany. Możesz użyć instrukcji OR || (podwójna rura).
Oznacza to, że wykonuje drugi argument, jeśli pierwszy się nie powiódł (zwrócony kod zakończenia> 0). Druga komenda zawsze zwraca 0. Gdy nie ma nic do wciśnięcia (status wyjścia 1 -> wykonanie drugiej komendy) echo zwróci 0 i krok budowy będzie kontynuowany.
Aby oznaczyć kompilację jako niestabilną, możesz użyć kroku po kompilacji Jenkins Text Finder. Może przejść przez wyjście konsoli, dopasować wzorzec (twoje echo) i oznaczyć kompilację jako niestabilną.
źródło
Istnieje inny płynny sposób, aby powiedzieć Jenkinsowi, aby nie zawiódł. Możesz odizolować swoje zatwierdzenie w kroku budowania i ustawić powłokę tak, aby nie zawodziła:
źródło
set -e
po poleceniu, które chcesz uruchomić niezależnie od kodu zakończenia. W przeciwnym razie możesz zakończyć wykonywanie poleceń, których nie zamierzasz. Chciałem sam obsłużyć ten błąd, więc zrobiłem coś takiego: `set + e commit -m" bla "EXIT_CODE =" $ {?} "Set -e # obsługa logiki koduJenkins określa powodzenie / niepowodzenie kroku na podstawie wartości zwracanej kroku. W przypadku powłoki powinien to być zwrot ostatniej wartości. Zarówno w przypadku powłok Windows CMD, jak i (POSIX) Bash powinno być możliwe ustawienie wartości zwracanej ręcznie, używając
exit 0
jako ostatniego polecenia.źródło
exit 0
z "wykonaj polecenie wsadowe systemu Windows" w wielu kompilacjach na mojej instalacji Windows Jenkins i działa zgodnie z oczekiwaniami. Coś innego musi się dziać. Czy możesz opublikować odpowiednią część dziennika konsoli?#!/bin/sh -xv
polega na wykonaniu powłoki, która powoduje zatrzymanie skryptu w przypadku napotkania jakiegokolwiek błędu.Udało mi się to uruchomić, korzystając z odpowiedzi znalezionej tutaj:
Jak nic nie popełnić bez błędu?
źródło
git diff
polecenie, a jeśli to się nie powiedzie, wykonajgit commit
polecenie. Zasadniczo wykonuje zatwierdzenie tylko wtedy, gdygit diff
znaleziono coś do zatwierdzenia. Jednak @jwernerny odpowiedź była poprawna, że powinieneś być w stanie dodaćexit 0
jako ostatnią instrukcję do dowolnego skryptu, aby Jenkins potraktował to jako sukces. Przychodzi mi do głowy jeden scenariusz, w którym to by się nie udało, gdybyś wykonywał krok powłoki Linuksa, ale w Batch to powinno zawsze działać./bin/sh -xe
jak wspomniano tutaj (w środku). Możesz więc spróbować umieścić#!/bin/bash
lub wykonaćset +e
krok kompilacji, aby nadpisać to zachowanie, które będzie kontynuowało resztę kroku, nawet jedno polecenie wewnątrz wyjścia z kodem innym niż 0Na (bardziej ogólne) pytanie w tytule - aby zapobiec niepowodzeniu Jenkinsa, możesz zapobiec wyświetlaniu kodu zakończenia 1. Przykład dla polecenia ping:
A teraz możesz np. Uzyskać wynik polecenia ping:
Oczywiście zamiast
ping ...
Możesz użyć dowolnego polecenia (w tymgit commit
.źródło
https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script
jeśli włączysz właściwość returnStatus: true, to powrót powłoki jest ignorowany.
źródło
Możesz użyć wtyczki Text-Finder . Pozwoli ci to sprawdzić konsolę wyjściową pod kątem wybranego wyrażenia, a następnie oznaczyć kompilację jako
Unstable
.źródło
W przypadku wielu poleceń powłoki ignoruję błędy, dodając:
set +e commands true
źródło
Jeśli umieścisz te polecenia w bloku powłoki:
Twoja kompilacja zostanie oznaczona jako niepowodzenie (co najmniej 1 niezerowy kod zakończenia), więc możesz dodać (set + e), aby ją zignorować:
nie zawiedzie. Jednak to się nie powiedzie nawet z (set + e) na miejscu:
ponieważ ostatnie polecenie powłoki musi zakończyć się z wartością 0.
źródło
Poniższe działa dla Mercurial tylko wtedy, gdy są zmiany. Tak więc kompilacja kończy się niepowodzeniem tylko wtedy, gdy zatwierdzanie nie powiedzie się.
źródło
Kolejna odpowiedź z kilkoma wskazówkami może być pomocna dla kogoś:
pamiętaj, aby oddzielić polecenia następującą regułą :
polecenie1 && polecenie2 - oznacza, że polecenie2 zostanie wykonane tylko w przypadku powodzenia polecenia1
polecenie1 ; polecenie2 - oznacza, że polecenie 2 zostanie wykonane pomimo wyniku polecenia 1
na przykład:
zostanie pomyślnie wykonany z poleceniami
set -e
iecho 0
, jeśli sięgmake test
nie powiodły (testy nie powiodły się), podczas gdy następujący kod zostanie wycięty:trochę źle, a polecenia
set -e
iecho 0
in&& gmake test && set -e && echo 0
zostaną pominięte wraz zprintln run_tests
instrukcją, ponieważ failedgmake test
spowoduje przerwanie kompilacji Jenkinsa. Aby obejść ten problem, możesz przełączyć sięreturnStatus:true
, ale wtedy przegapisz dane wyjściowe polecenia.źródło
Ta odpowiedź jest poprawna, ale nie określa
|| exit 0
lub nie|| true
jest umieszczana w poleceniu powłoki . Oto bardziej kompletny przykład:Powyższe zadziała, ale poniższe zawiodą:
Być może dla innych jest to oczywiste, ale zmarnowałem dużo czasu, zanim zdałem sobie z tego sprawę.
źródło