Gitversion 在 devops 构建中使用日期作为主要版本

Gitversion using date as major version in devops build

我有几个要添加 gitversion 的网络应用程序。主要问题 - GitVersion 正在生成 MajorMinorPatchTag,其中 Major 的格式为 yyyymmdd。除了这不是一个有效的主要版本之外,我希望在下面的示例中使用通常的版本控制 0.1.3.alpha.1,但我得到的是 20201021.1.1.

我已经从 repo 中删除了所有旧的构建标签,所以它似乎没有从标签中找到它。有没有其他地方我可以强制它忽略以前的构建版本并使用从 gitversion.yml/next-version 设置开始的 semver?

详情如下:

gitversion.yml很简单:

assembly-versioning-scheme: MajorMinorPatchTag
mode: Mainline 
next-version: 0.1.3 
increment: Inherit
branches:
 feature:
   tag: alpha
 master:
   tag: 
ignore:
 sha: []

DevOps 构建任务有

Gitversion

steps:
- task: gittools.usegitversion.gitversion-task.UseGitVersion@5
  displayName: GitVersion
  inputs:
    versionSpec: 5.x

建造

steps:
- task: DotNetCoreCLI@2
  displayName: Build
  inputs:
    projects: '$(Parameters.RestoreBuildProjects)'
    arguments: '--configuration $(BuildConfiguration) /p:Version=$(GitVersion.SemVer) 

'

gitversion任务输出如下:

Installing GitVersion.Tool version 5.x
-------------------------- 
Found tool in cache: GitVersion.Tool 5.3.7 x64
Prepending PATH environment variable with directory: C:\DevOps\_work\_tool\GitVersion.Tool.3.7\x64
C:\DevOps\_work\_tool\GitVersion.Tool.3.7\x64\dotnet-gitversion.exe C:/DevOps/_work/31/s /output buildserver /nofetch
INFO [10/21/20 20:51:49:55] Working directory: C:/DevOps/_work/31/s
INFO [10/21/20 20:51:49:57] Branch from build environment: refs/heads/master
INFO [10/21/20 20:51:49:57] Project root is: C:\DevOps\_work\s\
INFO [10/21/20 20:51:49:57] DotGit directory is: C:\DevOps\_work\s\.git
INFO [10/21/20 20:51:49:57] Begin: Normalizing git directory for branch 'refs/heads/master'
INFO [10/21/20 20:51:49:61] One remote found (origin -> 'https://example.com/asfalis/Legacy/_git/example.WebApi.exampleWebhookHandler').
INFO [10/21/20 20:51:49:61] Skipping fetching, if GitVersion does not calculate your version as expected you might need to allow fetching or use dynamic repositories
INFO [10/21/20 20:51:49:61] Updating local branch refs/heads/master to point at 0311e72378d5187490b39eddbfff243643b952c1
INFO [10/21/20 20:51:49:65] HEAD points at branch 'refs/heads/master'.
INFO [10/21/20 20:51:49:65] End: Normalizing git directory for branch 'refs/heads/master' (Took: 78.57ms)
INFO [10/21/20 20:51:49:67] Begin: Loading version variables from disk cache
INFO [10/21/20 20:51:49:67] Begin: Deserializing version variables from cache file C:\DevOps\_work\s\.git\gitversion_cacheEC1078831A476936644C50EA5AB6347D5E7CD7.yml
INFO [10/21/20 20:51:49:73] End: Deserializing version variables from cache file C:\DevOps\_work\s\.git\gitversion_cacheEC1078831A476936644C50EA5AB6347D5E7CD7.yml (Took: 61.06ms)
INFO [10/21/20 20:51:49:73] End: Loading version variables from disk cache (Took: 63.28ms)
INFO [10/21/20 20:51:49:75] Using latest commit on specified branch
Executing GenerateSetVersionMessage for 'AzurePipelines'.
Executing GenerateBuildLogOutput for 'AzurePipelines'.
INFO [10/21/20 20:51:49:79] Done writing 
Async Command Start: Update Build Number
Update build number to 20200619.1.1+1 for build 441
Async Command End: Update Build Number
Finishing: GitVersion

构建时出现错误

....AssemblyInfo.cs(19,55): Error CS7034: The specified version string does not conform to the required format - major[.minor[.build[.revision]]]

更新 1

移动到 GitTools 包后,这是“建立版本”任务的输出:

C:\DevOps\_work\_tool\GitVersion.Tool.1.3\x64\dotnet-gitversion.exe C:/DevOps/_work/31/s /output json /output buildserver
{
  "Major":20200619,
  "Minor":1,
  "Patch":1,
  "PreReleaseTag":"",
  "PreReleaseTagWithDash":"",
  "PreReleaseLabel":"",
  "PreReleaseNumber":"",
  "WeightedPreReleaseNumber":"",
  "BuildMetaData":1,
  "BuildMetaDataPadded":"0001",
  "FullBuildMetaData":"1.Branch.master.Sha.0311e72378d5187490b39eddbfff243643b952c1",
  "MajorMinorPatch":"20200619.1.1",
  "SemVer":"20200619.1.1",
  "LegacySemVer":"20200619.1.1",
  "LegacySemVerPadded":"20200619.1.1",
  "AssemblySemVer":"20200619.1.1.0",
  "AssemblySemFileVer":"20200619.1.1.0",
  "FullSemVer":"20200619.1.1+1",
  "InformationalVersion":"20200619.1.1+1.Branch.master.Sha.0311e72378d5187490b39eddbfff243643b952c1",
  "BranchName":"master",
  "Sha":"0311e72378d5187490b39eddbfff243643b952c1",
  "ShortSha":"0311e72",
  "NuGetVersionV2":"20200619.1.1",
  "NuGetVersion":"20200619.1.1",
  "NuGetPreReleaseTagV2":"",
  "NuGetPreReleaseTag":"",
  "VersionSourceSha":"e40a0b671680c65428fe13610ee4cca25eefeaac",
  "CommitsSinceVersionSource":1,
  "CommitsSinceVersionSourcePadded":"0001",
  "CommitDate":"2020-10-21"
}

