如何删除它声称由发布保留的 Azure DevOps 构建定义?
Posted
技术标签:
【中文标题】如何删除它声称由发布保留的 Azure DevOps 构建定义?【英文标题】:How can I delete an Azure DevOps build definition that it claims is retained by a release? 【发布时间】:2019-11-15 22:30:23 【问题描述】:我正在尝试删除 Azure DevOps 构建定义,但它不允许我这样做,因为它说:
“与请求的管道关联的一个或多个构建由发布保留。管道和构建不会被删除。”
但是,没有明显的方法可以查看导致构建被保留的版本。当然,我尝试在线搜索,但所有关于如何在 Web UI 中执行此操作的示例/屏幕截图都显示了 Azure DevOps 网站几次迭代前的 UI,因此所有控件看起来都不再相同了。例如,我在任何地方都看不到锁图标。
如何找到保留这些构建定义的版本,以便删除它们,然后删除构建定义?
谢谢!
【问题讨论】:
【参考方案1】:当您打开构建管道查看其详细的构建记录时,您可以看到相关的发布名称及其链接:
在旧的管道版本上,有一个锁定图标,可以明显地让我们知道它被保留了。事实上,锁图标不仅意味着它被释放保留,手动构建保留也显示这个图标。但是,我们似乎在扩展新的 sprint 时错过了这个明显的图标。
作为获取版本保留的构建列表的解决方法,这里有一个简短的脚本可以帮助您使用 Rest api 实现:
$token = "PAT token"
$url ="https://dev.azure.com/org name/project name/_apis/build/builds?api-version=5.1"
$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)"))
$response = Invoke-RestMethod -Uri $url -Headers @Authorization = "Basic $token" -Method Get
$results = $response.value | Where $_.retainedByRelease -eq "true" #|
Write-Host "results = $($results.id | ConvertTo-Json -Depth 100)"
首先,使用 list builds api 来获取当前项目中的所有构建。那么对于release保留的build,因为有参数可以表示:retainedByRelease这里我用$_.retainedByRelease -eq "true"
来获取release实际保留的build列表:
上面的脚本非常通用,可以在Powershell-ise和Powershell命令行以及VSTS的Powershell任务中使用,不需要做任何改动。
11/19 更新:
根据@Auth 的评论,如果想要获得它的关联发布,最简单的方法是找到构建,然后检查它的关联发布管道,如我上面分享的截图所示。
如果这不能满足你的要求,并且我们之前使用的 API 不包含任何发布信息,那么在这里,你需要使用这个 API:Releases - Get Release:
GET https://vsrm.dev.azure.com/org name/project name/_apis/release/releases?sourceId=project id:build definition id&api-version=5.1
在此 API 中,您需要指定 project id
:build definition id
来过滤发布。
图标不见了,会通知相应的团队,并在以后的sprint中尝试添加。
【讨论】:
感谢您的解释和脚本!通过在 Where 子句中添加“$_definition.id”过滤器,我能够修改您的脚本以更具体地帮助我的方案 - 删除特定的构建定义。不幸的是,这只能让我部分解决问题。现在我可以看到哪些版本被发布保留了,但是我如何找出是哪个版本导致它们被保留? AFAICT,retainedByRelease 属性只是一个布尔值,而不是告诉您哪个版本 ID 导致构建被保留。 @AuthInfant 此 API 中没有列出任何发布信息,要获取关联发布,您需要应用另一个 API 进行过滤。查看我的更新内容。事实上,对我来说,返回 UI 并搜索我们之前获得的构建更方便。然后从 UI 中找出我的第一个屏幕截图共享的版本。因为毕竟我们需要通过 UI 删除一些东西。 感谢您的屏幕截图指针。不幸的是,我看不到你所看到的。例如,通过运行您给我的脚本,我可以看到构建 ID 4119 已将 reservedByRelease 设置为 true,但如果我在 Web UI 中显示该构建的详细信息,则页面上没有“发布”选项卡“摘要”选项卡(即使网页上显示“发布保留”文本)。对于此定义中已将 reservedByRelease 设置为 true 的所有其他构建也是如此。 @AuthInfant,它是如此有线。所以现在,你必须使用上面的 powershell 脚本来实现关联的发布管道。如果您需要任何帮助,请随时告诉我。希望更新后的脚本确实有帮助。 感谢您的持续建议。我尝试使用 REST API 查询与无法删除的构建定义关联的所有版本,但不幸的是,REST 查询显示与该构建定义关联的版本为零。我验证了我的发布 REST 查询是有效的,因为我尝试了一个我知道有发布的定义并且它正确地列出了它们。对于我试图删除的这些构建定义,它们是“通过发布保留的”,但根据 REST API 和 UI,它们似乎实际上没有任何发布。怎么会这样?【参考方案2】:当有人删除与“POC”管道关联的存储库时,我遇到了这个问题。我不能删除管道。
当我尝试删除管道时,我收到以下消息:
与请求的管道关联的一个或多个构建由版本保留。管道和构建不会被删除。
我执行了以下步骤来删除管道:
-
我想删除 PublishBuildArtifacts-Infrastructure 管道,如图所示。我点击了管道。
-
我看到了运行(构建)列表,单击 3 个点,然后单击查看保留租约。
-
点击全部删除
-
现在您可以删除运行(构建)
删除所有运行后,现在可以删除管道。
享受吧!
【讨论】:
以上是关于如何删除它声称由发布保留的 Azure DevOps 构建定义?的主要内容,如果未能解决你的问题,请参考以下文章
复制 OS 磁盘后如何在 Azure ASM 中保留/设置默认管理员密码