Golang azure devops pipelines rest API调用禁用管道

z9zf31ra  于 2023-08-01  发布在  Go
关注(0)|答案(1)|浏览(125)

我正在努力解决这个问题。我正在尝试用golang写一个程序来访问azure devops构建管道,寻找一个特定的管道并将其禁用。我创建了一个个人访问令牌,我能够进行身份验证,没有任何问题。但是当我运行我的代码时,我得到以下错误:
第一个月
我的代码看起来像这样:

package main

import (
    "encoding/base64"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "strings"
)

type Pipeline struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
    // Include other relevant fields if needed
}

func main() {
    organization := "myorg"
    project := "project"
    pipelineID := 524
    email := "myemail"
    pat := "mypat"

    url := fmt.Sprintf("https://dev.azure.com/%s/%s/_apis/build/definitions/%d?api-version=6.1", organization, project, pipelineID)

    client := &http.Client{}

    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        fmt.Println("Failed to create request:", err)
        return
    }

    authString := fmt.Sprintf("%s:%s", email, pat)
    encodedAuth := base64.StdEncoding.EncodeToString([]byte(authString))
    req.Header.Set("Authorization", "Basic "+encodedAuth)

    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Failed to get pipeline:", err)
        return
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        fmt.Println("Failed to get pipeline, status code:", resp.StatusCode)
        return
    }

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Failed to read response body:", err)
        return
    }

    fmt.Println("Response body:", string(body))

    // Parse the response body to check if the pipeline is already disabled
    var pipeline Pipeline
    err = json.Unmarshal(body, &pipeline)
    if err != nil {
        fmt.Println("Failed to parse response body:", err)
        return
    }

    if pipeline.ID != pipelineID {
        fmt.Println("Pipeline ID mismatch. Expected:", pipelineID, "Actual:", pipeline.ID)
        return
    }

    // Disable the pipeline
    req, err = http.NewRequest("PUT", url, strings.NewReader(`{
        "enabled": false
    }`))
    if err != nil {
        fmt.Println("Failed to create request:", err)
        return
    }

    req.Header.Set("Authorization", "Basic "+encodedAuth)
    req.Header.Set("Content-Type", "application/json")

    resp, err = client.Do(req)
    if err != nil {
        fmt.Println("Failed to disable pipeline:", err)
        return
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        fmt.Println("Failed to disable pipeline, status code:", resp.StatusCode)
        return
    }

    fmt.Println("Pipeline disabled successfully.")
}

字符串
newRequest GET返回管道的所有细节,响应体显示"id": 524,但由于某种原因,API调用似乎没有找到它,而是返回0。
我一直在看我的代码一遍又一遍,但我不能看到我做错了什么。
在另一边,我试图在postman中执行相同的操作,即使在那里问题也是一样的。
请问有没有人可以帮助我理解我在这里做错了什么?
谢谢你能提供的任何帮助

fwzugrvs

fwzugrvs1#

查看文档:Definitions - Update
建议您使用GET获取现有的构建定义,根据需要修改构建定义,然后使用PUT提交修改后的定义。
在这种情况下,您必须通过以下路径更新json:在这里您可以找到已启用的属性:BuildOption
或者您可以尝试只发送这部分:

{
  "id": 524,
  "options" :
  {
    "enabled": false
  }
}

字符串

相关问题