我正在使用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/