Моделирование сложного рабочего процесса с параллельными стадиями и зависимостями между ними.
→Используйте многостадийные конвейеры YAML. Используйте ключевое слово `dependsOn` для зависимостей стадий и настройте параллельные задания в пределах стадий.
Почему: YAML предоставляет наиболее гибкий, основанный на коде подход для сложной оркестровки, превосходящий классические конвейеры или связывание отдельных конвейеров.
Реализовать развертывание веб-приложения с нулевым временем простоя, низким риском и возможностью мгновенного отката.
→Используйте слоты развертывания Azure App Service. Разверните в промежуточный (зеленый) слот, проверьте, затем выполните переключение слота с production (синим).
Почему: Переключение слотов — это атомарная, почти мгновенная операция, которая перенаправляет трафик. Откат так же прост, как и обратное переключение.
Источник↗
Минимизировать дублирование конвейеров для многочисленных микросервисов, которые используют общие шаги сборки/развертывания, но требуют специфических настроек.
→Создайте шаблоны YAML в центральном репозитории. В каждом конвейере, специфичном для службы, используйте ключевое слово `extends` и передайте параметры для настройки.
Почему: `extends` продвигает принципы DRY и обеспечивает соблюдение стандартов, допуская при этом гибкость через параметры. Более мощный, чем группы задач, для целых структур конвейеров.
Ограничить выполнение стадии конвейера (например, развертывание в production) только слияниями в определенную ветку (например, main).
→Используйте `condition` на стадии или задании. Например, `condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))`.
Почему: Сборки проверки PR используют другую ссылку на исходную ветку (например, `refs/pull/...`), поэтому это условие корректно предотвращает развертывание во время жизненного цикла PR.
Развертывание приложений из Azure DevOps на локальные серверы за корпоративным брандмауэром.
→Установите локальные агенты на локальные серверы. Зарегистрируйте их в пуле агентов в Azure DevOps.
Почему: Локальные агенты инициируют исходящую связь с Azure DevOps, поэтому входящие правила брандмауэра не требуются. Они могут получить доступ к локальным сетевым ресурсам для развертывания.
Требовать многократное подтверждение для развертываний в production и ограничивать их определенными окнами обслуживания.
→Определите среду Azure DevOps для production. Настройте утверждения с требуемыми утверждающими. Добавьте проверку "Рабочие часы" в качестве шлюза для обеспечения временного окна.
Почему: Среды централизуют контроль развертывания. Утверждения и шлюзы обеспечивают надежное, автоматизированное применение политик перед запуском стадии.
Контролировать доступность функций для пользователей без повторного развертывания приложения, с обновлениями почти в реальном времени.
→Используйте Azure App Configuration для управления функциями. Инструментируйте приложение для чтения флагов и включите его возможности динамического обновления.
Почему: Отделяет выпуски функций от развертываний. App Configuration предоставляет централизованный UI и SDK для динамических обновлений, избегая перезапусков приложений.
Декларативное управление состоянием кластера Kubernetes, где Git является единственным источником истины, а изменения применяются автоматически.
→Разверните агент GitOps, такой как Flux или ArgoCD, в кластере AKS. Настройте агент для мониторинга репозитория Git, содержащего манифесты Kubernetes, и автоматической синхронизации состояния кластера.
Почему: Эта pull-модель обеспечивает непрерывное согласование и обнаружение отклонений, что является основой GitOps. Она более надежна, чем push-конвейеры `kubectl`.
Управление состоянием Terraform для командной работы, обеспечение безопасности и предотвращение одновременных изменений.
→Настройте бэкенд Terraform для использования учетной записи хранения Azure. Это обеспечивает удаленное хранение состояния, с блокировкой состояния, обрабатываемой через аренду Azure Blob.
Почему: Предотвращает повреждение файла состояния из-за одновременных операций `apply` и исключает конфиденциальные данные состояния из системы контроля версий.
Источник↗
В монорепозитории запускать конвейер CI приложения только при изменении файлов в его конкретной директории (или в общей директории).
→В YAML конвейера используйте фильтр `trigger.paths.include` для указания соответствующих директорий, например, `include: ['/apps/frontend/**', '/apps/shared/**']`.
Почему: Это позволяет избежать ненужных сборок для несвязанных изменений кода, экономя время CI и вычислительные ресурсы.
Оптимизировать стадию тестирования с быстрыми (модульными) и медленными (интеграционными) тестами для более быстрой обратной связи.
→Запускайте модульные тесты и интеграционные тесты в параллельных заданиях в рамках одной стадии.
Почему: Параллельное выполнение значительно ускоряет получение результатов модульных тестов, в то время как более медленные тесты выполняются одновременно. Общая продолжительность стадии определяется самым длинным заданием, а не суммой.
Автоматически версионировать пакет библиотеки на основе истории коммитов, чтобы четко сообщать о влиянии изменений (breaking, feature, fix).
→Интегрируйте инструмент, такой как GitVersion, в конвейер CI. Он анализирует сообщения коммитов, ветки и теги для автоматического расчета версии SemVer (Major.Minor.Patch).
Почему: SemVer обеспечивает осмысленное версионирование, на которое потребители могут полагаться для управления зависимостями, в отличие от номеров сборок или хешей коммитов.
Развертывание приложения в нескольких географических регионах поочередно, с проверкой после каждого регионального развертывания.
→Используйте многостадийный YAML конвейер с последовательными стадиями, по одной для каждого региона, используя `dependsOn` для обеспечения порядка. Используйте шлюзы среды между стадиями для проверки.
Почему: Эта модель развертывания на основе кольца ограничивает радиус поражения неудачного развертывания одной областью, позволяя выполнить откат до того, как это повлияет на всех пользователей.
Настроить конвейер для поддержки модели разработки на основе магистральной ветви (trunk-based development), гарантируя, что основная ветвь всегда готова к развертыванию.
→Настройте триггер CI для ветки `main`. Обеспечьте PR политикой проверки сборки, которая выполняет быстрые, всесторонние тесты. Интегрируйте быстрые уведомления (например, в Teams/Slack) о сбоях сборки.
Почему: Немедленная обратная связь критически важна в разработке на основе магистральной ветви. Эта комбинация предотвращает слияние нерабочего кода и обеспечивает быстрое устранение проблем при их возникновении.
Эффективно передавать большие артефакты (например, модели ML, >5 ГБ) между стадиями конвейера.
→Загрузите большой артефакт в Azure Blob Storage на стадии производителя. Передайте URI BLOB-объекта на стадию потребителя в качестве выходной переменной.
Почему: Azure Blob Storage более экономичен и производителен, чем встроенные артефакты конвейера, для файлов размером в несколько гигабайт.
Сократить время сборки, избегая повторной загрузки зависимостей (например, NuGet, npm) при каждом запуске.
→Используйте задачу `Cache@2`. Определите ключ на основе файла блокировки пакета (например, `packages.lock.json`). Задача будет хранить и восстанавливать папку зависимостей.
Почему: Может сэкономить несколько минут на каждой сборке, восстанавливая из быстрого локального кеша вместо получения из внешних репозиториев.
Создавать или развертывать один и тот же код для нескольких целей (например, разных ОС, регионов) параллельно.
→Используйте `strategy: matrix` в задании конвейера YAML. Определите переменные для каждой комбинации, что сгенерирует задание для каждой записи матрицы.
Почему: Стратегия матрицы поддерживает определение конвейера по принципу DRY, создавая несколько вариаций заданий из одного определения и запуская их параллельно.
Реализовать канареечное развертывание в AKS, которое автоматически переключает трафик и продвигает или откатывает изменения на основе метрик в реальном времени.
→Используйте контроллер прогрессивной доставки, такой как Flagger, интегрированный с service mesh (например, Istio) и поставщиком метрик (например, Prometheus).
Почему: Flagger автоматизирует весь процесс канареечного анализа, обеспечивая более безопасную и надежную прогрессивную доставку, чем ручные скрипты.
Конвейер приложения должен запускаться при изменении кода в его собственном репозитории ИЛИ в отдельном, общем репозитории библиотеки.
→В YAML приложения определите общую библиотеку в `resources.repositories` и настройте блок `trigger` для этого ресурса.
Почему: Создает декларативную зависимость между репозиториями, гарантируя, что приложение всегда пересобирается с последними общими компонентами.
Конвейер должен создавать временную инфраструктуру для тестирования и гарантировать ее уничтожение после, даже если тесты завершатся неудачно.
→Используйте многостадийный конвейер с отдельными стадиями apply и destroy для IaC (Terraform/Bicep). Настройте стадию destroy с `condition: always()`.
Почему: Условие `always()` гарантирует выполнение стадии очистки независимо от успеха или неудачи предыдущих стадий, предотвращая появление потерянных ресурсов.
Предотвратить продолжение развертывания в production, если нет утвержденного запроса на изменение в инструменте ITSM, таком как ServiceNow.
→Настройте шлюз среды, который вызывает шлюз "Query ServiceNow" для проверки статуса запроса на изменение.
Почему: Автоматизирует интеграцию с корпоративными процессами управления изменениями, обеспечивая соответствие без ручных передач.
Предоставить пул локальных агентов сборки, который динамически масштабируется в соответствии со спросом для сокращения времени ожидания в очереди и контроля затрат.
→Настройте пул агентов Azure DevOps, используя масштабируемый набор виртуальных машин Azure (VMSS), настроенный на автоматическое масштабирование на основе количества ожидающих заданий.
Почему: Агенты VMSS сочетают в себе настраиваемость локальных агентов с эластичностью облачных агентов, оптимизируя производительность и стоимость.
Развертывание изменений схемы базы данных таким образом, чтобы предотвратить потерю данных и поддерживать откаты.
→Используйте инструмент миграции (например, Flyway, DbUp). Реализуйте шаблон expand/contract для изменений схемы, чтобы сохранить обратную совместимость.
Почему: Инструменты миграции обеспечивают версионирование и контроль. Шаблон expand/contract разделяет откаты приложений и баз данных, обеспечивая более безопасные развертывания.
Локальные агенты испытывают нехватку дискового пространства из-за накопленных артефактов сборки.
→В YAML конвейера, на уровне задания, настройте `workspace: clean: all`.
Почему: Эта превентивная конфигурация конвейера устраняет основную причину без необходимости ручного вмешательства или постоянных изменений инфраструктуры.
Интеграционные тесты требуют изолированного экземпляра базы данных для каждого запуска конвейера.
→Определите ресурс контейнера (например, SQL Server, Postgres) как службу в YAML конвейера. Затем тестовое задание может подключиться к этой временной службе.
Почему: Обеспечивает быстрые, изолированные и автоматически очищаемые зависимости для тестов, предотвращая вмешательство в тесты и упрощая настройку.
Повысить надежность и производительность восстановления пакетов из публичных репозиториев (например, npmjs, nuget.org).
→В Azure Artifacts создайте канал и настройте восходящие источники, указывающие на публичные репозитории. Настройте клиенты для потребления пакетов из канала Azure Artifacts.
Почему: Канал кэширует пакеты из восходящих источников, защищая от сбоев публичных репозиториев и ускоряя восстановление часто используемых пакетов.
Развернуть Helm chart в нескольких средах (dev, prod) с различными значениями конфигурации.
→Используйте отдельные файлы `values-<env>.yaml` для каждой среды. В задаче `HelmDeploy` используйте вход `valueFile` для указания соответствующего файла и `overrideValues` для внедрения динамических значений, таких как теги образов.
Почему: Этот шаблон разделяет статическую конфигурацию среды от динамических переменных конвейера, сохраняя развертывания чистыми и удобными в обслуживании.