2017-03-02 48 views
6

Używam pliku Jenkins w potoku w wersji 2.32.2.Jenkins potok rur nie wydaje się respektować potoku w komendzie powłoki

Z różnych powodów chcę wyodrębnić ciąg wersji z pom. Miałem nadzieję, że nie będę musiał dodawać wtyczki do pomocy programu i korzystać z funkcji oceny.

Szybko wymyśliłem małą ekspresję sed, aby wydobyć ją z pom, która używa rur i działa na linii poleceń w przestrzeni roboczej Jenkinsa na executorze.

$ sed -n '/<version>/,/<version/p' pom.xml | head -1 | sed 's/[[:blank:]]*<\/*version>//g' 1.0.0-SNAPSHOT

To może być prawdopodobnie zoptymalizowane, ale chcę, aby zrozumieć, dlaczego gazociąg wydaje się być w przypadku braku na rurami sh poleceń. Grałem z różnymi formatami smyczkowymi i obecnie używam smyczkowego slashy.

Etap rurociąg wygląda następująco, aby umożliwić łatwy wyjściu ciąg poleceń:

script { 
    def ver_script = $/sed -n '/<version>/,/<version/p' pom.xml | head -1 | sed 's/[[:blank:]]*<\/*version>//g'/$ 
    echo "${ver_script}" 
    POM_VERSION = sh(script: "${ver_script}", returnStdout: true) 
    echo "${POM_VERSION}" 
} 

Po uruchomieniu w rurociągu jenkins I uzyskać następujące dane wyjściowe konsoli, w którym wydaje się być oddzielenie rurami polecenia do oddzielne polecenia:

[Pipeline] script 
[Pipeline] { 
[Pipeline] echo 
sed -n '/<version>/,/<version/p' pom.xml | head -1 | sed 's/[[:blank:]]*<\/*version>//g' 
[Pipeline] sh 
[FRA-198-versioned-artifacts-44SD6DBQOGOI54UEF7NYE4ECARE7RMF7VQYXDPBVFOHS5CMSTFLA] Running shell script 
+ sed -n /<version>/,/<version/p pom.xml 
+ head -1 
+ sed s/[[:blank:]]*<\/*version>//g 
sed: couldn't write 89 items to stdout: Broken pipe 
[Pipeline] } 
[Pipeline] // script 

Jakieś wskazówki dotyczące prawidłowego korzystania z poleceń wyprowadzonych w pliku jenkinsfile?

Odpowiedz

4

W końcu włożyłem w to trochę uwagi i uświadomiłem sobie, że prawdopodobnie przyczyną problemu są podtypy rur. Znam niektóre zła eval ale skończyło się wrappping to w eval:

script { 
    def ver_script = $/eval "sed -n '/<version>/,/<version/p' pom.xml | head -1 | sed 's/[[:blank:]]*<\/*version>//g'"/$ 
    echo "${ver_script}" 
    POM_VERSION = sh(script: "${ver_script}", returnStdout: true) 
    echo "${POM_VERSION}" 
} 
0

Ja również zmaga się z wykorzystaniem rury wewnątrz mojego jenkins rurociągu ale jak marginesie, jeśli chcesz w prosty sposób wyodrębnić wersji pom maven, tutaj jest bardzo czysty jeden znalazłem w innym poście i że używam:

stage('Preparation') { 
version = getVersion() 
print "version : " + version 
} 
def getVersion() { 
    def matcher = readFile('pom.xml') =~ '<version>(.+)</version>' 
    matcher ? matcher[0][1] : null 
} 

daje:

[Pipeline] echo 
releaseVersion : 0.1.24 
[Pipeline] sh 
+0

Nie ma już potrzeby robienia czegoś takiego. Zobacz moją odpowiedź za pomocą kroku 'readMavenPom'. – StephenKing

+0

Świetnie! Wykorzystam to natychmiast. Dzięki – mattvbv

0

The nowaday pipeline-utility-steps wtyczki s obejmuje etap readMavenPom, który umożliwia dostęp do wersji w następujący sposób:

version = readMavenPom.getVersion() 
+0

Dzięki, świetny wskaźnik do osiągnięcia celu końcowego, ale ogólnie byłem ciekawy zachowania rur w sh steps. Zajęło mi minutę, aby pomyśleć o sub-shelling, a nie gotcha, które widziałem wspomniano w dokumentach lub przyszedł mi do głowy natychmiast, gdy próbowałem zrobić szybkie i brudne kroki sh. – sporkthrower