我有一个通用的jenkinsfile(Jenkins 2.0管道插件),我正在尝试在脚本组件内部运行“嵌套” curl命令:
def v = version()
def envId = environment()
def projectId = projectId()
def APIKey = xxx
sh "curl -H "Content-Type: application/json" -H "X-Octopus-ApiKey: "'$APIKey'" -d '{"ReleaseId":"'$(curl -H "Content-Type: application/json" -H "X-Octopus-ApiKey: "'$APIKey'" -d '{"version":"'$v'", "ProjectId":"'$projectId'", "Environment-Id":"'$envId'"}' http://xxxxx | grep '"Id":' | head -1 | cut -d ':' -f 2 | cut -d '"' -f 2)'", "EnvironmentId":"'$envId'"}' http://xxxxxx"
如您所见,我在curl命令中使用命令替换来传递ReleaseId值。我是否需要使用其他方式来访问curl命令的$()命令替换部分中的变量,例如envId,projectId和APIKey?
从以前的研究中,我将它们的JSON密钥的值包装为“'$ somevar'”格式,但是由于找不到该错误,我得到了标准错误。
谢谢
答案 0 :(得分:0)
您的代码存在的问题是您无法在命令中使用双引号。对于Groovy,除非您使用反斜杠转义双引号,否则传递给sh
命令的字符串将在Content-Type
之前结束。
此外,您还需要转义要由Bash解释的美元符号。 Groovy的字符串插值使用与Bash相同的语法。
我试图修正您的命令。希望我发现了所有问题:
sh "curl -H \"Content-Type: application/json\" -H \"X-Octopus-ApiKey: \"'${APIKey}'\" -d '{\"ReleaseId\":\"'\$(curl -H \"Content-Type: application/json\" -H \"X-Octopus-ApiKey: \"'${APIKey}'\" -d '{\"version\":\"'${v}'\", \"ProjectId\":\"'${projectId}'\", \"Environment-Id\":\"'${envId}'\"}' http://xxxxx | grep '\"Id\":' | head -1 | cut -d ':' -f 2 | cut -d '\"' -f 2)'\", \"EnvironmentId\":\"'${envId}'\"}' http://xxxxxx"
顺便说一句,我将groovy中的变量放在花括号中。在这种情况下,这不是必需的,但我认为这是一个好习惯。