GitTools.UseGitVersion is deprected thus I recommend you switch to GitTools bundle 然后你可以这样使用它:

steps:
- task: gitversion/setup@0
  enabled: true
  displayName: Install GitVersion
  inputs:
    versionSpec: '5.1.3'

- task: gitversion/execute@0
  enabled: true
  displayName: 'Establish Version'

- powershell: Write-Host "##vso[build.updatebuildnumber]$(FullSemVer)"
  displayName: 'Update build number to $(FullSemVer)'

然后你可以试试

- task: DotNetCoreCLI@2
  displayName: Build
  inputs:
    projects: '$(Parameters.RestoreBuildProjects)'
    arguments: '--configuration $(BuildConfiguration) /p:Version=$(FullSemVer) 

请检查这个link

  steps:
  - task: gitversion/setup@0
    displayName: Install GitVersion
    inputs:
      versionSpec: '5.1.3'
  - task: gitversion/execute@0
    displayName: Use GitVersion
  - script: |
      echo FullSemVer: $(fullSemVer)
      echo ##vso[build.updatebuildnumber]$(fullSemVer)
      echo Major: ${{ steps.gitversion.outputs.major }}
      echo Minor: ${{ steps.gitversion.outputs.minor }}
      echo Patch: ${{ steps.gitversion.outputs.patch }}
      echo PreReleaseTag: ${{ steps.gitversion.outputs.preReleaseTag }}
      echo PreReleaseTagWithDash: ${{ steps.gitversion.outputs.preReleaseTagWithDash }}
      echo PreReleaseLabel: ${{ steps.gitversion.outputs.preReleaseLabel }}
      echo PreReleaseNumber: ${{ steps.gitversion.outputs.preReleaseNumber }}
      echo WeightedPreReleaseNumber: ${{ steps.gitversion.outputs.weightedPreReleaseNumber }}
      echo BuildMetaData: ${{ steps.gitversion.outputs.buildMetaData }}
      echo BuildMetaDataPadded: ${{ steps.gitversion.outputs.buildMetaDataPadded }}
      echo FullBuildMetaData: ${{ steps.gitversion.outputs.fullBuildMetaData }}
      echo MajorMinorPatch: ${{ steps.gitversion.outputs.majorMinorPatch }}
      echo SemVer: ${{ steps.gitversion.outputs.semVer }}
      echo LegacySemVer: ${{ steps.gitversion.outputs.legacySemVer }}
      echo LegacySemVerPadded: ${{ steps.gitversion.outputs.legacySemVerPadded }}
      echo AssemblySemVer: ${{ steps.gitversion.outputs.assemblySemVer }}
      echo AssemblySemFileVer: ${{ steps.gitversion.outputs.assemblySemFileVer }}
      echo InformationalVersion: ${{ steps.gitversion.outputs.informationalVersion }}
      echo BranchName: ${{ steps.gitversion.outputs.branchName }}
      echo Sha: ${{ steps.gitversion.outputs.sha }}
      echo ShortSha: ${{ steps.gitversion.outputs.shortSha }}
      echo NuGetVersionV2: ${{ steps.gitversion.outputs.nuGetVersionV2 }}
      echo NuGetVersion: ${{ steps.gitversion.outputs.nuGetVersion }}
      echo NuGetPreReleaseTagV2: ${{ steps.gitversion.outputs.nuGetPreReleaseTagV2 }}
      echo NuGetPreReleaseTag: ${{ steps.gitversion.outputs.nuGetPreReleaseTag }}
      echo VersionSourceSha: ${{ steps.gitversion.outputs.versionSourceSha }}
      echo CommitsSinceVersionSource: ${{ steps.gitversion.outputs.commitsSinceVersionSource }}
      echo CommitsSinceVersionSourcePadded: ${{ steps.gitversion.outputs.commitsSinceVersionSourcePadded }}
      echo CommitDate: ${{ steps.gitversion.outputs.commitDate }}

也许作为解决方法,您将能够使用这些将它们组合到 SemVer 中:

      echo Major: ${{ steps.gitversion.outputs.major }}
      echo Minor: ${{ steps.gitversion.outputs.minor }}
      echo Patch: ${{ steps.gitversion.outputs.patch }}

正在查看here我想可能是你发布的列表导致的。你能验证一下吗?如果这是真的,请发布一个符合我预期的架构版本控制的版本,然后重试 运行 你的构建。

感谢 Krzysztof Madej 对此提供的帮助。

原来“问题”出在 Git 上,因为它不会自动修剪本地存储库中的标签。 (“问题”并不是真正的错误 - 有充分的理由不修剪本地标签)。

因此,当使用我们的自托管构建服务器时,旧标签 (yyyymmdd.1.1) 仍然存在于先前构建的代理上,即使我在服务器上删除了这些标签。因为yyyymmdd大于我想要的semver major,所以改用了。下游,构建抱怨无效的主要版本。

如果您正在使用 MS 托管代理,您每次都会得到一个干净的 git 存储库,因此没有旧标签,没有问题。

如果使用 self-hosted 代理,解决方法 - 在管道源上设置清理选项。

对于本地构建,发出“git fetch origin --prune --prune-tags”(未测试,但我从 this post 那里得到了线索)