Groovy脚本调用获URL方法后,Terraform模块上传报错:无法解析主机
Terraform Cloud模块版本上传报错:无法解析主机的解决方法
我正尝试在Terraform Cloud中创建模块版本。publishVersion()方法调用API后,响应里包含模块上传URL,也就是该方法返回的data.data.links.upload。但用下方的UPLOAD代码块上传module.tar.gz到这个URL时,系统提示“无法解析主机”。
附带代码:
def publishVersion() { def Payload = versionPayload() def response = httpRequest( customHeaders: [ [ name: "Authorization", value: "Bearer " + env.BEARER_TOKEN ], [ name: "Content-Type", value: "application/vnd.api+json" ] ], httpMode: 'POST', requestBody: "${Payload}", url: "https://app.terraform.io/api/v2/organizations/my-organization/registry-modules/private/my-organization/vnet/provider/versions" ) def data = new JsonSlurper().parseText(response.content) println ("Run Id: " + data.data.links.upload) return data.data.links.upload } def UPLOAD UPLOAD = sh( '''curl \ --header "Content-Type: application/octet-stream" \ --request PUT \ --data-binary @module.tar.gz \ data.data.links.upload ''' )
问题原因
你的curl命令里直接写了data.data.links.upload作为目标地址,但这是Groovy代码中的变量名,shell脚本无法识别这个变量,curl会把它当作主机名去解析,因此触发“无法解析主机”的错误。
解决方法
需要把publishVersion()返回的URL传递给shell脚本,修改后的代码如下:
def publishVersion() { def Payload = versionPayload() def response = httpRequest( customHeaders: [ [ name: "Authorization", value: "Bearer " + env.BEARER_TOKEN ], [ name: "Content-Type", value: "application/vnd.api+json" ] ], httpMode: 'POST', requestBody: "${Payload}", url: "https://app.terraform.io/api/v2/organizations/my-organization/registry-modules/private/my-organization/vnet/provider/versions" ) def data = new JsonSlurper().parseText(response.content) println ("Upload URL: " + data.data.links.upload) return data.data.links.upload } // 先获取上传URL并存储到变量 def uploadUrl = publishVersion() // 执行curl上传,引用变量中的URL def UPLOAD = sh( script: """curl \ --header "Content-Type: application/octet-stream" \ --request PUT \ --data-binary @module.tar.gz \ "${uploadUrl}" """, returnStdout: true )
修改说明
- 先调用
publishVersion()拿到上传URL,赋值给uploadUrl变量 - 在shell脚本中用
"${uploadUrl}"引用这个变量,让curl能正确获取目标地址 - 调整sh命令的写法,用
script:参数指定命令内容,同时添加returnStdout: true(可选,用于捕获命令输出)
内容的提问来源于stack exchange,提问作者green_car
相关产品推荐
相关产品推荐

