CI/CD для .NET-микросервисов и фронта в GitLab: пайплайн от MR до прода

↑ 7.6 DevOps для бэкенд-разработчика · ← Предыдущая · → Следующая

По желанию~5 мин чтенияУровень: senior

Зачем это на собесе

Ждут описания пайплайна: какие стадии, какие проверки, как выкатывать.

Объяснение

Типовой пайплайн:

СтадияЗадачи
Merge requestbuild, unit-тесты, линтеры, SAST, сканирование зависимостей, превью-окружение
mainте же + интеграционные тесты, сборка и push образа с тегом коммита
stageавтодеплой, smoke/e2e-тесты
prodручное подтверждение (manual) или автодеплой по политике, миграции, проверка health
послеуведомление, метки версии, мониторинг
stages: [test, build, deploy]
variables: { IMAGE: "$CI_REGISTRY_IMAGE/orders-api:$CI_COMMIT_SHORT_SHA" }
 
test:
  stage: test
  image: mcr.microsoft.com/dotnet/sdk:9.0
  script:
    - dotnet restore && dotnet build -c Release --no-restore
    - dotnet test -c Release --no-build --collect:"XPlat Code Coverage"
  coverage: '/Total\s+\|\s+(\d+(\.\d+)?)/'
  cache: { key: nuget, paths: [.nuget/] }
 
build_image:
  stage: build
  image: docker:27
  services: [docker:27-dind]
  script:
    - docker build -t "$IMAGE" .
    - docker push "$IMAGE"
  rules: [{ if: '$CI_COMMIT_BRANCH == "main"' }]
 
deploy_stage:
  stage: deploy
  script: [ansible-playbook -i inventories/stage deploy.yml -e image=$IMAGE]
  environment: { name: stage }
  rules: [{ if: '$CI_COMMIT_BRANCH == "main"' }]
 
deploy_prod:
  stage: deploy
  script: [ansible-playbook -i inventories/prod deploy.yml -e image=$IMAGE]
  environment: { name: production }
  when: manual
  rules: [{ if: '$CI_COMMIT_BRANCH == "main"' }]

Для фронтенда: npm ci, линтеры, unit-тесты, сборка статики, публикация в образ nginx или в объектное хранилище.

Практики: кэш зависимостей, параллельные джобы (parallel, needs), переменные CI (masked/protected) для секретов, окружения (environment) с историей деплоев, защищённые ветки, обязательное ревью, откат = повторный деплой предыдущего тега.

Нюансы и подводные камни

  • Секреты в логах CI: masked variables, не печатать окружение.
  • Разные образы для stage и prod нарушают принцип «собрали один раз».
  • Медленный пайплайн убивает практику частых релизов: кэш, параллелизм, разделение быстрых и медленных тестов.
  • Без ручного шага или защит на prod случайный мерж уходит в прод.
  • Runner’ы — точка доверия: изолируйте, ограничивайте права.

Практика

  1. Соберите пайплайн MR → main → stage → prod для сервиса.
  2. Добавьте кэш NuGet и параллельные джобы, сократите время.
  3. Настройте protected variables для prod-секретов.

Вопросы с ответами

Связанные темы