You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 12:52:26