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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:45:49