【问题标题】:VSTS/Azure DevOps: Auto-Increment NuGet Package Version on PackVSTS/Azure DevOps:自动递增 NuGet 包版本
【发布时间】:2018-09-13 11:21:53
【问题描述】:

运行 .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 任务。它提供了很多的灵活性,并且可以根据分支名称、标签甚至提交消息确定性地确定主要、次要和补丁更新。

标签: .net-core azure-devops azure-pipelines azure-pipelines-build-task azure-artifacts


【解决方案1】:

docs,变量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

更新:Bump Repo 版本和在构建中使用(使用 npm)

为了更新 repo 版本,我最终将 npm version 作为 DevDependency 包含在内,它的 precommit hook 可以在任何提交时提升项目版本。

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

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

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

.Net Core Task only 版本

很遗憾,没有回购。

解决方法 1:
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' 
解决方法 2:

This post 描述了其他几个,使用 version-prefix 并自动将 BuildNumber 应用为 version-suffix

【讨论】:

  • 用更改更新存储库怎么样?当我尝试这个解决方案时,是的包接收新版本并发布。但是 package.json 中的版本标签仍然保持在 1.0.0。我试图创建一个自定义命令来标记并推回回购,但到目前为止没有运气。
  • 与上述相同的问题,人们如何将其恢复到他们的存储库中?
  • 开头关于“每日”修订计数的部分是错误的(尽管公平地说这是因为文档不是特别清楚)。在文档示例中它是每日计数的唯一原因是因为日期也包含在内部版本号格式中,因此前缀会发生变化。如果你有 1.0$(Rev:.r) 那么它只会不断增加 1.0.x 中的 x 每次。
  • 对于npm,解决方案,是否会提交更新版本?
  • Azure 中 repo-bumps 的问题是,您通常会将触发器映射到 repo 更改上 - 否则它会以产生比它们解决的更多问题的方式复杂化。最有效的方法是在提交过程中有一个自动更新版本的钩子,然后让 Azure 读取 + 使用此值,以通过所需的不同步骤使用。
【解决方案2】:

我可能已经明白了。对于任何撕掉头发的人,试试这个:

打包任务:

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

然后,在您拥有 TasksVariablesTriggersOptions 的顶部菜单中,单击选项并设置:

  • 内部版本号格式:1.0$(Rev:.r)

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

(如果我错了,或者如果这不能长期工作,请纠正我。)

【讨论】:

  • 就是这样!
  • 你可以Accept it as an Answer,这对阅读此主题的其他社区成员会有所帮助。
  • 我在这件事上的经验是,如果您的解决方案/构建定义包含多个包,即使您更改了一个,您基本上也会强制所有这些包更改版本。所以从长远来看这不会是好事。
  • @John,当您在管道构建的任何给定解决方案中拥有 n 个项目时,您是如何仅对那些已更改的包源进行(自动)版本控制的解决方案水平?我一直对如何在不将我的构建拼接到每个 csproj 基础上的情况下做到这一点非常感兴趣。
【解决方案3】:

如果您只是想增加主要、次要或修订版本号,在变量中使用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)'

如果您想查看使用此功能的实际 4-job 管道,我在这里有一个 https://github.com/LanceMcCarthy/DevReachCompanion/blob/master/azure-pipelines.yml

【讨论】:

  • 如何保持最新的修订号?如果你现在运行它,你会得到 1.0.1,下次你运行它时,minor 是硬编码的 0,它应该再次得到 1.0.1
  • 计数器操作符将其作为管道中的变量进行跟踪。您不需要手动更新它。
  • 如何推送版本1.1.0?次要版本需要增加,修订计数器必须以某种方式重置。
  • 当您增加次要时,修订将自动重置,请查看此博客文章的示例stevenknox.net/…
  • 非常感谢!对于其他苦苦挣扎的人,这是我用来让它工作的完整解决方案:stackoverflow.com/questions/54718866/…
【解决方案4】:

对我来说,将选项选项卡上的内部版本号格式设置为

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

并添加下一个构建参数:

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

在这种情况下,我们手动管理主要版本,但次要版本和内部版本号将自动设置。易于理解您部署的版本。

【讨论】:

    【解决方案5】:

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

    Another SO Post about something similar

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      • 2012-01-25
      • 2018-04-27
      • 1970-01-01
      • 2020-03-29
      相关资源
      最近更新 更多