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