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

Error resetting retainedByRelease property of a build in build pipeline through PowerShell

我正在尝试通过 PowerShell 调用 Azure Rest API,在我的一个构建管道中设置构建的 retainedByRelease 属性 的值。我在终端中收到 "page not found" 错误。我怀疑我正在准备 URL 错误但不确定在哪里。请帮忙。

为了弄清楚 URL,我从下面的 link 中获取了 Build 的区域 ID(即 5d6898bb-45ec-463f-95f9-54d49c71752e)。 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,下面的link我已经检查过了。 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/

-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。正确的 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的正确值。

此外,在脚本行中,您构造的url是

https://dev.azure.com/{org name}/_apis/build/builds/{build id}?api-version=3.2

这是组织级别的定义消息,您无法使用令牌更新它。或者您将收到消息 ID 为 'No project was specified.' 的项目不存在,或者您没有访问它的权限。.

如果您仍想更新 retainedByRelease 的值,请将 url 构造为

 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