如何在Jenkins的curl多引号SH脚本中使用环境变量?
解决Jenkins sh步骤中curl多引号参数里环境变量未渲染的问题
当你在Jenkins Pipeline的sh步骤中执行curl请求Slack Webhook时,若text字段里的Jenkins环境变量(如${env.JOB_BASE_NAME})未被解析,直接以原变量名显示,本质是引号使用方式阻止了Jenkins的变量插值。以下是几种可行的解决方法:
方法1:使用双引号脚本块(推荐)
用三个双引号(""")包裹整个shell脚本,Jenkins会优先解析内部的环境变量,再传递给shell执行。注意JSON内部的双引号无需额外转义(除非和外层引号冲突):
sh """ curl -X POST -H 'Content-type: application/json' --data '{ "text": "构建任务 ${JOB_BASE_NAME} 已完成,构建号:${BUILD_NUMBER}" }' https://hooks.slack.com/services/XXX/XXX/XXX """
这里${JOB_BASE_NAME}和${BUILD_NUMBER}会被Jenkins替换为实际的任务名和构建号,再生成完整的curl命令。
方法2:字符串拼接变量(单引号脚本块场景)
如果必须使用单引号包裹sh脚本,可以通过字符串拼接的方式将Jenkins变量嵌入命令中:
sh 'curl -X POST -H \'Content-type: application/json\' --data \'{ "text": "构建任务 ' + env.JOB_BASE_NAME + ' 已完成,构建号:' + env.BUILD_NUMBER + '" }\' https://hooks.slack.com/services/XXX/XXX/XXX'
Jenkins会先计算env.JOB_BASE_NAME等变量的值,再拼接成完整的shell命令传递给执行环境。
方法3:用Heredoc简化JSON编写
当JSON内容较复杂时,使用Heredoc可以避免引号转义的麻烦,同时保证变量正常解析:
sh """ curl -X POST -H 'Content-type: application/json' --data @- << EOF { "text": "构建任务 ${JOB_BASE_NAME} 已完成,构建号:${BUILD_NUMBER}", "channel": "#build-notifications" } EOF """
Heredoc通过<< EOF标记输入结束,内部的Jenkins变量会被正常替换,JSON格式也更易维护。
关键注意事项
- Jenkins环境变量在
sh步骤中可直接用${VAR_NAME},无需加env.前缀(加了也生效); - 区分Jenkins变量和Shell变量:Shell变量用
$VAR,Jenkins变量在双引号脚本块中用${VAR_NAME}; - 确保变量在当前Pipeline作用域内可用(如全局变量或当前阶段定义的变量)。
内容的提问来源于stack exchange,提问作者M Tri
相关产品推荐
相关产品推荐

