![](/img/trans.png)
[英]Update build definition using Azure DevOps REST API in PowerShell
[英]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的publisherId
、 consumerId
、 consumerActionId
都是一樣的。 批量修改時應特別注意這一點。
測試結果:
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.