我正在使用GitLab为我的dotnet核心应用程序和netstandard 2.0软件包配置语义版本控制。

在阅读了很多意见之后,其中一些意见是矛盾的,这对我来说很清楚。
语义版本应类似于M.m.P.B-abc123其中

  • M是主要版本
  • m是次要版本
  • P是修补程序版本
  • B是构建版本(可选)
  • -abc123是后缀(可选),以防我使用预发行版本。它必须以字母
  • 开头

    因此以下软件包版本将是有效的:
  • 1.0.0
  • 1.0.1.20190301123
  • 1.0.1.20190301123-beta
  • 1.0.1-rc1

  • 我具有以下gitlab脚本进行版本控制
    #Stages
    stages:
      - ci
      - pack
    
    #Global variables
    variables:
      GITLAB_RUNNER_DOTNET_CORE: mcr.microsoft.com/dotnet/core/sdk:2.2
      NUGET_REPOSITORY: $NEXUS_NUGET_REPOSITORY
      NUGET_API_KEY: $NEXUS_API_KEY
      NUGET_FOLDER_NAME: nupkgs
    
    #Docker image
    image: $GITLAB_RUNNER_DOTNET_CORE
    
    #Jobs
    ci:
      stage: ci
      script:
        - dotnet restore --no-cache --force
        - dotnet build --configuration Release
        - dotnet vstest *Tests/bin/Release/**/*Tests.dll
    
    pack-beta-nuget:
      stage: pack
      script:
        - export VERSION_SUFFIX=beta$CI_PIPELINE_ID
        - dotnet pack *.sln --configuration Release --output $NUGET_FOLDER_NAME --version-suffix $VERSION_SUFFIX --include-symbols
        - dotnet nuget push **/*.nupkg --api-key $NUGET_API_KEY --source $NUGET_REPOSITORY
      except:
        - master
    
    pack-nuget:
      stage: pack
      script:
        - dotnet restore
        - dotnet pack *.sln --configuration Release --output $NUGET_FOLDER_NAME
        - dotnet nuget push **/*.nupkg --api-key $NUGET_API_KEY --source $NUGET_REPOSITORY
      only:
        - master
    

    这将生成如下软件包:
    主分支(稳定或生产就绪)的1.0.0和其他任何分支的1.0.0-beta1234567

    我的方法的问题在于,我有多个项目的VS解决方案,每个项目将是一个nuget包,并且每个项目都有其自己的版本。有时,我修改了一个项目,但没有修改另一个项目,因此,从理论上讲,我当然不需要为我没有接触过的项目生成新的构件,也不需要新版本。

    现在,我的nuget存储库可以防止覆盖程序包,因此,如果有一个XXX.YYY 1.0.0,并且我生成另一个XXX.YYY 1.0.0并将其推送到存储库中,它将引发错误,并且管道将失败。

    我以为,每次运行CI/CD管道时生成一个新软件包也许不是一个坏主意,所以我考虑引入内部版本号,并使用XXX.YYY 1.0.0.12345之类的东西,即使我什么都没有碰到,下次将产生一个新的软件包XXX.YYY 1.0.0.123499

    在连续部署方案中,这是正确的方法吗?还是我应该寻找一种方法来使我的脚本更智能,并且如果nuget存储库中已有相同版本的工件,又不产生新工件呢?

    假定始终可以使用内部版本号,如何确保仅从管道中检索内部版本号,但M.m.P版本号仍保留在我的csproj中,如下所示?
    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <Description>Whatever</Description>
        <VersionPrefix>1.0.1</VersionPrefix>
      </PropertyGroup>
    </Project>
    

    我需要类似的东西:dotnet pack *.sln --configuration Release -p:PackageVersion=$FIXED_VERSION.$CI_PIPELINE_ID --output nupkg
    但我不知道如何通过CLI从csproj中检索<VersionPrefix>内容。

    如果我的方法有效,是否有任何建议,良好的阅读方法或解决方案?

    谢谢

    最佳答案



    由于持续集成管道无法确定您的代码是新的次要版本还是主要版本,因此您将始终必须确定程序包应获取的语义版本。这使整个过程变得容易得多。

    Visual Studio团队服务部的员工对此有以下说法:



    如前所述,您仍然需要自己为新软件包选择一个版本。对于实际发布最终软件包(在您的情况下为master分支)之前的过程,您可以使用预发行标签将内部版本号作为预发行标签。

    如果不做任何明智的事情,这将为每个运行的管道发布一个新的程序包。视觉工作室团队的服务人员,我认为这不是一件坏事,但这取决于每个人的个人喜好

    关于.net-core - 连续部署环境中的dotnet语义版本控制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55596003/

    10-14 19:39
    查看更多