Search code examples
azure-devopsnugetazure-pipelinesazure-artifactsazure-devops-server-2019

Automatically promote a nuget packge using a relese definition


In onprem Azure DevOps (Version 17.143.28621.4) is there a way to automatically promote a nuget package from one view to another using a task in a release definition?

When we trigger a release for a build, the artefacts (i.e. nuget packages) go through two stages

  1. PreRelease: The packages are pushed to the feed (ending up in the @Local view).
  2. Release: The packages should be promoted from the @Local to the @Release view.

Unfortunately stage 2. is currently a manual step in the Azure DevOps web UI. Can it be automated via the release definition?

If this is not possible, is there a better way to organise our release pipeline and package feeds/views to make a release of nuget packages fully automatic?


Solution

  • The following powershell script you can use to promote multiple packages. This script assumes that all packages have the same version (one product consisting of several packages). It is working fine with our "DevOps Server 2019".

    param(
      [Parameter(Mandatory=$True)]
      [string]$tfsCollectionUri,
      [Parameter(Mandatory=$True)]
      [string]$feedName,
      [Parameter(Mandatory=$True)]
      [string]$packageVersion,
      [Parameter(Mandatory=$True)]
      [string]$packageQuality
    )
    
    $ErrorActionPreference = "Stop"
    
    [regex]$nameExpression = "(?<name>[^0-9]*)\."
    $json = '{ "views": { "op":"add", "path":"/views/-", "value":"' + $packageQuality + '" } }'
    Write-Verbose -Message $json
    
    Get-ChildItem . -Filter *.nupkg | Foreach-Object {
      $matches = $nameExpression.Match($_.Name)
      $packageName = $matches.groups['name']
      $requestUri = $tfsCollectionUri + "/_apis/packaging/feeds/$feedName/nuget/packages/$packageName/versions/$packageVersion" + "?api-version=5.0-preview.1"
      Write-Verbose -Message $requestUri
      $reponse = Invoke-RestMethod -Uri $requestUri -UseDefaultCredentials -ContentType "application/json" -Method Patch -Body $json
      Write-Verbose -Message "Response: '$reponse'"
    }
    

    The parameter packageQuality should be e.g. "Release" or "Prerelease", without leading "@".

    Many thanks to Shayki Abramczyk for the tip in the right direction.