Упражнение – Реализация шаблона сине-зеленого развертывания

Завершено

В Создании многоэтапного конвейера с помощью Azure Pipelinesвы создали базовый конвейер развертывания, который развертывает веб-приложение в Службе приложений Azure на следующих этапах: Dev, Test, и Staging.

Здесь вы добавите этот рабочий процесс, применяя шаблон развертывания сине-зеленый во время промежуточного .

Для этого выполните следующие действия:

  • Добавьте слот развертывания в экземпляр App Service, соответствующий Staging.
  • Добавьте задачу в конвейер для замены слотов для развертывания.

Добавление слота развертывания

Здесь вы добавите слот развертывания в экземпляр службы приложений, соответствующий промежуточной.

По умолчанию каждый экземпляр службы приложений предоставляет слот по умолчанию с именем production. Вы развернули в рабочем слоте при настройке конвейера в предыдущем разделе.

Экземпляр службы приложений может иметь несколько слотов. Здесь вы добавите второй слот развертывания в экземпляр службы приложений, соответствующий промежуточной . Слот развертывания называется для смены с.

Чтобы добавить слот, выполните следующие действия.

  1. Перейдите на портал Azure и войдите.

  2. В меню выберите Cloud Shell. При появлении запроса выберите интерфейс Bash.

  3. Выполните следующую команду, чтобы получить имя экземпляра службы App Service, соответствующего Staging, и сохранить результат в переменной с именем stagingв Bash.

    staging=$(az webapp list \
      --resource-group tailspin-space-game-rg \
      --query "[?contains(@.name, 'tailspin-space-game-web-staging')].{name: name}" \
      --output tsv)
    

    Аргумент --query использует JMESPath, который является языком запросов для JSON. Аргумент выбирает экземпляр службы приложений, у которого поле name содержит "tailspin-space-game-web-staging".

  4. Напечатать переменную staging, чтобы убедиться, что вы получите правильное имя.

    echo $staging
    

    Ниже приведен пример выходных данных:

    tailspin-space-game-web-staging-1234
    
  5. Выполните следующую команду, чтобы добавить слот с именем swap в вашу стадийную среду .

    az webapp deployment slot create \
      --name $staging \
      --resource-group tailspin-space-game-rg \
      --slot swap
    
  6. Выполните следующую команду, чтобы отобразить имя хоста слота развертывания.

    az webapp deployment slot list \
        --name $staging \
        --resource-group tailspin-space-game-rg \
        --query [].hostNames \
        --output tsv
    

    Результат напоминает следующее:

    tailspin-space-game-web-staging-25391-swap.azurewebsites.net
    

    Запишите это имя узла для дальнейшего использования.

  7. В качестве дополнительного шага перейдите на сайт в браузере. Вы увидите домашнюю страницу по умолчанию, так как вы еще не развернули код в этом слоте.

    снимок экрана домашней страницы по умолчанию в Службе приложений Azure.

По умолчанию слот развертывания доступен из Интернета. На практике можно настроить виртуальную сеть в Azure, в которой размещается слот обмена в сети, которая не является маршрутизируемой из Интернета, но доступ к ней может получить только ваша команда. Ваш производственный слот останется доступным из Интернета.

Переключение слотов развертывания в промежуточном режиме

Здесь вы используете задачу AzureAppServiceManage@0 для замены слотов развертывания в вашей промежуточной среде.

