通过PowerShell重置构建管道中的构建的retainedByRelease属性时出错

时间:2019-07-19 17:28:34

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

我试图通过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/

1 个答案:

答案 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