azure-devops - 如何删除 DevOps 工件中的所有上游包?
问题描述
我们不再希望在我们的工件提要中使用上游源,但由于某种原因,即使在移除上游连接之后,这些包仍然存在。有没有办法删除这些包?我已经尝试删除所有软件包的最新版本,但这确实符合它的建议:它只删除了第一个版本,并保持所有其他软件包版本不变。
解决方案
如何删除 DevOps 工件中的所有上游包?
事实上,目前还没有这种开箱即用的方式来删除 DevOps 工件中的所有上游包(包括所有版本)。
关于它有一个封闭的用户声音:Delete Upstream Source Cached Packages。如果您对此功能感兴趣,可以打开一个新的用户语音建议;我愿意为你投票。
作为解决方法,我们可以循环通过 REST API ( NuGet - Delete Package Version ) 来删除上游包的所有版本:
DELETE https://pkgs.dev.azure.com/{organization}/{project}/_apis/packaging/feeds/{feedId}/nuget/packages/{packageName}/versions/{packageVersion}?api-version=6.0-preview.1
首先,我们需要FeedId
通过 REST API 获取 NuGet 提要(提要管理 - 获取提要)和该提要中的所有包(工件详细信息 - 获取包)。
这里重要的一点是,我们需要确定这些包中的哪些来自上游来源。REST API有属性directUpstreamSourceId
(工件详细信息 - 获取包):
现在,我们可以根据该字段是否存在来判断该包是否为上游源码包。
其次,在我们获取Id
所有上游源包之后,我们可以循环通过 REST API(工件详细信息 - 获取包版本)来获取包的所有版本。
第三,获取所有版本后,我们可以循环通过 REST API(NuGet - 删除包版本)来删除该包的所有版本。
下面是我用于测试的 PowerShell 脚本:
$connectionToken="Your PAT Here"
$base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))
$PackagesUrl = "https://feeds.dev.azure.com/{organization}/{project}/_apis/packaging/Feeds/{feedId}/packages?api-version=6.0-preview.1"
Write-Host "URL: $PackagesUrl"
$PackagesInFeed = (Invoke-RestMethod -Uri $PackagesUrl -Method Get -UseDefaultCredential -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)})
$packagesId = $PackagesInFeed.value.id
$UpstreamSourceParameters= $PackagesInFeed.value.versions | Get-Member -MemberType Properties
$UpstreamSource = $UpstreamSourceParameters[0].name
Write-Host "The Upstream Source Parameter name: $UpstreamSource"
ForEach ($PI in $packagesId)
{
if ($UpstreamSource -ne $null)
{
$PackageVersionUrl = "https://feeds.dev.azure.com/{organization}/{project}/_apis/packaging/Feeds/{feedId}/packages/$($PI)/versions?api-version=6.0-preview.1"
$PackageVersions = (Invoke-RestMethod -Uri $PackageVersionUrl -Method Get -UseDefaultCredential -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)})
$PackageNameUrl = "https://feeds.dev.azure.com/{organization}/{project}/_apis/packaging/Feeds/{feedId}/packages/$($PI)?api-version=6.0-preview.1"
$PackageNames = (Invoke-RestMethod -Uri $PackageNameUrl -Method Get -UseDefaultCredential -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)})
$VersionsId = $PackageVersions.value.version
$packageName = $PackageNames.name
Write-Host "Package Versions: $VersionsId"
Write-Host "Package Name: $packageName"
ForEach ($VI in $VersionsId)
{
$DeleteUrl = "https://pkgs.dev.azure.com/{organization}/{project}/_apis/packaging/feeds/{feedId}/nuget/packages/$($packageName)/versions/$($VI)?api-version=6.0-preview.1"
$Member = (Invoke-RestMethod -Uri $DeleteUrl -Method DELETE -UseDefaultCredential -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)})
}
}
elseif($targetTask.result -eq "Failed")
{
Write-Host ("This is package not from upstream source!")
}
}
注意:如果您的提要范围是组织,请删除/{project}
REST API URL 中的字段。
以下是我的测试结果。317
如您在前面的屏幕截图中所见,最初的数字是。我中止了脚本以避免删除我所有的上游包。
推荐阅读
- python - for循环中的语句没有运行
- apache - 如何为 Windows Apache Web 服务器集成和启动 Datadog 监控?
- c++ - 虚幻引擎 - 将可见网格从物理实体实例中分离出来
- sql - 有人可以帮我处理 SQL 中的这个 join 语句吗?后面有两个 JOINS
- laravel-5 - 如何在 API 身份验证中只允许不记名令牌?
- powerbi - 通过发布应用程序向用户授予权限时,如果数据集位于另一个工作区中,则它不适用于数据集
- database - Gremlin:提供的遍历器未映射到值
- angular - Angular 11 错误:您在预期流的位置提供了无效对象。您可以提供 Observable、Promise、Array 或 Iterable
- android-location - 如何以编程方式匹配android中的两个位置?
- python - python discord bot-只是无法在线(只是一个简单的问题)