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

如何在Jenkins脚本化流水线的input步骤中使用变量作为消息文本

Jenkins脚本化流水线input步骤使用Shell变量实现方案

问题根因

你原有写法中的versionNumber和ancestorVersion是sh步骤启动的子Shell进程内的变量,sh步骤执行完成后子Shell销毁,这两个变量无法直接被Pipeline层面的其他步骤读取,因此input步骤直接引用会取不到对应值。

正确实现方案

通过sh步骤的returnStdout: true参数,将Shell命令的执行结果返回给Pipeline层面的变量,即可在后续input步骤中正常引用。

写法1:分两次获取变量(可读性更高)

stage("Manual Approval"){
    // 获取versionNumber,trim()用于去除输出首尾的换行、空白字符
    def versionNumber = sh(
        script: 'grep -wE -A 2 \'"package": "example0"\'',
        returnStdout: true
    ).trim()
    // 获取ancestorVersion
    def ancestorVersion = sh(
        script: 'grep -wE -A 2 \'"package": "example"\'',
        returnStdout: true
    ).trim()
    
    timeout(time: 120, unit: 'MINUTES') {
        input message: "Do you want to build ver. ${versionNumber} having ver. ${ancestorVersion} as an ancestor?", submitter: 'user1'
    }
}

写法2:单次执行Shell获取两个变量(性能更优)

如果想减少Shell进程启动次数,也可以单次执行多条Shell命令,将结果拼接后拆分:

stage("Manual Approval"){
    def shResult = sh(
        script: '''
            v1=`grep -wE -A 2 '"package": "example0"'`
            v2=`grep -wE -A 2 '"package": "example"'`
            echo "${v1},${v2}"
        ''',
        returnStdout: true
    ).trim().split(',')
    def versionNumber = shResult[0]
    def ancestorVersion = shResult[1]
    
    timeout(time: 120, unit: 'MINUTES') {
        input message: "Do you want to build ver. ${versionNumber} having ver. ${ancestorVersion} as an ancestor?", submitter: 'user1'
    }
}

注意事项

  • 开启returnStdout: true后,Shell的所有标准输出都会作为返回值,不要在对应sh步骤中加多余的打印命令,避免污染变量内容。
  • 如果你使用的是声明式流水线,上述变量定义逻辑需要包裹在script块中才能正常执行。

内容的提问来源于stack exchange,提问作者andrei414

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:51:02