Эту задачу можно также использовать для запуска, остановки или удаления слота. Кроме того, вы можете установить расширения сайта или включить непрерывный мониторинг в службе приложений.

  1. В Visual Studio Code измените azure-pipelines.yml с помощью этого кода:

    Совет

    Вы можете заменить весь файл или просто обновить выделенную часть.

    trigger:
    - '*'
    
    variables:
      buildConfiguration: 'Release'
    
    stages:
    - stage: 'Build'
      displayName: 'Build the web application'
      jobs: 
      - job: 'Build'
        displayName: 'Build job'
        pool:
          vmImage: 'ubuntu-20.04'
          demands:
          - npm
    
        variables:
          wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
          dotnetSdkVersion: '6.x'
    
        steps:
        - task: UseDotNet@2
          displayName: 'Use .NET SDK $(dotnetSdkVersion)'
          inputs:
            version: '$(dotnetSdkVersion)'
    
        - task: Npm@1
          displayName: 'Run npm install'
          inputs:
            verbose: false
    
        - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)'
          displayName: 'Compile Sass assets'
    
        - task: gulp@1
          displayName: 'Run gulp tasks'
    
        - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt'
          displayName: 'Write build info'
          workingDirectory: $(wwwrootDir)
    
        - task: DotNetCoreCLI@2
          displayName: 'Restore project dependencies'
          inputs:
            command: 'restore'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Build the project - $(buildConfiguration)'
          inputs:
            command: 'build'
            arguments: '--no-restore --configuration $(buildConfiguration)'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Publish the project - $(buildConfiguration)'
          inputs:
            command: 'publish'
            projects: '**/*.csproj'
            publishWebProjects: false
            arguments: '--no-build --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(buildConfiguration)'
            zipAfterPublish: true
    
        - publish: '$(Build.ArtifactStagingDirectory)'
          artifact: drop
    
    - stage: 'Dev'
      displayName: 'Deploy to the dev environment'
      dependsOn: Build
      jobs:
      - deployment: Deploy
        pool:
          vmImage: 'ubuntu-20.04'
        environment: dev
        variables:
        - group: Release
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: drop
              - task: AzureWebApp@1
                displayName: 'Azure App Service Deploy: website'
                inputs:
                  azureSubscription: 'Resource Manager - Tailspin - Space Game'
                  appName: '$(WebAppNameDev)'
                  package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
    
    - stage: 'Test'
      displayName: 'Deploy to the test environment'
      dependsOn: Dev
      jobs:
      - deployment: Deploy
        pool:
          vmImage: 'ubuntu-20.04'
        environment: test
        variables:
        - group: 'Release'
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: drop
              - task: AzureWebApp@1
                displayName: 'Azure App Service Deploy: website'
                inputs:
                  azureSubscription: 'Resource Manager - Tailspin - Space Game'
                  appName: '$(WebAppNameTest)'
                  package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
    
    - stage: 'Staging'
      displayName: 'Deploy to the staging environment'
      dependsOn: Test
      jobs:
      - deployment: Deploy
        pool:
          vmImage: 'ubuntu-20.04'
        environment: staging
        variables:
        - group: 'Release'
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: drop
              - task: AzureWebApp@1
                displayName: 'Azure App Service Deploy: website'
                inputs:
                  azureSubscription: 'Resource Manager - Tailspin - Space Game'
                  deployToSlotOrASE: 'true'
                  resourceGroupName: 'tailspin-space-game-rg'
                  slotName: 'swap'
                  appName: '$(WebAppNameStaging)'
                  package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
              - task: AzureAppServiceManage@0
                displayName: 'Swap deployment slots'
                inputs:
                  azureSubscription: 'Resource Manager - Tailspin - Space Game'
                  resourceGroupName: 'tailspin-space-game-rg'
                  webAppName: '$(WebAppNameStaging)'
                  sourceSlot: 'swap'
                  targetSlot: 'production'
                  action: 'Swap Slots'
    

    Обратите внимание на следующие изменения:

    • Теперь задача AzureWebApp@1 указывает следующие значения:
      • deployToSlotOrASE, если задано значение true, развертывается в существующем слоте развертывания.
      • resourceGroupName указывает имя группы ресурсов. Это значение необходимо, если deployToSlotOrASE равно true.
      • slotName указывает имя слота развертывания. Вы развертываете в слоте с названием swap.
    • Новая задача, AzureAppServiceManage@0, переключает слоты развертывания.
      • sourceSlot и targetSlot укажите слоты для переключения.
      • action указывает действие для выполнения. Помните, что эту задачу можно использовать для запуска, остановки или удаления слота. Здесь "Обмен слотов" означает замену исходных и целевых слотов.

    Эта конфигурация всегда развертывается в слоте смены . Затем он меняет местами позиции производства и на позиции. Процесс замены гарантирует, что производства указывает на более недавнее развертывание.

  2. В интегрированном терминале добавьте azure-pipelines.yml в индекс. Зафиксируйте изменения, а затем отправьте ветвь в GitHub.

    Совет

    Сохраните azure-pipelines.yml перед выполнением этих команд Git.

    git add azure-pipelines.yml
    git commit -m "Swap deployment slots"
    git push origin blue-green
    
  3. В Azure Pipelines выполните трассировку сборки с помощью каждого шага.

Заметка

При возникновении следующей ошибки ...'staging' slot did not respond to http ping. (CODE: 417) попробуйте перезапустить службу приложений. Если проблема сохранится, сбросьте автоматическое переключение для вашего слота.

  1. В качестве дополнительного шага в браузере перейдите по URL-адресу, соответствующему каждому этапу.

    Хотя вы еще не внесли изменения на веб-сайт, вы увидите, что веб-сайт Space Game успешно развернут в каждой среде службы приложений.

    снимок экрана браузера, на котором показан веб-сайт Space Game в среде разработки.