【问题标题】:Update Service Hook in Azure DevOps Using PowerShell使用 PowerShell 更新 Azure DevOps 中的服务挂钩
【发布时间】:2020-06-25 09:23:54
【问题描述】:

想知道是否有人知道如何做到这一点,因为我一直在努力这样做。

我正在尝试编写一个 PowerShell 脚本,该脚本有望更新我们在 Azure DevOps 中设置的任何服务挂钩,从而使它们的状态变为启用状态。偶尔ADO会禁用它们,我认为是由于长时间不活动,这是一种痛苦。

到目前为止,我有以下内容,但我收到一条错误消息

"通知订阅 “2092cfc4-a95b-4800-976e-67ccf9deb4b1”用于服务挂钩订阅 “2e0a69e7-c4aa-44ad-89d7-ca1e3809585e”不再存在。”

我明白这一点,但不确定如何解决。 我确定它存在,因为如果我使用 $uri2,用循环中的 $item 变量之一填充 subscriptionId,然后放入浏览器中,我会得到这样返回的 json,所以它找到它了吗?

我一直在参考此页面上的各种文档: https://docs.microsoft.com/en-us/rest/api/azure/devops/hooks/subscriptions/replace%20subscription?view=azure-devops-rest-5.1

我认为我首先需要获取所有 Web 挂钩订阅的列表,然后遍历每个获取 Id 的订阅,在另一个请求中使用该 Id 来更新服务挂钩。我怀疑问题的一半与我对如何完成的理解有关,如果可能的话,我想我会在这里问。

有没有人做到这一点,或者有一些关于如何更新字段的示例脚本?不确定我是否需要将更多数据传递到正文中。

cls

$User = 'myUser'
$PersonalAccessToken = 'myPatToken'
$base64authinfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f  $User, $PersonalAccessToken)))
$vstsAccount = "myOrgName"

$uri1 = "https://dev.azure.com/$vstsAccount/_apis/hooks/subscriptions?api-version=5.1"

$hooks = Invoke-RestMethod -Method Get -ContentType application/json -Uri $uri1 -Headers @{Authorization=("Basic {0}" -f $base64authinfo)}

foreach ($item in $hooks.value) {

    $body = @{
        "publisherId" = "tfs"
        "eventType" = "$($item.eventType)"
        "resourceVersion" = "1.0"
        "consumerId" = "webHooks"
        "consumerActionId" = "httpRequest"
        "status" = "enabled"
    }

    $bodyJson = $body | ConvertTo-Json

    write-host "current status: $($item.status)"
    write-host "$($item.id)"
    write-host "$($item.eventType)"

    $uri2 = "https://dev.azure.com/$vstsAccount/_apis/hooks/subscriptions/$($item.id)?api-version=5.1"
    write-host $uri2
    Invoke-RestMethod -Method Put -ContentType application/json -Uri $uri2 -Headers @{Authorization=("Basic {0}" -f $base64authinfo)} -Body $bodyJson
    
}

【问题讨论】:

    标签: powershell api azure-devops webhooks azure-devops-rest-api


    【解决方案1】:

    使用 PowerShell 在 Azure DevOps 中更新服务挂钩

    我可以用您的请求正文重现此问题。

    那是因为我们在请求正文中丢失了一些基本参数:

    从上图中可以看出,如果我注释掉参数projectId,那么我会得到和你一样的错误。

    根据REST API Subscriptions - Replace Subscription的样例,我们可以得到请求体:

    {
      "publisherId": "tfs",
      "eventType": "build.complete",
      "resourceVersion": "1.0-preview.1",
      "consumerId": "webHooks",
      "consumerActionId": "httpRequest",
      "publisherInputs": {
        "buildStatus": "Failed",
        "definitionName": "MyWebSite CI",
        "projectId": "6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c"
      },
      "consumerInputs": {
        "url": "https://myservice/myhookeventreceiver"
      }
    }
    

    因此,我们可以使用此请求正文来调用 REST API。

    注意:

    • 在您的请求正文中使用 : 而不是 =
    • 在请求正文中替换与您的订阅匹配的值,并根据您的需要添加其他参数。

    另外,我看到你使用foreach来更新所有订阅,但是你需要特别注意的是不是所有订阅的publisherId,@987654333 @、consumerActionId 是一样的。批量修改时要特别注意。

    测试结果:

    希望这会有所帮助。

    【讨论】:

    • 太棒了,我以为会是这样,但不确定。你已经给了我所有我现在需要修复的信息,所以再次感谢。我将进行所需的更改并使其正常工作。
    • 很高兴知道对您有帮助,您能Accept it as an Answer。这可能对阅读此主题的其他社区成员有益,我们可以关闭此主题,谢谢
    • 当然,我认为我做对了,点击绿色对勾:)
    猜你喜欢
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多