jenkins - Jenkins 管道sh似乎不尊重shell命令中的管道

标签 jenkins pipe jenkins-pipeline subshell

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

关于jenkins - Jenkins 管道sh似乎不尊重shell命令中的管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42568201/

相关文章:

svn - 在 Jenkins 中配置 Subversion 插件以使用 1.6 工作副本

maven - 在 Jenkins 中设置 Maven 参数

jenkins - 无法通过 docker 容器执行 ansible playbook

c - 两个 child 在 pipe 里读书

groovy - Groovy 中的字符串插值与 Jenkins 流水线文件不起作用

java - 如何在maven中解决 "failed to execute goal "maven-surefire-plugin :2. 19.1"

对在 shell 中实现多管道感到困惑

c++ - 多次将 cat 命令通过管道传递给 C++ 代码

Jenkins 多分支管道不会修剪已删除的分支

docker - Jenkins Pipeline和Docker插件-基于唯一代理的并发构建