首页 > 解决方案 > 如何删除 DevOps 工件中的所有上游包?

问题描述

我们不再希望在我们的工件提要中使用上游源,但由于某种原因,即使在移除上游连接之后,这些包仍然存在。有没有办法删除这些包?我已经尝试删除所有软件包的最新版本,但这确实符合它的建议:它只删除了第一个版本,并保持所有其他软件包版本不变。

标签: azure-devopsnugetazure-artifacts

解决方案


如何删除 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如您在前面的屏幕截图中所见,最初的数字是。我中止了脚本以避免删除我所有的上游包。

在此处输入图像描述


推荐阅读