簡體   English   中英

使用 PowerShell 更新 Azure DevOps 中的服務掛鈎

[英]Update Service Hook in Azure DevOps Using PowerShell

想知道是否有人知道如何做到這一點,因為我一直在努力這樣做。

我正在嘗試組合一個 PowerShell 腳本,該腳本有望更新我們在 Azure DevOps 中設置的任何服務掛鈎,因此它們的狀態變為啟用。 偶爾ADO會禁用它們,我想是由於長時間不活動,這是一種痛苦。

到目前為止,我有以下內容,但我收到一條錯誤消息

“服務掛鈎訂閱“2e0a69e7-c4aa-44ad-89d7-ca1e3809585e”的通知訂閱“2092cfc4-a95b-4800-976e-67ccf9deb4b1”不再存在。”

在此處輸入圖像描述

我明白這一點,但不確定如何解決它。 我確定它存在,因為如果我使用 $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 更新 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來更新所有的Subscriptions ,但是你需要特別注意的是不是所有Subscription的publisherIdconsumerIdconsumerActionId都是一樣的。 批量修改時應特別注意這一點。

測試結果:

在此處輸入圖像描述

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM