Azure管道Nuget包版本控制方案,如何获得“1.0。$(Rev:r)”

问题描述 投票:2回答:3

我正在设置一个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

continuous-integration azure-devops nuget azure-pipelines semantic-versioning
3个回答
2
投票

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

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

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


6
投票

使用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'

1
投票

Azure管道Nuget包版本控制方案,如何获得“1.0。$(Rev:r)”

这应该是文档中的问题。当我在构建管道选项中以Build编号格式设置$(Major).$(Minor).$(rev:.r)时,我重现了这个问题:

enter image description here

但是,我突然发现许多构建测试后,使用该格式的构建号不正确:

enter image description here

在0和2之间有两个点.(在新选项卡中打开上面的图像)。显然这很奇怪。所以,我将Build号格式更改为:

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

要么

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

现在,一切都运转良好。

作为测试,我只是将Build number格式设置为$(rev:.r),内部版本号为.x。因此,我们可以确认$(rev:.r)的值,包括默认的.

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

希望这可以帮助。


0
投票

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

首先,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 VersioningPack NuGet packages的官方文件没有明确说明构建号是什么以及如何定义它。这真的很误导。我作为一名MS员工感到非常伤心,因为我要借助外部资源来清楚地说明这一点。

© www.soinside.com 2019 - 2024. All rights reserved.