Я настраиваю семантическое управление версиями с помощью 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
но я не знаю, как извлечь содержимое <VersionPrefix>
из csproj через CLI.
Какой-нибудь совет, хорошее чтение или решение для моего подхода, если он верен?
Спасибо