我试图通过PowerShell调用Azure Rest API来在我的构建管道之一中设置构建的reservedByRelease属性的值。我在终端中收到“找不到页面”错误。我怀疑我准备的URL错误,但不确定在哪里。请帮忙。
要弄清楚URL,我从下面的Build链接(5d6898bb-45ec-463f-95f9-54d49c71752e)中获取了区域ID。 https://docs.microsoft.com/en-us/azure/devops/extend/develop/work-with-urls?view=azure-devops&tabs=http#resource-area-ids-reference
从VSO获得了个性化令牌。
下面是脚本的样子(掩盖了令牌和构建ID):
$orgURL = "https://dev.azure.com"
$personalToken = "*******"
$token = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($personalToken)"))
$header = @{authorization="Bearer $token"}
$areaId = "5d6898bb-45ec-463f-95f9-54d49c71752e"
$orgResourceAreasUrl = [string]::Format("{0}/_apis/resourceAreas/{1}?api-version=5.0-preview.1",$orgURL,$areaId)
$results = Invoke-RestMethod -Uri $orgResourceAreasUrl -Headers $header
$basrUrl = $results.locationUrl
Invoke-RestMethod -Uri ($basrUrl + '_apis/build/builds/<someBuildId>?api-version=3.2') -Method Patch -Body (ConvertTo-Json @{"retainedByRelease"='false'}) -Headers $header -ContentType "application/json" | Out-Null
在Invoke-RestMethod
通话的最后一行出现错误。
我正在尝试此操作,因为下面的构建管道引发了一些合规性错误,并且我需要删除该管道,并且由于该构建仍由发行版保留,因此我无法删除它。
P.S,我已经检查了以下链接。 https://developercommunity.visualstudio.com/content/problem/442784/one-or-more-builds-associated-with-the-requested-p.html-似乎永久性修复尚未到位 https://almguide.net/2018/12/13/build-blocked-by-release/
答案 0 :(得分:1)
-Uri($ basrUrl +'https://tfsprodea1.visualstudio.com/')
此错误的URL构造引起的错误。您可以使用Write-Host $orgResourceAreasUrl
来打印之前构建的url,然后您会看到$results.locationUrl
的值为https://tfsprodea1.visualstudio.com/
而不是https://dev.azure.com/{your org name}/
。因此,实际上,在脚本的最后一行,您构造的url的值为https://tfsprodea1.visualstudio.com/_apis/build/builds/<someBuildId>?api-version=3.2
。这不是Azure Devops可以识别的正确URL。正确的网址应为https://dev.azure.com/{org name}/_apis/build/builds/{build id}?api-version=3.2
此错误的根本原因是您为 orgURL 指定的值不正确。为了更正收到的错误,您应该更改$orgURL
的值并将其指定为如下所示:
$orgURL = "https://dev.azure.com/{your org name}"
只有这样,您才能获得正确的locationUrl
值。
此外,在脚本行中,您构造的网址是
https://dev.azure.com/{org name}/_apis/build/builds/{build id}?api-version=3.2
这是组织级别的定义消息,您无法使用令牌更新。否则,您将收到消息 ID为“未指定项目”的项目。不存在,或者您没有访问权限。。
如果您仍然想更新 retainedByRelease 的值,请将该网址构造为
https://dev.azure.com/{org name}/{project name}/_apis/build/builds/{build id}?api-version=3.2
这是项目级别的信息,可以使用令牌进行更新。
因此,根据您的脚本,我进行了一些更改:
[String]$project = "$env:SYSTEM_TEAMPROJECT"
$orgURL = "https://dev.azure.com/{your org name}"
$header = @{
Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}
$areaId = "5d6898bb-45ec-463f-95f9-54d49c71752e"
$orgResourceAreasUrl = [string]::Format("{0}/_apis/resourceAreas/{1}?api-version=5.0-preview.1",$orgURL ,$areaId)
$results = Invoke-RestMethod -Uri $orgResourceAreasUrl -Headers $header
$basrUrl = $results.locationUrl
Invoke-RestMethod -Uri ($basrUrl + $project + '/_apis/build/builds/{build id }?api-version=3.2') -Method Patch -Body (ConvertTo-Json @{"retainedByRelease"='false'}) -Headers $header -ContentType "application/json" | Out-Null
注意:请首先启用以下复选框,以便您可以在脚本中使用System.AccessToken。