Непрерывное развертывание в Azure
Расширьте конвейер этапом развертывания, который отправляет артефакт сборки в слот App Service, выполняет быстрые проверки и после подтверждения переключает его в рабочую среду.
«Непрерывное развертывание в Azure» — бесплатный урок Cloud & IT Cert Prep на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cloud & IT Cert Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cloud & IT Cert Prep содержит 4 уроков всего.
Что такое непрерывное развертывание
Непрерывное развертывание (CD) автоматически выпускает каждое изменение, прошедшее тесты CI, в рабочую среду без ручного вмешательства. Непрерывная поставка — более мягкий вариант: она автоматизирует развертывание до промежуточной среды и требует подтверждения человека перед развертыванием в рабочую среду. Обе практики основаны на одной и той же инфраструктуре конвейера. В Azure Pipelines CD реализуется добавлением этапов развертывания этапов после этапа CI, с направлением в среды Azure и добавлением необходимых утверждений.
Многоэтапный конвейер: CI + CD
Полный конвейер CI/CD содержит как минимум три этапа: Build (компиляция, тестирование, публикация артефакта), Deploy to Staging (развертывание артефакта в нерабочий слот) и Deploy to Production (переключение слота или развертывание после утверждения). Этапы передают артефакт дальше через хранилище артефактов конвейера. На этапе промежуточной среды автоматически выполняются интеграционные тесты или дымовые тесты; этап рабочей среды ожидает ручного утверждения перед продолжением.
# azure-pipelines.yml: multi-stage CI/CD
trigger:
branches:
include: [main]
pool:
vmImage: ubuntu-latest
stages:
- stage: Build
jobs:
- job: BuildApp
steps:
- script: npm ci && npm run build
- task: PublishPipelineArtifact@1
inputs: {targetPath: dist, artifactName: webapp}
- stage: DeployStaging
dependsOn: Build
jobs:
- deployment: StagingDeploy
environment: Staging
strategy:
runOnce:
deploy:
steps:
- task: AzureWebApp@1
inputs: {appName: myapp-staging, package: '$(Pipeline.Workspace)/webapp'}
- stage: DeployProduction
dependsOn: DeployStaging
jobs:
- deployment: ProductionDeploy
environment: Production # Has manual approval gate
strategy:
runOnce:
deploy:
steps:
- task: AzureWebApp@1
inputs: {appName: myapp, package: '$(Pipeline.Workspace)/webapp'}Задания развертывания и среды
Для этапов развертывания используйте задания deployment, а не обычные задания job. Задания развертывания поддерживают стратегии развертывания (runOnce, rolling, canary), отслеживают историю развертываний для каждой среды и должны ссылаться на среды Azure DevOps. Среда записывает, какие запуски конвейера выполнили в нее развертывание, какая версия в данный момент активна, а также предоставляет на одной панели утверждения, проверки и сведения о состоянии ресурсов.
# Deployment job with rolling strategy
- job: RollingDeploy
strategy:
rolling:
maxParallel: 2 # Deploy to 2 targets at a time
preDeploy:
steps:
- script: echo 'Pre-deploy checks'
deploy:
steps:
- task: AzureWebApp@1
inputs:
appName: myapp
package: '$(Pipeline.Workspace)/webapp'
postRouteDeploy:
steps:
- script: curl -f https://myapp.azurewebsites.net/healthРазвертывание в Azure App Service
Задача AzureWebApp@1 развертывает веб-приложение в Azure App Service. Она поддерживает развертывание в определенный слот (например, staging), развертывание ZIP-пакетов, образов Docker или файлов JAR/WAR. После развертывания в слот staging используйте задачу AzureAppServiceManage@0, чтобы выполнить переключение слота staging в рабочую среду — это предпочтительный способ развертывания в App Service без простоя.
# Deploy to staging slot, then swap to production
steps:
- task: AzureWebApp@1
displayName: 'Deploy to staging slot'
inputs:
azureSubscription: 'AzureProductionSC'
appType: webAppLinux
appName: myUniqueWebApp
deployToSlotOrASE: true
resourceGroupName: MyRG
slotName: staging
package: '$(Pipeline.Workspace)/webapp/app.zip'
runtimeStack: 'NODE|18-lts'
- task: AzureAppServiceManage@0
displayName: 'Swap staging into production'
inputs:
azureSubscription: 'AzureProductionSC'
action: Swap Slots
webAppName: myUniqueWebApp
resourceGroupName: MyRG
sourceSlot: stagingДымовые тесты в конвейере CD
После развертывания в промежуточную среду запустите дымовые тесты — минимальный набор тестов, проверяющий успешность развертывания и корректность ответа приложения. Дымовые тесты обычно обращаются к ключевым конечным точкам API и проверяют ожидаемые коды состояния и содержимое ответа. Если дымовые тесты завершаются с ошибкой, конвейер останавливается до переключения в рабочую среду или запроса утверждения, не позволяя неисправному выпуску попасть к пользователям.
# Smoke test step after staging deployment
- script: |
MAX_RETRY=10
COUNT=0
until curl -sf https://myUniqueWebApp-staging.azurewebsites.net/health; do
COUNT=$((COUNT+1))
if [ $COUNT -ge $MAX_RETRY ]; then
echo 'Health check failed after $MAX_RETRY attempts'
exit 1
fi
echo 'Waiting for app to start... attempt '$COUNT
sleep 10
done
echo 'App is healthy'
displayName: 'Smoke test: health endpoint'Утверждения для среды
Добавьте утверждения к средам Azure DevOps, чтобы требовать ручного подтверждения перед продолжением развертываний. Перейдите к настройкам среды и добавьте Approvals — укажите пользователей или группы, которые должны одобрить развертывание. Когда конвейер достигает задания развертывания, направленного в эту среду, он приостанавливается и отправляет уведомление по электронной почте. Утверждающие могут просмотреть сведения о развертывании и одобрить или отклонить его на портале Azure DevOps либо по ссылке в уведомлении.
# Pipeline YAML: deployment to production environment
# (Approval configured in Azure DevOps portal on 'Production' environment)
- stage: DeployProduction
displayName: 'Deploy to Production'
dependsOn: DeployStaging
condition: succeeded('DeployStaging')
jobs:
- deployment: ProdDeploy
environment: Production # <-- Triggers approval gate configured in portal
strategy:
runOnce:
deploy:
steps:
- task: AzureWebApp@1
inputs:
appName: myapp-prod
package: '$(Pipeline.Workspace)/webapp/app.zip'Развертывание в Azure Kubernetes Service
Развертывайте контейнеризированные приложения в AKS с помощью задачи KubernetesManifest@0. Эта задача применяет манифесты Kubernetes YAML к кластеру и имеет встроенную поддержку imagePullSecrets и канареечных развертываний. Подключайтесь к кластеру AKS с помощью подключения к службе Kubernetes, настроенного в Azure DevOps. Задача использует kubectl apply внутри и ожидает завершения развертывания перед тем, как пометить шаг как успешно выполненный.
# AKS deployment step in Azure Pipelines
- task: KubernetesManifest@0
displayName: 'Deploy to AKS'
inputs:
action: deploy
kubernetesServiceConnection: 'AKS-Production-SC'
namespace: production
manifests: |
k8s/deployment.yaml
k8s/service.yaml
containers: 'mycontainerregistry.azurecr.io/myapp:$(Build.BuildId)'
imagePullSecrets: acr-secretСтратегия тегирования образов
Помечайте контейнерные образы идентификатором сборки ($(Build.BuildId)) или SHA-идентификатором коммита Git ($(Build.SourceVersion)), чтобы всегда можно было сопоставить работающий контейнер с точной версией кода, на основе которой он был собран. Не используйте тег latest в рабочей среде: Kubernetes кэширует его и может не загрузить новую версию. Храните конкретный тег образа как переменную конвейера и подставляйте его в манифесты Kubernetes во время развертывания с помощью envsubst или sed.
# Tag and push image with build ID in CI stage
- script: |
IMAGE='mycontainerregistry.azurecr.io/myapp'
TAG='$(Build.BuildId)'
docker build -t $IMAGE:$TAG -t $IMAGE:latest .
az acr login --name mycontainerregistry
docker push $IMAGE:$TAG
docker push $IMAGE:latest
echo "##vso[task.setvariable variable=imageTag;isOutput=true]$TAG"
name: BuildImage
displayName: 'Build and push container image'Стратегии отката
Определите стратегию отката для развертываний в рабочей среде, чтобы быстро восстановиться после неудачного выпуска. Для App Service откат означает обратную замену рабочего слота предыдущей версией из промежуточного слота. Для AKS используйте kubectl rollout undo. Создайте отдельный конвейер отката или добавьте задание ручного отката, которое можно запустить на портале Azure DevOps. Задокументируйте процедуру отката и регулярно отрабатывайте ее — непроверенный откат откатом не является.
# Rollback job triggered manually
- job: Rollback
condition: and(failed(), eq(variables['Build.Reason'], 'Manual'))
steps:
# App Service rollback: swap production back to previous
- task: AzureAppServiceManage@0
inputs:
azureSubscription: 'AzureProductionSC'
action: Swap Slots
webAppName: myUniqueWebApp
resourceGroupName: MyRG
sourceSlot: production # Swap production back to staging version
targetSlot: stagingУведомления о развертывании и мониторинг
После каждого развертывания в рабочей среде автоматически запускайте проверку мониторинга, чтобы убедиться в исправности новой версии. Используйте проверку конвейера AzureMonitor@1 для запроса метрик Azure Monitor — если после развертывания частота ошибок повышена, заблокируйте дальнейшее продвижение по конвейеру и запустите откат. Отправляйте уведомления о развертывании в Microsoft Teams или Slack с помощью задач веб-перехватчика, чтобы команда знала о завершении развертывания и о том, какая версия работает.
# Send Teams notification on deployment completion
- task: InvokeRestAPI@1
displayName: 'Notify Teams channel'
inputs:
connectionType: connectedServiceName
serviceConnection: 'TeamsWebhookSC'
method: POST
body: '{
"text": "Deployed **$(Build.BuildId)** to Production. Committed by $(Build.RequestedFor). <br>View: https://myapp.contoso.com"
}'
waitForCompletion: falseРекомендации по непрерывному развертыванию
Следуйте этим рекомендациям по непрерывному развертыванию: развертывайте часто (небольшие пакеты снижают риск), используйте функциональные флаги, чтобы отделить развертывание от выпуска, автоматизируйте все проверки качества перед развертыванием в рабочую среду, используйте промежуточную среду, похожую на рабочую, чтобы различия не скрывали ошибки, контролируйте окна развертывания с помощью автоматических проверок работоспособности и всегда имейте проверенный план отката. Зрелый конвейер непрерывного развертывания превращает развертывание из напряженной операции в обычную процедуру.
Быстрая проверка
Проверьте свое понимание концепций Microsoft Azure Fundamentals (AZ-900) из этого урока.
Итоги урока
В этом уроке Вы узнали, что многоэтапные конвейеры YAML объединяют этапы Build, Staging и Production и передают артефакты, задания развертывания с окружениями обеспечивают этапы согласования и отслеживание развертываний, а дымовые тесты после развертывания в промежуточной среде не позволяют неработающим выпускам попасть в рабочую среду. Далее мы рассмотрим GitHub Actions в Azure.
Часто задаваемые вопросы
Урок «Непрерывное развертывание в Azure» бесплатный?
Да — полный текст урока «Непрерывное развертывание в Azure» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cloud & IT Cert Prep, подпишись на CoddyKit PRO. Курс Cloud & IT Cert Prep содержит 4 уроков всего.
Чему я научусь в уроке «Непрерывное развертывание в Azure»?
Расширьте конвейер этапом развертывания, который отправляет артефакт сборки в слот App Service, выполняет быстрые проверки и после подтверждения переключает его в рабочую среду. Ты практикуешь Cloud & IT Cert Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Cloud & IT Cert Prep?
Предыдущий опыт не требуется. Cloud & IT Cert Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Непрерывное развертывание в Azure»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Cloud & IT Cert Prep?
Да. Каждый урок Cloud & IT Cert Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Обзор Azure DevOps Services
- Создание конвейера непрерывной интеграции с Azure Pipelines
- Непрерывное развертывание в Azure
- GitHub Actions в Azure