2017-03-02 141 views
6

我在版本2.32.2的管道中使用Jenkinsfile。Jenkins管道sh似乎並不尊重shell命令中的管道

由於各種原因,我想從pom中提取版本字符串。我希望我不必添加maven幫助插件並使用評估。

我很快想出了一個sed表達式,讓它從使用管道並在執行器上的jenkins工作區中的命令行上工作的pom中解脫出來。

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

這也許可以優化,但我想知道爲什麼管道似乎對管道的sh命令失敗。我玩過各種字符串格式,目前使用的是美元斜槓字符串。

管道一步看起來像下面允許的命令字符串的方便輸出:

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

當詹金斯管道得到以下控制檯輸出它似乎被分離管道命令進入運行單獨的命令:

[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 

有關如何正確使用jenkinsfile中的管道命令的任何指導?

回答

4

我終於想出了一些想法,並意識到管子套可能導致問題。我知道有些EVAL的罪惡,但我結束了在一個eval wrappping這樣的:

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

我還管我詹金斯管道內,但作爲一個側面說明使用掙扎,如果你想有一個簡單的方法提取的Maven POM的版本,這裏是一個非常乾淨的我在另一篇文章發現,我使用:

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

爲您提供:

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

有沒有必要再做這樣的事情。使用'readMavenPom'步驟查看我的答案。 – StephenKing

+0

太棒了!我會立即使用它。謝謝 – mattvbv

0

pipeline-utility-steps插件nowaday s包括一個readMavenPom步驟,允許訪問版本如下:

version = readMavenPom.getVersion() 
+0

謝謝,偉大的指標,以實現最終目標,但我一般對sh步驟中的管道行爲感到好奇。花了我一分鐘的時間去思考sub-shelling,而不是我看到的文檔中提到的或當試圖做快速和骯髒的sh步驟時立即發生的問題。 – sporkthrower