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

Завершено

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

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

Для этого сделайте следующее.

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

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

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

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

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

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

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

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

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

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

    Screenshot of the default home page in Azure App Service.

По умолчанию слот развертывания доступен из Интернета. На практике вы можете настроить виртуальную сеть 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 указывает имя слота развертывания. Здесь вы развернете слот, который называется переключение.
    • Новая задача 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 успешно развернут в каждой Служба приложений среде.

    Screenshot of a browser that shows the Space Game website in the Dev environment.