diff --git a/pipline/nuget_build-push.yml b/pipline/nuget_build-push.yml new file mode 100644 index 0000000..71251a5 --- /dev/null +++ b/pipline/nuget_build-push.yml @@ -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 \ No newline at end of file