Mam coś takiego na Jenkinsfile (Groovy) i chcę zapisać stdout i kod wyjścia w zmiennej, aby móc później wykorzystać te informacje.
sh "ls -l"
Jak mogę to zrobić, tym bardziej, że wydaje się, że nie da się tak naprawdę uruchomić żadnego fajnego kodu wewnątrz Jenkinsfile
?
Odpowiedzi:
Najnowsza wersja
sh
kroku potoku pozwala wykonać następujące czynności;Inną funkcją jest
returnStatus
opcja.Te opcje zostały dodane na podstawie tego problemu.
Zobacz oficjalną dokumentację dla
sh
komendy.źródło
WorkflowScript: 97: Expected a step @ line 97, column 17.
script
bloku kroków. jenkins.io/doc/book/pipeline/syntax/#declarative-stepsObecna wersja Pipeline natywnie obsługuje
returnStdout
ireturnStatus
, które umożliwiają uzyskanie danych wyjściowych lub statusu zsh
/bat
steps.Przykład:
Oficjalna dokumentacja .
źródło
script { }
krok.szybka odpowiedź brzmi:
Myślę, że istnieje żądanie funkcji, aby móc uzyskać wynik kroku sh, ale o ile wiem, obecnie nie ma innej opcji.
EDYTOWAĆ: JENKINS-26133
EDYCJA 2: Nie jestem do końca pewien, która wersja, ale kroki sh / bat mogą teraz zwrócić standardowe wyjście, po prostu:
źródło
Jeśli chcesz uzyskać standardowe wyjście ORAZ wiedzieć, czy polecenie się powiodło, czy nie, po prostu użyj
returnStdout
i umieść je w module obsługi wyjątków:potok skryptowy
wynik :
Niestety hudson.AbortException nie ma żadnej użytecznej metody uzyskania tego statusu wyjścia, więc jeśli wymagana jest rzeczywista wartość, musisz ją przeanalizować z komunikatu (ugh!)
W przeciwieństwie do Javadoc https://javadoc.jenkins-ci.org/hudson/AbortException.html kompilacja nie kończy się niepowodzeniem, gdy ten wyjątek zostanie przechwycony. Kończy się niepowodzeniem, gdy jest zostanie złapany!
Aktualizacja: Jeśli chcesz również otrzymać wynik STDERR z polecenia powłoki, Jenkins niestety nie obsługuje poprawnie tego typowego przypadku użycia. Bilet na 2017 rok JENKINS-44930 na rok utknął w stanie upartego ping-ponga, nie czyniąc postępów w kierunku rozwiązania - prosimy o dodanie do niego opinii.
Co do rozwiązania teraz , nie może być kilka możliwych rozwiązań:
a) Przekieruj STDERR do STDOUT
2>&1
- ale to od Ciebie zależy, czy parsujesz to z głównego wyjścia, ale nie dostaniesz wyjścia, jeśli polecenie się nie powiedzie - ponieważ jesteś w procedurze obsługi wyjątków.b) przekieruj STDERR do pliku tymczasowego (którego nazwę przygotujesz wcześniej)
2>filename
(ale pamiętaj, aby wyczyścić plik później) - tj. główny kod staje się:c) Idź w drugą stronę,
returnStatus=true
zamiast tego ustaw , zrezygnuj z procedury obsługi wyjątków i zawsze przechwytuj dane wyjściowe do pliku, tj .:Uwaga: powyższy kod jest specyficzny dla Uniksa / Linuksa - Windows wymaga zupełnie innych poleceń powłoki.
źródło
to przykładowy przypadek, który, jak sądzę, ma sens!
źródło
Dla tych, którzy potrzebują użyć danych wyjściowych w kolejnych poleceniach powłoki, a nie groovy, można zrobić coś takiego:
Uważam, że przykłady kodu maven są całkiem przydatne.
źródło
Najprostszym sposobem jest użycie w ten sposób
my_var=`echo 2` echo $my_var
wyjście: 2zauważ, że to nie jest proste pojedynczy cytat to powrót cytatu (`).
źródło
sh
innym, w przeciwnym razie ludzie mogliby pomyśleć, że jest świetny, szczególnie jeśli nie znają skryptów bash. Właśnie wypróbowałem to na Jenkins, używającls -l
zamiastecho 2
i to działa. Tak naprawdę wcześniej korzystałem z tego podejścia, ale szukałem alternatywy, ponieważ nie jest ona zbyt wiarygodna. Mam wyjście bardziej złożonego polecenia przechwyconego na standardowej powłoce w ten sposób, ale po przeniesieniu do Jenkinsash
zmienna nie zawiera niczego, z nieznanego powodu.