C#/.NET - 如何通过CI自动生成和增加软件包版本?

14

我有一个Visual Studio项目,构建为NuGet lib包。但每次发布包时,我都必须手动更改版本号。这是一个容易出错的工作。 我想自动生成并增加包版本号。


我找到了GitVersion工具来解决这个问题。我还发现一些语义化版本控制博客来解释持续交付中的包版本。


但不幸的是,GitVersion包对我来说不能正常工作。

  • 它会给我一个错误,指出AssemblyVersionAttribute重复。
  • 如果我将<GenerateAssemblyInfo>false</GenerateAssemblyInfo>添加到csproj文件中,它什么都不做,软件包版本将为0.0.0.0。

可能原因是我正在使用新的csproj格式。查看这里以查看csproj文件,文件看起来像这样:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net45;net47;netstandard2.0</TargetFrameworks>
  </PropertyGroup>
</Project>

感谢您的回复。


更新:

我发现提到我的问题有一个问题:Gitversion Task for VS2017-style csproj · Issue #1349 · GitTools/GitVersion。我正在尝试新的解决方案。


@AluanHaddad 正如我在问题中提到的,我已经尝试过 GitVersion 但它没有正常工作。我猜想它可能不支持 .NET Core 的新 *.csproj 文件格式。 - walterlv
@walterlv 抱歉错过了那个。 - Aluan Haddad
有一个名为“更改程序集版本”的 Jenkins 插件,你看过了吗? - information_interchange
@information_interchange 谢谢,我正在阅读。https://wiki.jenkins.io/display/JENKINS/Change+Assembly+Version - walterlv
3
@AluanHaddad GitVersion 能用了!抱歉,我之前使用了错误的配置文件。(我会为官方文档做出贡献以提及这一点。) - walterlv
显示剩余7条评论
3个回答

3

我不确定Jenkins是否能够自动生成一个增量数字或时间戳,并通过构建流水线中的环境变量进行访问。

我认为最灵活的方法是在你的csproj文件中添加一个带有占位符的PackageVersion标签,然后由构建流水线进行更改:

  <PropertyGroup>
    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
    <PackageVersion>$(PackageVersion)</PackageVersion>
  </PropertyGroup>

因此,在您的构建流程中,您只需传递版本号,例如:
dotnet build -p:PackageVersion=$(BUILD_TIMESTAMP)

如果所有版本值都来自构建管道,如何在每个开发人员的电脑上正确构建它? - walterlv
@walterlv 这个能够工作是因为当 <PackageVersion> 标签为空时,nupkg 的版本默认为 <Version> 标签。在开发 PC 上,<PackageVersion> 将显示为空,并且它将默认为 <Version> 号码,如果没有 <Version> 标签,则默认为 1.0.0。 - thepirat000

3
我们可以通过推送Git标签来触发GitHub Action,并且我们可以将Git标签名称作为版本号读取。然后可以使用此版本生成NuGet包。
有一个dotnet工具,可以将Git标签作为版本号读取并将其写入版本文件中。
在使用之前,我们应该创建版本文件并导入版本文件。
我们应该使用dotnet安装dotnetCampus.TagToVersion工具,然后使用该工具将Git标签写入版本文件。
第一步:
向仓库文件夹添加Directory.Build.props文件。
将代码写入Directory.Build.props文件中。
<Project>
  <Import Project="build\Version.props" />
</Project>

第二步:

创建一个名为build的文件夹,并将Version.props文件添加到该文件夹中。

将代码写入build\Version.props文件中。

<Project>
  <PropertyGroup>
    <Version>1.0.5</Version>
  </PropertyGroup>
</Project>

第三步: 在 .github\workflows 文件夹中编写 GitHub Action 配置文件,例如创建 .github\workflows\push tag and pack nuget.yml 文件。 通过标签推送触发该操作。
on:
  push:
    tags:
    - '*' 

使用dotnet工具将标签写成版本格式。

    - name: Install dotnet tool
      run: dotnet tool install -g dotnetCampus.TagToVersion

    - name: Set tag to version  
      run: dotnet TagToVersion -t ${{ github.ref }}

构建软件包

# Build and publish

    - name: Build with dotnet
      run: dotnet build --configuration Release

    - name: Install Nuget
      uses: nuget/setup-nuget@v1
      with:        
        nuget-version: '5.x'

    - name: Add private GitHub registry to NuGet
      run: |
        nuget sources add -name github -Source https://nuget.pkg.github.com/ORGANIZATION_NAME/index.json -Username ORGANIZATION_NAME -Password ${{ secrets.GITHUB_TOKEN }}
    - name: Push generated package to GitHub registry
      run: |
        nuget push .\bin\release\*.nupkg -Source github -SkipDuplicate
        nuget push .\bin\release\*.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NugetKey }} -NoSymbols 

请查看https://github.com/dotnet-campus/dotnetCampus.TagToVersion


如何在不打标签的情况下将每个构建发布到NuGet? - Shimmy Weitzhandler

2
实际上,GitVersionTask并不难使用。你需要做的只有以下几点:
  1. NuGet安装GitVersionTask
  2. 添加一个名为GitVersion.yml的配置文件,并填写一些键值对。
  3. 给你的分支添加一个标签。
  4. 构建代码。
完成以上步骤后,你会发现输出的dll文件包含了语义化版本号。
我回答自己的问题,因为我错写了配置文件的名称,所以它没有正常工作。
以下是我的配置文件:
mode: ContinuousDelivery
increment: Inherit
tag-prefix: '[vV]'
source-branches: ['master', 'develop', 'hotfix']
branches:
    master:
        regex: master$
        mode: ContinuousDelivery
        tag: ''
        increment: Patch
        prevent-increment-of-merged-branch-version: true
        track-merge-target: false
        tracks-release-branches: false
        is-release-branch: true
    release:
        regex: r(elease$|(eleases)?[-/])
        mode: ContinuousDelivery
        tag: beta
        increment: Patch
        prevent-increment-of-merged-branch-version: true
        track-merge-target: false
        tracks-release-branches: false
        is-release-branch: true
    feature:
        regex: f(eatures)?[-/]
        mode: ContinuousDeployment
        tag: alpha
        increment: Minor
        prevent-increment-of-merged-branch-version: false
        track-merge-target: false
        tracks-release-branches: false
        is-release-branch: false

我已经在这里发布了配置文件的内容:使用GitVersion自动增加语义版本-walterlv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接