spo*_*wer 14 pipe subshell jenkins jenkins-pipeline
我在版本2.32.2的管道中使用Jenkins文件.
由于各种原因,我想从pom中提取版本字符串.我希望我不必添加maven帮助插件并使用evaluate.
我很快想出了一个小的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}"
}
Run Code Online (Sandbox Code Playgroud)
当在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
Run Code Online (Sandbox Code Playgroud)
关于如何在jenkins文件中正确使用管道命令的任何指导?
Dim*_*zky 10
我知道这种迟来的答案,但是无论你谁需要无需评估的解决方案,你都可以用它/bin/bash -c "script"
来制作管道工程
script {
POM_VERSION = sh(script: "/bin/bash -c 'sed -n \'/<version>/,/<version/p\' pom.xml | head -1 | sed \'s/[[:blank:]]*<\/*version>//g\'\''", returnStdout: true)
echo "${POM_VERSION}"
}
Run Code Online (Sandbox Code Playgroud)
这种方法的唯一问题是hellish escape
这样管道的子壳将由我们的男孩处理/bin/bash -c
我终于对它进行了一些思考,并意识到管道子壳可能导致了这个问题.我知道一些eval的邪恶,但我最终在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}"
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14623 次 |
最近记录: |