2017-03-02 17 views
6

'daki boruya uymuyor gibi görünüyor. 2.32.2 sürümündeki bir pipelineda Jenkinsfile kullanıyorum.Jenkins pipeline sh, shell komutu

Çeşitli nedenlerden dolayı, sürüm dizesini pompadan çıkarmak istiyorum. Maven yardım eklentisini eklemek ve değerlendirmek zorunda kalmamayı umuyordum.

Boruları kullanan ve yürütücünün jenkins çalışma alanındaki komut satırında çalışan pompayı çıkarmak için hızlı bir şekilde küçük bir ifadeyle geldim.

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

Muhtemelen optimize ama boru hattı borulu sh komutları üzerinde Başarısız görünen anlamak istiyorum olabilir. Çeşitli dize formatları ile oynadım ve şu anda bir dolar eğik çizgi kullanıyordum. Komut dizesinin kolay çıkış için izin vermek için aşağıdaki gibi

boru hattı adım görünüyor: Ben içine kablolu komutlar ayıran gibi görünüyor şu konsol çıktısını almak Jenkins boru hattı çalıştırmak

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}" 
} 

ayrı komutlar:

[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 

orada düzgün bir jenkinsfile borulu içinde komutları nasıl kullanılacağı konusunda herhangi bir rehberlik?

cevap

4

Sonunda biraz düşündüm ve boru alt kabuklarının muhtemelen soruna neden olduğunu anladım. Ben eval kötülükleri bazı biliyorum ama bir eval bu wrappping sona erdi: Eğer basit bir yol istiyorsanız,

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

Ben de Jenkins boru hattının içinde değil ama yan not olarak borunun kullanımı ile mücadele ediyorum burada başka bir yazı bulunan bir çok temiz biri, bir maven pom versiyonunu çıkarmak ve ben kullanıyorum o:

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

Artık böyle bir şeye gerek yok. 'ReadMavenPom' adımını kullanarak cevabımı görün. – StephenKing

+0

Harika! Bunu hemen kullanacağım. Teşekkürler – mattvbv

0

pipeline-utility-steps eklenti nowaday:

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

verir s sürümüne aşağıdaki gibi erişim sağlayan bir readMavenPom adımını içerir:

version = readMavenPom.getVersion() 
+0

Teşekkürler, son hedefi başarmak için harika bir işaretçi, ama genellikle boruların sh adımlarındaki davranışını merak ettim. Alt-bombardıman hakkında düşünmek için bir dakika sürdü ve dokularda bahsettiğim bir tuğlayı değil ya da hızlı ve kirli sh adımlarını yapmaya çalıştığımda hemen bana geldi. – sporkthrower

İlgili konular