0Pricing
Cloud & IT Cert Prep · Урок

Непрерывное развертывание в 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 — локальная установка не требуется.

Все уроки этого курса

  1. Обзор Azure DevOps Services
  2. Создание конвейера непрерывной интеграции с Azure Pipelines
  3. Непрерывное развертывание в Azure
  4. GitHub Actions в Azure
← Назад к Cloud & IT Cert Prep