Azure Pipeline Nuget 包版本控制方案,如何获取“1.0.$(Rev:r)”

Posted

技术标签:

【中文标题】Azure Pipeline Nuget 包版本控制方案,如何获取“1.0.$(Rev:r)”【英文标题】:Azure Pipeline Nuget Package Versioning Scheme, How to Get "1.0.$(Rev:r)" 【发布时间】:2019-07-10 03:50:24 【问题描述】:

我正在设置一个 Azure Pipelines 构建,它需要将 C# .NET 类库打包到 NuGet 包中。

在this documentation 中,它列出了几种自动生成 SemVer 字符串的不同方法。特别是,我想实现这个:

$(Major).$(Minor).$(rev:.r),其中MajorMinor 是两个变量 在构建管道中定义。这种格式会自动 使用新补丁增加内部版本号和软件包版本 数字。它将保持主要和次要版本不变,直到您 在构建管道中手动更改它们。

但这就是他们所说的,没有提供任何例子。一个了解更多信息的链接会将您带到this documentation,上面写着:

对于byBuildNumber,版本将设置为内部版本号,确保 您的内部版本号是正确的 SemVer,例如1.0.$(Rev:r)。如果你 选择byBuildNumber,任务会提取一个虚线版本,1.2.3.4 并仅使用它,丢弃任何标签。要按原样使用内部版本号, 您应该如上所述使用 byEnvVar,并设置环境 变量为BUILD_BUILDNUMBER

同样,没有提供示例。看起来我想使用versioningScheme: byBuildNumber,但我不太确定如何设置内部版本号,我认为它从BUILD_BUILDNUMBER 环境变量中提取它,但我找不到设置环境变量的方法, 只有脚本变量。此外,我想将其设置为1.0.$(Rev:r),还是$(Major).$(Minor).$(rev:.r)?恐怕这只会按字面意思解释。

用谷歌搜索文字字符串“versioningScheme: byBuildNumber”会返回一个结果...有没有人有使用此版本控制方案的azure-pipelines.yml

【问题讨论】:

您可以做其他事情:使用 GitVersion,然后使用内部版本号格式使用 $(Build.DefinitionName)-$(GitVersion_FullSemVer) 之类的东西。如果在任务中将 Automatic package versioning 的包选项设置为“Use an environment variable”,然后您使用的 env 变量为 GITVERSION_NUGETVERSIONV2,则您的 NuGet 包将自动获得版本控制。 【参考方案1】:

byBuildNumber 使用您在 YAML 中通过 name 字段定义的内部版本号。

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

因此,如果您将构建格式设置为 name: 1.0.$(rev:.r),它应该可以按预期工作。

【讨论】:

##[error]Could not find version number data in the following environment variable: BUILD_BUILDNUMBER. The value of the variable should contain a substring with or are positive integers. 看起来是在环境变量中查找。 我会将此标记为答案,因为它很接近并且让我完成了剩下的工作。我错过了 name 字段本身位于 yaml 的根目录中,而不是在变量部分或 nuget 部分中。我把它作为 yaml 文件的第一行。不过请注意 Leo,他的观点很好。【参考方案2】:

Azure Pipeline Nuget 包版本控制方案,如何获取“1.0.$(Rev:r)”

这应该是文档中的一个问题。我在构建管道的选项中以内部版本号格式设置$(Major).$(Minor).$(rev:.r) 时重现了此问题:

然而,经过多次构建测试后,我突然注意到构建号与该格式不正确:

在 0 和 2 之间有 两个.(在新标签页中打开上图)。显然这很奇怪。因此,我将内部版本号格式更改为:

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

或者

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

现在,一切正常。

作为测试,我只是将Build number格式设置为$(rev:.r),build number是.x。所以,我们可以确认$(rev:.r)的值默认包括.

注意:由于其中MajorMinor是构建管道中定义的两个变量,所以我们需要在变量中手动定义它们。

希望这会有所帮助。

【讨论】:

谢谢!很高兴知道。但是,我仍然无法确定内部版本号的设置位置。上面的 Daniel 提到了一个 name 字段,但该设置在变量部分或 nuget 任务部分中都不起作用。您在构建管道选项中的内部版本号格式中提到“”。但我不知道你在说哪里。还有什么线索吗?【参考方案3】:

使用 byBuildNumber 进行打包/版本控制的工作 YAML 示例

注意counter 的第二个参数 - 它是一个种子值,在从其他构建系统(如 TeamCity)迁移构建时非常有用;它允许您在迁移时明确设置下一个构建版本。在 Azure DevOps 中迁移和初始构建后,每次更改 majorMinorVersion 时,种子值都可以设置回零或您可能喜欢的任何起始值(如 100):

参考: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://docs.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'

【讨论】:

我使用了类似的解决方案,但是如果我在接下来的 30 天(默认保留期)内不再次构建,最新的构建将从历史记录中消失,$(rev:r) 被重置再次变为 1,NuGet 发布失败。 嗯,知道非常有用 - 我打算用它来控制私人仓库中的 nuget 包的版本。显然,大多数软件包将在几个月内无法构建,如果 $(rev:r) 重置此方法将无法使用...我正在从 TeamCity 迁移这些软件包构建,现在需要重新访问我的版本控制...您的解决方案是什么? 我们也在从 TeamCity 迁移,但我们还没有解决这个问题。 @HeinGustavsen 我们还将构建从 TeamCity 迁移到 Azure DevOps - 请参阅上面我更新的示例;我目前的解决方案是使用计数器表达式函数来代替 $(rev:r) 的使用。希望对你也有帮助... @Emil 谢谢..你只是节省了我的时间。我怎样才能像这样将后缀附加到版本 x.y.z-beta1..【参考方案4】:

我有类似的问题,现在让我说清楚。

首先,Build Number的定义是什么?

通过Azure Pipeline YAML scheme的官方文档,是

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

看第一行:

name: string  # build numbering format

是的,就是这样!

所以你可以这样定义它

name: 1.0.$(Rev:r)

如果您更喜欢语义版本控制。那么

其次,任务NuGetCommand@2中versioningScheme: 'byBuildNumber'是什么意思?

真的很简单:只需使用name定义的格式!

最后但并非最不重要的一点

Package Versioning 和Pack NuGet packages 上的官方文档并没有明确说明内部版本号到底是什么以及如何定义它。这真的很误导人。作为一名 MS 员工,我很伤心,因为我不得不求助于外部资源来澄清这一切。

【讨论】:

这正是我感到困惑并试图找到答案的......谢谢!【参考方案5】:

我有一个解决方法来添加后缀(即“-beta”),因为在使用经典编辑器并按内部版本号设置自动版本控制时,Nuget pack 命令出于某种原因忽略了它:

    设置一个新的环境变量,将值设置为预定义的$(Build.BuildNumber)变量:

    设置内部版本号:

    将 NuGet pack 命令设置为按环境变量自动命名并指定新添加的变量名称:

如果您对整个构建/发布管道设计和 YAML 感兴趣,请查看我的文章 here

【讨论】:

以上是关于Azure Pipeline Nuget 包版本控制方案,如何获取“1.0.$(Rev:r)”的主要内容,如果未能解决你的问题,请参考以下文章

具有相同依赖项的不同版本的 nuget 包的 azure 函数

nuget 包与其引用的 nuget 包之间的不同版本

Azure Devops 私有构建代理在 nuget 还原任务中失败

访问 Azure Pipelines 中私有 Nuget 服务器中托管的 Nuget 包

Azure Devops 找不到恢复的 nuget 包

Azure 部署:配置数据库依赖项引发错误“无法配置 NuGet 包”