Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Azure Pipeline Nuget Package Versioning Scheme, How to Get "1.0.$(Rev:r)"

I'm setting up an Azure Pipelines build that needs to package a C# .NET class library into a NuGet package.

In this documentation, it lists a couple different ways to automatically generate SemVer strings. In particular, I want to implement this one:

$(Major).$(Minor).$(rev:.r), where Major and Minor are two variables defined in the build pipeline. This format will automatically increment the build number and the package version with a new patch number. It will keep the major and minor versions constant, until you change them manually in the build pipeline.

But that's all they say about it, no example is provided. A link to learn more takes you to this documentation, where it says this:

For byBuildNumber, the version will be set to the build number, ensure that your build number is a proper SemVer e.g. 1.0.$(Rev:r). If you select byBuildNumber, the task will extract a dotted version, 1.2.3.4 and use only that, dropping any label. To use the build number as is, you should use byEnvVar as described above, and set the environment variable to BUILD_BUILDNUMBER.

Again, no example is provided. It looks like I want to use versioningScheme: byBuildNumber, but I'm not quite sure how to set the build number, I think it pulls it from the BUILD_BUILDNUMBER environment variable, but I can't find a way to set environment variables, only script variables. Furthermore, am I suppose to just set that to 1.0.$(Rev:r), or to $(Major).$(Minor).$(rev:.r)? I'm afraid that would just interpret it literally.

Googling for the literal string "versioningScheme: byBuildNumber" returns a single result... Does anyone have a working azure-pipelines.yml with this versioning scheme?

like image 717
aurath Avatar asked Feb 16 '19 01:02

aurath


4 Answers

Working YAML example for Packaging/Versioning using byBuildNumber

NOTE the second parameter of the counter - it is a seed value, really useful when migrating builds from other build systems like TeamCity; It allows you to set the next build version explicitly upon migration. After the migration and initial build in Azure DevOps, the seed value can be set back to zero or whatever start value (like 100) you may prefer every time majorMinorVersion is changed:

reference: counter expression

name: $(majorMinorVersion).$(semanticVersion) # $(rev:r) # NOTE: rev resets when the default retention period expires

pool: 
  vmImage: 'vs2017-win2016' 

# pipeline variables
variables:
  majorMinorVersion: 1.0
  # semanticVersion counter is automatically incremented by one in each execution of pipeline
  # second parameter is seed value to reset to every time the referenced majorMinorVersion is changed
  semanticVersion: $[counter(variables['majorMinorVersion'], 0)]
  projectName: 'MyProjectName'
  buildConfiguration: 'Release'

# Only run against master
trigger:
- master

# Build
- task: DotNetCoreCLI@2
  displayName: Build
  inputs:
    projects: '**/*.csproj'
    arguments: '--configuration $(BuildConfiguration)'

# Package
- task: DotNetCoreCLI@2
  displayName: 'NuGet pack'
  inputs:
    command: 'pack'
    configuration: $(BuildConfiguration)
    packagesToPack: '**/$(ProjectName)*.csproj'
    packDirectory: '$(build.artifactStagingDirectory)'
    versioningScheme: byBuildNumber # https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/build/dotnet-core-cli?view=azure-devops#yaml-snippet

# Publish
- task: DotNetCoreCLI@2
  displayName: 'Publish'
  inputs:
    command: 'push'
    nuGetFeedType: 'internal'
    packagesToPush: '$(build.artifactStagingDirectory)/$(ProjectName)*.nupkg'
    publishVstsFeed: 'MyPackageFeedName'
like image 188
Emil Avatar answered Nov 12 '22 20:11

Emil


byBuildNumber uses the build number you define in your YAML with the name field.

Ex: name: $(Build.DefinitionName)-$(date:yyyyMMdd)$(rev:.r)

So if you set your build format to name: 1.0.$(rev:.r), it should work as you expect.

like image 21
Daniel Mann Avatar answered Nov 12 '22 20:11

Daniel Mann


Azure Pipeline Nuget Package Versioning Scheme, How to Get “1.0.$(Rev:r)”

This should be a issue in the documentation. I reproduced this issue when I set $(Major).$(Minor).$(rev:.r) in the Build number format in the Options of build pipeline:

enter image description here

However, I suddenly noticed that the build number is not correct with that format after many build tests:

enter image description here

There are two points . between 0 and 2 (Open above image in a new tab). Obviously this is very strange. So, I changed the Build number format to:

$(Major).$(Minor)$(rev:.r)

Or

$(Major).$(Minor).$(rev:r)

Now, everything is working fine.

As test, I just set the Build number format to $(rev:.r), and the build number is .x. So, we could confirm that the value of $(rev:.r) including the . by default.

Note: Since where Major and Minor are two variables defined in the build pipeline, so we need defined them in the variables manually.

Hope this helps.

like image 6
Leo Liu-MSFT Avatar answered Nov 12 '22 21:11

Leo Liu-MSFT


I had the similar issue and now let me make it clear.

Firstly, what is the definition of Build Number?

By the official document of Azure Pipeline YAML scheme, it is

name: string  # build numbering format
resources:
  containers: [ containerResource ]
  repositories: [ repositoryResource ]
variables: { string: string } | [ variable | templateReference ]
trigger: trigger
pr: pr
stages: [ stage | templateReference ]

Look at the first line:

name: string  # build numbering format

Yes, that's it!

So you could define it like

name: 1.0.$(Rev:r)

if you prefer to Semantic Versioning. Then

Secondly, what's the meaning of versioningScheme: 'byBuildNumber' in task NuGetCommand@2?

It's really straightforward: just use the format defined by name!

Last but not least

The official document on Package Versioning and Pack NuGet packages don't make it clear that what a build number really is and how to define it. It's really misleading. And I'm so sad as an MS employee as I'd to resort to external resource to make all that clear.

like image 6
Robert Avatar answered Nov 12 '22 20:11

Robert