Po pierwsze, najedź myszą na szary obszar poniżej. Nie stanowi części odpowiedzi, ale absolutnie należy powiedzieć:
Jeśli masz skrypt powłoki, który sam wykonuje „pobieranie, budowanie, wdrażanie”, to dlaczego używasz Jenkinsa? Rezygnujesz ze wszystkich funkcji Jenkinsa, które sprawiają, że jest tym, czym jest. Równie dobrze możesz mieć crona lub SVN po zatwierdzeniu, które wywołują skrypt bezpośrednio. Kluczowe znaczenie ma samodzielne sprawdzenie przez Jenkinsa SVN. Pozwala uruchamiać kompilacje tylko wtedy, gdy są zmiany (lub na czas lub ręcznie, jeśli wolisz). Śledzi zmiany między kompilacjami. Pokazuje te zmiany, dzięki czemu możesz zobaczyć, która kompilacja była dla którego zestawu zmian. Wysyła e-maile do osób odpowiedzialnych, gdy ich zmiany spowodowały pomyślną lub nieudaną kompilację (ponownie, zgodnie z preferencjami). Wyśle e-maile do osób odpowiedzialnych za poprawianie błędów kompilacji. I coraz więcej. Archiwizacja przez Jenkinsa artefaktów sprawia, że są one również dostępne dla każdej kompilacji bezpośrednio z Jenkinsa. Chociaż nie jest tak istotny jak płatność SVN, jest to ponownie integralna część tego, co sprawia, że jest to Jenkins. To samo z wdrażaniem. Jeśli nie masz jednego środowiska, wdrażanie zwykle odbywa się w wielu środowiskach. Jenkins może śledzić, w jakim środowisku jest wdrażana określona kompilacja (z określonym zestawem zmian SVN), korzystając z promocji. Zrezygnujesz z tego wszystkiego. Wygląda na to, że powiedziano ci „musisz użyć Jenkinsa”, ale tak naprawdę nie chcesz, a robisz to tylko po to, aby odciągnąć szefów od pleców, tylko po to, by zaznaczyć „tak, użyłem Jenkinsa”
Krótka odpowiedź brzmi: kod zakończenia ostatniego polecenia kroku kompilacji wykonania powłoki Jenkin jest tym, co określa powodzenie / niepowodzenie kroku kompilacji . 0
- sukces, anything else
- porażka. Należy zauważyć, że jest to określenie sukcesu / niepowodzenia etapu kompilacji , a nie całego przebiegu zadania . Na powodzenie / niepowodzenie całego przebiegu zadania może dodatkowo wpływać wiele kroków kompilacji oraz czynności i wtyczki po kompilacji.
Wspomniałeś Build step 'Execute shell' marked build as failure
, więc skupimy się tylko na jednym kroku budowy. Jeśli krok budowania powłoki Wykonaj zawiera tylko jedną linię, która wywołuje skrypt powłoki, kod zakończenia skryptu powłoki określi powodzenie / niepowodzenie kroku kompilacji. Jeśli po wykonaniu skryptu powłoki masz więcej wierszy, dokładnie je przejrzyj, ponieważ to one mogą powodować awarię.
Na koniec przeczytaj tutaj Skrypt kompilacji Jenkinsa kończy działanie po wykonaniu testu Google . Nie jest to bezpośrednio związane z twoim pytaniem, ale zwróć uwagę na tę część dotyczącą uruchamiania przez Jenkinsa kroku kompilacji Execute Shell , jako skryptu powłoki z/bin/sh -xe
Te -e
środki, że skrypt będzie opuszczające z niepowodzenia, nawet jeśli tylko 1 komenda nie powiedzie się, nawet jeśli nie sprawdzanie błędów dla tego polecenia (bo wyjść skryptów zanim dojdzie do sprawdzania błędów). Jest to sprzeczne z normalnym wykonywaniem skryptów powłoki, które zwykle wyświetlają komunikat o błędzie dla nieudanego polecenia (lub przekierowują go do wartości null i obsługują w inny sposób) i kontynuują.
Aby to obejść, dodaj set +e
na początku skryptu powłoki.
Ponieważ mówisz, że twój skrypt robi wszystko, co powinien, jest szansa, że niepowodzenie polecenia znajduje się gdzieś na końcu skryptu. Może ostatnie echo? Albo gdzieś kopia artefaktów? Nie widząc pełnego wyniku konsoli, po prostu zgadujemy.
Opublikuj wyjście konsoli uruchomienia zadania, a najlepiej również sam skrypt powłoki, a wtedy możemy powiedzieć dokładnie, która linia nie działa.
Prosta i krótka odpowiedź na Twoje pytanie brzmi
Dodaj następujący wiersz do kroku kompilacji „Wykonaj powłokę”.
Pozwólcie, że wyjaśnię wam teraz powód, dla którego potrzebujemy tego wiersza do zadania budowania „Execute Shell”.
Domyślnie Jenkins bierze,
/bin/sh -xe
a to oznacza,-x
że wypisuje każde polecenie i drugą opcję-e
, która powoduje, że powłoka natychmiast przestaje uruchamiać skrypt, gdy dowolne polecenie kończy się z niezerowym kodem zakończenia (gdy jakiekolwiek polecenie nie powiedzie się).Więc dodając
#!/bin/sh
pozwoli ci wykonać bez opcji.źródło
find . -name 'bower_components' -exec rm {} \;
aw niektórych przypadkach kończy się niepowodzeniem. Dzięki!Moim zdaniem wyłączenie
-e
opcji w Twojej powłoce to naprawdę zły pomysł. Ostatecznie jedno z poleceń w skrypcie zakończy się niepowodzeniem z powodu przejściowych warunków, takich jak brak miejsca na dysku lub błędy sieciowe. Bez-e
Jenkinsa tego nie zauważy i będzie kontynuował szczęśliwie. Jeśli masz skonfigurowany Jenkins do wdrożenia, może to spowodować wypchnięcie złego kodu i wyłączenie witryny.Jeśli masz w swoim skrypcie linię, w której oczekiwana jest awaria, na przykład grep lub find, po prostu dodaj
|| true
na końcu tej linii. To gwarantuje, że ta linia zawsze zwróci sukces.Jeśli chcesz użyć tego kodu zakończenia, możesz przenieść polecenie do instrukcji if:
Lub możesz przechwycić kod powrotu w swojej
||
klauzuli:źródło
Jasne i proste:
Jeśli Jenkins zobaczy, że krok kompilacji (który również jest skryptem) kończy się z kodem niezerowym, kompilacja jest oznaczana czerwoną kulką (= niepowodzenie).
Dlaczego dokładnie tak się dzieje, zależy od twojego skryptu kompilacji.
Napisałem coś podobnego z innego punktu widzenia, ale może i tak pomoże to przeczytać: Dlaczego Jenkins uważa, że moja konstrukcja się powiodła?
źródło
Więc dodając
#!/bin/sh
pozwoli ci wykonać bez opcji.Pomogło mi to również w naprawieniu problemu, w którym wykonywałem skrypt bash z mistrza Jenkinsa na moim niewolniku Linuksa. Po prostu dodanie
#!/bin/bash
powyżej mojego aktualnego skryptu w bloku „Execute Shell” naprawiło mój problem, ponieważ w przeciwnym razie wykonywał on wersję powłoki bash dostarczoną przez git systemu Windows, która dawała błąd.źródło
W Jenkins ver. 1.635, niemożliwe jest pokazanie natywnej zmiennej środowiskowej w ten sposób:
W takim przypadku musisz ustawić go w innej zmiennej.
źródło