Publish NuGet packages with Azure Pipelines (YAML/Classic)

TFS 2018

In Azure Pipelines, you can use the classic editor or the YAML tasks to publish your NuGet packages within your pipeline, to your Azure Artifacts feed, or to public registries such as nuget.org.

Create a NuGet package

There are various ways to create your NuGet packages such as using Visual Studio to pack your NuGet packages. If you're already using MSBuild or some other task to create your packages, skip this section and jump to the publish NuGet packages section.

YAML isn't supported in TFS.

Package versioning

NuGet packages are distinguished by their names and version numbers. Employing Semantic Versioning is a recommended strategy for effectively managing package versions. Semantic versions consist of three numeric components: Major, Minor, and Patch.

The Patch is incremented after fixing a bug. When you release a new backward-compatible feature, you increment the Minor version and reset the Patch version to 0. When you make a backward-incompatible change, you increment the Major version and reset the Minor and Patch versions to 0.

With Semantic Versioning, you can also use prerelease labels to tag your packages. To do so, enter a hyphen followed by your prerelease tag: E.g.1.0.0-beta. Semantic Versioning is supported in Azure Pipelines and can be configured in your NuGet task as follows:

  • Use the date and time (Classic): byPrereleaseNumber (YAML). Your package version is in the format: Major.Minor.Patch-ci-datetime where you have the flexibility to choose the values of your Major, Minor, and Patch.

  • Use an environment variable (Classic): byEnvVar (YAML). Your package version is set to the value of the environment variable you specify.

  • Use the build number (Classic): byBuildNumber (YAML). Your package version is set to the build number. Make sure you set your build number format under your pipeline Options to $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r). To do set the format in YAML, add a property name: at the root of your pipeline and add your format.

The following example shows how to use the date and time versioning option to generate a SemVer compliant version formatted as: Major.Minor.Patch-ci-datetime.

YAML isn't supported in TFS.

Note

DotNetCore and DotNetStandard packages should be packaged with the DotNetCoreCLI@2 task to avoid System.InvalidCastExceptions. For more information, see, the .NET Core CLI task.

task: DotNetCoreCLI@2
inputs:
    command: pack
    versioningScheme: byPrereleaseNumber
    majorVersion: '$(Major)'
    minorVersion: '$(Minor)'
    patchVersion: '$(Patch)'

Publish NuGet packages

To publish packages to an Azure Artifacts feed from your pipeline, you must set the Project Collection Build Service identity to be a Contributor on your feed. For more information, see Configure feed settings.

YAML isn't supported in TFS.

Publish to NuGet.Org

  1. Generate an API key

  2. Navigate to your Azure DevOps project and then select gear icon Project settings.

  3. Select Service Connections, and then select New service connection.

  4. Select NuGet, and then select Next.

  5. Select ApiKey as your authentication method. Use the following url for your Feed URL: https://api.nuget.org/v3/index.json.

  6. Enter the ApiKey you generated earlier, and then enter a Service connection name.

  7. Select Grant access permission to all pipelines, and then select Save when you're done. To select this option, you need the service connection Administrator role.

Add the following YAML snippet to your pipeline definition:

steps:
- task: NuGetCommand@2
  displayName: 'NuGet push'
  inputs:
    command: push
    nuGetFeedType: external
    publishFeedCredentials: nuget.org