Ответ
На проекте используется CI/CD пайплайн в Azure DevOps (YAML) с деплоем в облако Microsoft Azure. Процесс полностью автоматизирован.
Этапы пайплайна:
-
Сборка (Build):
- Восстановление зависимостей (
dotnet restore). - Компиляция решения в конфигурации Release (
dotnet build --configuration Release). - Запуск модульных и интеграционных тестов.
- task: DotNetCoreCLI@2
displayName: 'Run Tests'
inputs:
command: 'test'
projects: '*/.Tests.csproj'
arguments: '--configuration Release --collect:"XPlat Code Coverage"'
- Восстановление зависимостей (
-
Публикация артефактов:
- Создание готовых к развертыванию артефактов (
dotnet publish). - Публикация артефактов в пайплайн для последующих стадий.
- Создание готовых к развертыванию артефактов (
-
Развертывание (Release):
- Для веб-приложений (ASP.NET Core): Деплой в Azure App Service с использованием слотов развертывания (staging/production). Это позволяет выполнить предварительное тестирование и быстрый откат.
- Для сервисов: Деплой в Azure Kubernetes Service (AKS). Используется стратегия blue-green для минимизации простоя.
- Для баз данных: Автоматическое применение миграций Entity Framework Core через скрипты в пайплайне или инструменты вроде DbUp.
Дополнительные практики:
- Feature Flags: Новый функционал включается постепенно через конфигурацию (например, с помощью библиотеки
Microsoft.FeatureManagement). - Мониторинг: После деплоя ведется наблюдение через Application Insights (логи, метрики, производительность) и Azure Monitor.
- Откат (Rollback): В случае проблем выполняется переключение на предыдущий слот (App Service) или образ (AKS).
Ответ 18+ 🔞
Давай разберём эту вашу CI/CD магию в Azure DevOps, как есть, без соплей. Система, вроде, умная, а на деле — просто набор скриптов, которые либо делают тебе хорошо, либо разносят всё к ебеням.
Слушай сюда, вот как это у нас крутится, по косточкам:
Этап первый: Сборка (Build) — тут мы код проверяем, чтоб не хуйню собирать
Первым делом, пайплайн хватает наш код и начинает его мучать. Сначала dotnet restore — подтягивает все эти ваши пакеты, эти бесчисленные зависимости, которые весят, как чугунный мост. Потом dotnet build в конфигурации Release — компилирует всё так, чтоб летало, а не плевалось исключениями.
А дальше — святое: тесты. Если тесты не прошли — всё, пиздец, дальше ни шагу. Пайплайн просто посылает тебя нахуй, и правильно делает. Вот смотри, как это в ямле выглядит, код не трогаю, он святой:
- task: DotNetCoreCLI@2
displayName: 'Run Tests'
inputs:
command: 'test'
projects: '**/*.Tests.csproj'
arguments: '--configuration Release --collect:"XPlat Code Coverage"'
Задача DotNetCoreCLI@2 берет и гоняет все эти *.Tests.csproj. Аргумент --collect:"XPlat Code Coverage" — это чтобы потом умным видом смотреть, какой процент кода покрыт тестами. Если меньше 80% — стыдно должно быть, охренеть как стыдно.
Этап второй: Публикация артефактов — упаковываем наш скарб
После того как всё собралось и тесты не обосрались, нужно это дело упаковать. dotnet publish выплёвывает нам в папку publish всё, что нужно для запуска: бинарники, конфиги, вьюхи. Этот хлам потом пайплайн засовывает себе в артефакты, чтобы на этапе релиза достать, как из портфеля.
Этап третий: Развертывание (Release) — тут начинается ад или триумф Вот тут уже по-разному, в зависимости от того, куда мы деплоим.
-
Для веб-приложений (ASP.NET Core): Всё летит прямиком в Azure App Service. Но не просто так, а с прибабахом — слотами развертывания (staging/production). Сначала заливаем в staging, там ковыряемся, тестируем, убеждаемся, что не накосячили. Потом одним кликом — swap — и staging становится production. Если после этого всё легло — ещё один клик, и мы свапаем обратно. Откат быстрее, чем начальник успеет написать «ЧТО ПРОИСХОДИТ???». Гениально и просто.
-
Для сервисов в контейнерах: Тут уже Azure Kubernetes Service (AKS). Тоже не дураки — используем blue-green деплой. Разворачиваем новую версию (green) параллельно со старой (blue). Когда green поднялся и не помер, переключаем на него весь трафик. Если что-то пошло не так — переключаем обратно на blue. Просто и без паники, как переключить канал на телевизоре.
-
Для баз данных: Самое страшное. Автоматические миграции через Entity Framework Core или, что надёжнее, через DbUp. Скрипты накатываются в пайплайне, и каждый такой скрипт — это маленький инфаркт. Один неверный
ALTER TABLEи можно идти писать резюме. Поэтому их проверяют дохуя раз.
А теперь про дополнительные фишки, без которых сейчас никуда:
-
Feature Flags (Флаги функций): Это когда ты заливаешь новый код в продакшн, но он спит. А включаешь его только для себя, тестировщиков или 1% пользователей. Делается через
Microsoft.FeatureManagement. Если фича оказалась кривой — просто выключаешь флаг, и всё, как будто её и не было. Пользователи даже не узнают, что их чуть не наебали. -
Мониторинг: После деплоя — не расслабляемся. Врубаем Application Insights и Azure Monitor. Смотрим логи, метрики, производительность. Если что-то начало тормозить или падать — узнаём об этом первыми, а не из твиттера.
-
Откат (Rollback): Стратегия «нахуй-нахуй». Если всё пошло по пизде — для App Service это свап на предыдущий слот, для AKS — переключение трафика на старый под. Главное — делать это быстро, пока ущерб не превысил стоимость твоего годового оклада.
Вот и вся философия. Собрали, проверили, упаковали, залили на тест, переключили на прод, смотрим, не горит ли. Если горит — откатываем. Как по нотам. Только и всего.