Groovy编写Jenkins Pipeline中cURL引用变量的引号问题排查
问题原因
确实是引号使用不当导致的,核心源于Groovy的字符串插值规则:
- Groovy 单引号包裹的普通字符串不支持变量插值,你代码里的
${url}会被原样传给shell,而shell环境中没有定义同名变量,所以实际执行时URL位置为空,就出现了curl提示无URL的报错。
解决方法
有三种常用的修改方案:
方案1:改用双引号包裹sh命令
将sh命令外层的单引号替换为支持变量插值的Groovy双引号,内部的双引号做转义处理即可:
script { url = "https://chat.googleapis.com/v1/spaces/AAAAfF9CGEQ/messages?key=******&token=******" sh "curl -k ${url} -d \"@chat_notification.json\" -XPOST -H \"Content-Type: application/json; charset=UTF-8\"" }
方案2:使用三双引号(推荐,可读性更高)
如果不想处理内部双引号的转义,可以用Groovy的三双引号包裹命令:
script { url = "https://chat.googleapis.com/v1/spaces/AAAAfF9CGEQ/messages?key=******&token=******" sh """ curl -k ${url} -d "@chat_notification.json" -XPOST -H "Content-Type: application/json; charset=UTF-8" """.trim() }
方案3:导出为shell环境变量
也可以将Groovy变量注入到shell执行环境,此时即使使用单引号包裹命令也可以正常读取变量:
script { url = "https://chat.googleapis.com/v1/spaces/AAAAfF9CGEQ/messages?key=******&token=******" sh ''' curl -k "${url}" -d "@chat_notification.json" -XPOST -H "Content-Type: application/json; charset=UTF-8" ''', [env: ["url=${url}"]] }
注意事项
如果URL中包含空格、特殊符号,建议给插值后的URL外层额外套一层双引号,避免shell解析异常,写法为"${url}"。
内容的提问来源于stack exchange,提问作者Matou
相关产品推荐
相关产品推荐

