如何在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
相关产品推荐
相关产品推荐

