VSTS/Azure DevOps: 自动递增 NuGet 包版本号 - 打包

13
如何在运行.NET Core Pack任务时,使输出的NuGet包版本自动增加?
例如,如果当前版本是1.0.0,那么下一次调用Pack任务时,希望看到1.0.1
目前我正在使用环境构建变量与Build.BuildNumber获取输出,如20180913-.2.0,等等。 我想建立一个更传统的版本控制系统。

下面有一些使用开箱即用功能的好答案,包括提供给OP并被接受的答案。话虽如此,如果您正在使用Git并使用分支工作流程(如Git Flow或Github Flow),我建议考虑GitVersion,它作为NuGet软件包集成到项目中,并具有相应的Azure DevOps任务。它提供了很多灵活性,并且可以根据分支名称、标签甚至提交消息确定主要、次要和补丁更新。 - Jeremy Caney
5个回答

30
文档中可以看出,变量Rev:.r是每日版本构建的修订计数器。使用该“解决方案”,一天后将会有版本号为1.0.12,然后第二天就变成了1.0.1
如果要使用简单增量和独立的semver,请使用1.0.$(BuildID)$(BuildID)是用于您的构建的内部不可变计数器,因此比$(BuildNumber)更清晰。
BuildID将始终递增-不会重置。 因此,在进行次要更新后,例如1.2.123变成1.3.124
如果想要完成这个任务,可以使用npm version或类似工具,例如针对Dart或Flutter构建的pubspec_version
- script: npm version $RELEASE_TYPE

其中 $RELEASE_TYPE 是一个变量,根据构建(例如:CI、PR等)可以进行设置,其值可以是 majorminorpatchprerelease 等。

- script: npm version $RELEASE_TYPE
  condition: startsWith(variables['build.sourceBranch'], 'refs/head/release/')
  env:  
    releaseType: minor

更新:升级仓库版本并在构建中使用(使用npm)

为了使仓库版本更新,我最终将npm version作为DevDependency包含在内,并使用其预提交钩子在任何提交时提升项目版本。

这种技术可以应用于其他项目类型,将它们放在子文件夹中 - 虽然可能会导致与服务器操作系统要求的复杂性。

要在您的构建中使用此版本,请添加此 bash脚本任务,该任务获取并导出版本作为任务变量:

v=`node -p "const p = require('./package.json'); p.version;"`
echo "##vso[task.setvariable variable=packageVersion]$v"

.Net Core 仅任务版本

很遗憾,没有仓库升级。

jobs:
  - job: versionJob #reads version number from the source file
    steps:
      - powershell: |
          $fv = Get-Content versionFile
          Write-Host ("##vso[task.setvariable variable=versionFromFile;isOutput=true]$fv")
        displayName: 'version from file' 
        name: setVersionStep  


  - job: buildJob # consumes version number, calculates incremental number and set version using assemblyinfo.cs
    dependsOn: versionJob
    variables:
      versionFromFile: $[ dependencies.versionJob.outputs['setVersionStep.versionFromFile'] ] # please note that spaces required between $[ and dependencies
      buildIncrementalNumber: $[ counter(dependencies.versionJob.outputs['setVersionStep.versionFromFile'],1) ] #can't use $versionFromFile here


    steps:
      - powershell: |
          Write-Host ($env:versionFromFile)
          Write-Host ($env:versionFromFile + '.' + $env:buildIncrementalNumber)
        displayName: 'version from file output' 

这篇文章描述了一些其他方式,使用version-prefix并自动将BuildNumber应用为version-suffix


1
更新存储库的更改怎么样?当我尝试这个解决方案时,是的,软件包接收新版本并发布。但是 package.json 中的版本标签仍然停留在 1.0.0。我尝试创建一个自定义命令来打标签并推回存储库,但迄今为止没有成功。 - serdar.sanri
和上面的问题一样,人们如何将这个内容放回他们的代码库中? - Poul K. Sørensen
对于npm解决方案,它会提交更新的版本吗? - aniket7824
@greg.arnott 只使用 1.0.$BuildId 还有效吗?不是应该使用 1.0.$Build.BuildID 吗?https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml 在页面上按 CTRL+F 搜索 Build.BuildId - user10706046
在文档中,我看到 Rev:.r 在示例中被使用,但没有任何解释。编辑:哦糟糕,它只是作为 Rev:r 记录在文档中了。https://learn.microsoft.com/azure/devops/pipelines/process/run-number#tokens - Kyle Delaney
显示剩余2条评论

28

我可能已经想到了解决方法。对于任何感到困惑的人,请尝试以下操作:

打包任务:

  • 自动打包版本控制:使用环境变量
  • 环境变量:Build.BuildNumber

然后,在顶部菜单中,您有 Tasks, Variables, Triggers, Options,点击 Options 并设置:

  • 构建号格式:1.0$(Rev:.r)

保存并排队。这将生成例如1.0.1。

(如果我错了或者不适用于长期使用,请纠正我。)


那就是正确的方式! - Alex Mullans
1
你可以将其作为答案接受,这对于阅读本帖的其他社区成员可能会有益处。 - Andy Li-MSFT
3
我的经验是,如果你的解决方案/构建定义包含多个软件包,即使只更改了其中一个软件包的版本,也会强制所有软件包都更改版本。因此,从长远来看,这并不好。 - John
@John,当您在解决方案级别构建的管道中具有任意数量的项目时,您如何处理(自动)仅对已更改的软件包源文件进行版本控制?我非常感兴趣如何在不分割我的构建到每个csproj基础上的情况下完成这项工作。 - Josh Gust

9
如果您只是想增加主版本号、次版本号或修订版本号,使用变量中的 counter 运算符是一个简单而优雅的方法。它会自动将当前值加一。
以下是我使用的代码:
variables:
  major: '1'
  minor: '0'
  revision: $[counter(variables['minor'], 1)] #this will get reset when minor gets bumped. The number after Counter is the seed number (in my case, I started at 1).
  app_version: '$(major).$(minor).$(revision)'

如果您想看到一个真实的四阶段工作流程示例,请访问此处:https://github.com/LanceMcCarthy/DevReachCompanion/blob/master/azure-pipelines.yml

这个程序是如何保持最新的修订号的?如果你现在运行它,你会得到1.0.1,下一次再运行它时,小版本号被硬编码为0,它应该再次获取1.0.1。 - Emil
计数器运算符在管道中将其作为变量进行跟踪。您不需要手动更新它。 - Lance McCarthy
如何推送版本 1.1.0?需要增加次要版本号并重置修订计数器。 - Serhii Shushliapin
当你增加次要版本时,修订版本将自动重置。请查看此博客文章的示例:https://stevenknox.net/auto-versioning-nuget-packages-in-azure-devops-pipelines/ - Lance McCarthy
非常感谢!对于其他遇到问题的人,这是我用来解决问题的完整方案:https://dev59.com/21QJ5IYBdhLWcg3wCxQZ - SharpC

2

对我来说,只需要在选项卡上设置“构建编号格式”即可。

$(date:yyyy).$(date:MMdd)$(rev:.r) 

并添加下一个构建参数:

/p:Version=1.$(Build.BuildNumber) /p:AssemblyVersion=1.$(Build.BuildNumber)

在这种情况下,我们手动管理主版本,但是次要版本和构建编号将自动设置。这样可以轻松了解您部署的版本。

0
我正在使用ado管道和yaml构建。我所做的是利用管道变量、计数器函数和内联powershell函数来创建版本号。它会自动递增,使整个构建过程更加顺畅。

另一个类似主题的SO帖子


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接