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

aur*_*ath 6 continuous-integration nuget semantic-versioning azure-devops azure-pipelines

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

本文档中,它列出了几种自动生成SemVer字符串的不同方法。我特别想实现这一点:

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

但这就是他们所说的,没有提供任何示例。要了解更多信息的链接,将带您到本文档,其中说:

对于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使用此版本控制方案?

Dan*_*ann 13

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

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

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

  • 我会将其标记为答案,因为它很接近并且让我完成了剩下的工作。我错过了 `name` 字段在 yaml 的根部,而不是在变量部分或 nuget 部分中。我把它作为 yaml 文件的第一行。不过要注意狮子座,他有一个很好的观点。 (5认同)
  • `##[错误]在以下环境变量中找不到版本号数据:BUILD_BUILDNUMBER。变量的值应该包含一个带有或为正整数的子字符串。` 看起来它在环境变量中查找。 (2认同)

Emi*_*mil 8

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

注意-的第二个参数counter-是种子值,在从TeamCity等其他构建系统迁移构建时非常有用;它允许您在迁移时显式设置下一个构建版本。在Azure DevOps中进行迁移和初始构建之后,可以将种子值重新设置为零,或者每次majorMinorVersion更改时您可能希望使用的任何起始值(例如100):

参考:计数器表达式

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'
Run Code Online (Sandbox Code Playgroud)

  • 我使用了类似的解决方案,但如果我在接下来的 30 天(默认保留期)内不再构建,则最新构建将从历史记录中消失,$(rev:r) 再次重置为 1,NuGet 发布失败。 (2认同)
  • @HeinGustavsen我们还将构建从TeamCity迁移到Azure DevOps-请参见上面的更新示例;我当前的解决方案是使用计数器表达式函数来代替$(rev:r)的使用。希望对您有帮助... (2认同)

Sha*_*rpC 8

问题

我的问题:

  • 当尝试@Emil 的答案时,我的第一个包从 2.0 开始(我没有进行进一步的测试来调查)
  • 当尝试@Leo Liu-MSFT 的答案时,我无法找到匹配的“选项”选项卡。

因此,我使用了@LanceMcCarthy 的这个解决方案

使固定

设置变量:

variables:
  major: '1'
  minor: '0'
  revision: $[counter(variables['minor'], 1)] # This will get reset every time minor gets bumped.
  nugetVersion: '$(major).$(minor).$(revision)'
Run Code Online (Sandbox Code Playgroud)

然后在打包时用作nugetVersion 环境变量

- task: NuGetCommand@2
  inputs:
    command: 'pack'
    packagesToPack: '**/*.csproj'
    packDestination: '$(Build.ArtifactStagingDirectory)'
    versionEnvVar: 'nugetVersion'
    versioningScheme: 'byEnvVar'
Run Code Online (Sandbox Code Playgroud)


Leo*_*SFT 6

\n

Azure Pipeline Nuget 包版本控制方案,如何获取 \xe2\x80\x9c1.0.$(Rev:r)\xe2\x80\x9d

\n
\n\n

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

\n\n

在此输入图像描述

\n\n

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

\n\n

在此输入图像描述

\n\n

0 和 2 之间有两个.(在新选项卡中打开上图)。显然,这是非常奇怪的。因此,我将内部版本号格式更改为:

\n\n
$(Major).$(Minor)$(rev:.r)\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者

\n\n
$(Major).$(Minor).$(rev:r)\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,一切正常。

\n\n

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

\n\n

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

\n\n

希望这可以帮助。

\n


Rob*_*ert 5

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

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

根据Azure Pipeline YAML 方案的官方文档,是

name: string  # build numbering format
resources:
  containers: [ containerResource ]
  repositories: [ repositoryResource ]
variables: { string: string } | [ variable | templateReference ]
trigger: trigger
pr: pr
stages: [ stage | templateReference ]
Run Code Online (Sandbox Code Playgroud)

看第一行:

name: string  # build numbering format
Run Code Online (Sandbox Code Playgroud)

对,就是那样!

所以你可以像这样定义它

name: 1.0.$(Rev:r)
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢语义版本控制。然后

其次,versioningScheme: 'byBuildNumber'任务 NuGetCommand@2 中的含义是什么?

这真的很简单:只需使用name!

最后但并非最不重要的

Package VersioningPack NuGet 包的官方文档没有明确说明内部版本号到底是什么以及如何定义它。这真的是误导。作为一名 MS 员工,我感到非常难过,因为我不得不求助于外部资源来澄清这一切。

  • 这正是我所困惑的,并试图找到答案......谢谢! (2认同)