我在2.32.2版的管道中使用Jenkinsfile。
由于各种原因,我想从pom中提取版本字符串。我希望我不必添加Maven帮助插件并使用评估。
我很快想到了一个sed表达式,使它脱离使用管道的pom,并在执行程序的jenkins工作区中的命令行上工作。
$ 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}" }
在jenkins管道中运行时,我得到以下控制台输出,其中似乎将管道命令分成了单独的命令:
[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中正确使用管道命令的任何指导?
我终于考虑了一下,意识到管道子壳可能是造成此问题的原因。我知道评估的一些弊端,但最终我将其总结为评估:
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}" }