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

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
)

修改说明

  1. 先调用publishVersion()拿到上传URL,赋值给uploadUrl变量
  2. 在shell脚本中用"${uploadUrl}"引用这个变量,让curl能正确获取目标地址
  3. 调整sh命令的写法,用script:参数指定命令内容,同时添加returnStdout: true(可选,用于捕获命令输出)

内容的提问来源于stack exchange,提问作者green_car

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:30:48