Add pipline/nuget_build-push.yml

This commit is contained in:
pashko 2025-08-07 08:54:21 +08:00
parent 9de2fbdd9b
commit 7aaf88bc67

View File

@ -0,0 +1,106 @@
stages:
- build
- test
- publish
variables:
DOTNET_ROOT: "/opt/dotnet/dotnet"
PATH: "${PATH}:${DOTNET_ROOT}:${DOTNET_ROOT}/tools"
BUILD_ARTIFACTS: "${CI_PROJECT_DIR}/artifacts"
NUGET_CONFIG: "/opt/tt/NuGet_microservice.Config"
# Кэширование пакетов NuGet между запусками (опционально)
cache:
key: nuget
paths:
- .nuget/packages
# Образ должен быть предварительно собран и загружен в ваш реестр
image: your-registry.com/your-dotnet-sdk:7.0
before_script:
- mkdir -p $BUILD_ARTIFACTS
- echo "Очистка локальных кэшей NuGet"
- dotnet nuget locals all --clear
build-and-test:
stage: build
script:
# Шаг 02: Восстановление зависимостей с кастомным NuGet.config
- dotnet restore Packages.sln -ConfigFile $NUGET_CONFIG
# Шаг 04: Загрузка PFX-файла (пример из CI Variable)
- echo "$PFX_FILE_BASE64" | base64 -d > ./certs/signing.pfx
- export PFX_PATH="$CI_PROJECT_DIR/certs/signing.pfx"
- export PFX_PASSWORD="$PFX_CERT_PASSWORD" # Должна быть в CI Variables
# Шаг 05: Добавление appsettings.json (если нужен для тестов)
- mkdir -p Packages.Tests
- echo "$APPSETTINGS_JSON" > Packages.Tests/appsettings.json
# Шаг 03: Сборка всех проектов
- dotnet build **/*.csproj --configuration Release --no-restore --no-restore
# Шаг 06: Запуск тестов с генерацией TRX-отчётов
- dotnet test Packages.Tests/Packages.Tests.csproj \
--configuration Release \
--no-restore \
--logger trx \
--results-directory ./test-results \
/p:CollectCoverage=true \
/p:CoverletOutputFormat=cobertura
artifacts:
paths:
- $BUILD_ARTIFACTS/*.nupkg
- ./test-results/**/*.trx
- ./coverage.cobertura.xml
reports:
junit: ./test-results/**/*.trx # GitLab может конвертировать TRX → JUnit
coverage_report:
coverage_format: cobertura
path: ./coverage.cobertura.xml
expire_in: 1 week
rules:
- if: $CI_COMMIT_BRANCH == "develop"
when: always
- if: $CI_COMMIT_TAG
when: always
# Опционально: отдельный шаг для публикации (лучше контролировать)
publish-nuget:
stage: publish
image: your-registry.com/your-dotnet-sdk:7.0
script:
# Копирование nupkg в артефактную директорию
- mkdir -p $BUILD_ARTIFACTS
- find . -name "Packages*.nupkg" -not -name "*.symbols.nupkg" -exec cp {} $BUILD_ARTIFACTS/ \;
# Проверка наличия пакетов
- ls -la $BUILD_ARTIFACTS/
# Настройка источника NuGet (Nexus)
- dotnet nuget add source "$NUGET_FEED_URL" --name "nexus" --username "$NUGET_USER" --password "$NUGET_API_KEY" --store-password-in-clear-text
# Публикация всех nupkg, кроме symbols, с маской Packages.TST*
- |
for pkg in $BUILD_ARTIFACTS/Packages.TST*.nupkg; do
if [[ -f "$pkg" && "$pkg" != *".symbols.nupkg" ]]; then
echo "Pushing $pkg to Nexus..."
dotnet nuget push "$pkg" \
--source nexus \
--api-key "$NUGET_API_KEY" \
--skip-duplicate
fi
done
rules:
- if: $CI_COMMIT_BRANCH == "develop"
when: manual # Ручной запуск публикации
- if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+/ # Авто-публикация по тегу
when: always
environment:
name: production
url: $NUGET_FEED_URL