Jenkins Pipeline中如何向Shell脚本传递字符串作为标准输入?
Jenkins Pipeline 优雅传递字符串作为Shell标准输入
原代码通过echo '${pullRequestStatusJson}'的方式传递JSON字符串给jq命令,会因为JSON中包含单引号导致Shell语法错误,同时写法冗余不够优雅。可以利用Jenkins Pipeline sh步骤的stdin参数直接传递字符串作为标准输入,彻底解决这个问题。
修正后的完整实现
def getStatusJson() { if (this.statusJson == null) { this.statusJson = slowHttpRequest() } return this.statusJson } def func1() { def json = getStatusJson() return sh( label: 'get PR change-requested state', script: 'jq \'.participants[] | select(.state=="changes_requested") | .state\'', returnStdout: true, stdin: json ).trim() } def func2() { def json = getStatusJson() return sh( label: 'get PR state', script: 'jq \'.state\'', returnStdout: true, stdin: json ).trim() }
关键优化点
- 避免引号冲突:通过
stdin参数直接传递Groovy字符串给Shell命令,无需用echo包裹,彻底规避JSON中特殊字符(单引号、换行等)引发的语法错误 - 简化命令逻辑:将func1中原本的两个jq命令合并为一个,减少管道操作,提升执行效率
- Shell脚本转义注意:用单引号包裹jq命令内容时,内部的单引号需要用反斜杠
\转义;也可以用Groovy的双引号包裹Shell脚本,此时内部的双引号需转义为\"
内容的提问来源于stack exchange,提问作者Gavriel
相关产品推荐
相关产品推荐

