CI/CD для .NET-микросервисов и фронта в GitLab: пайплайн от MR до прода
↑ 7.6 DevOps для бэкенд-разработчика · ← Предыдущая · → Следующая
Зачем это на собесе
Ждут описания пайплайна: какие стадии, какие проверки, как выкатывать.
Объяснение
Типовой пайплайн:
| Стадия | Задачи |
|---|---|
| Merge request | build, 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’ы — точка доверия: изолируйте, ограничивайте права.
Практика
- Соберите пайплайн MR → main → stage → prod для сервиса.
- Добавьте кэш NuGet и параллельные джобы, сократите время.
- Настройте protected variables для prod-секретов.
Вопросы с ответами
Чем continuous delivery отличается от continuous deployment?
Delivery — код всегда готов к выкладке, выкладка вручную; deployment — автоматически в прод после проверок.
Как откатить релиз?
Развернуть предыдущий образ (тег) и при необходимости откатить совместимую миграцию.