Упражнение. Реализация шаблона развертывания сине-зеленого цвета
В процессе создания многоэтапного конвейера с помощью Azure Pipelines вы создали базовый конвейер развертывания, который развертывает веб-приложение для приложение Azure службы на следующих этапах: разработка, тестирование и промежуточное развертывание.
Здесь вы добавите этот рабочий процесс, применяя шаблон развертывания сине-зеленого цвета во время промежуточного развертывания.
Для этого сделайте следующее.
- Добавьте слот развертывания в экземпляр Служба приложений, соответствующий промежуточной среде.
- Добавьте задачу в конвейер для замены слотов развертывания.
Добавление слота развертывания
Здесь вы добавите слот развертывания в экземпляр Служба приложений, соответствующий промежуточному развертыванию.
По умолчанию каждый экземпляр Служба приложений предоставляет слот по умолчанию с именем рабочей среды. Вы развернули в рабочем слоте при настройке конвейера в предыдущем разделе.
Экземпляр Служба приложений может иметь несколько слотов. Здесь вы добавите второй слот развертывания в экземпляр Служба приложений, соответствующий промежуточному развертыванию. Слот развертывания называется переключение.
Чтобы добавить слот, выполните следующие действия.
Перейдите на портал Azure и войдите в систему.
В меню выберите Cloud Shell. При появлении запроса выберите интерфейс Bash .
Выполните следующую команду, чтобы получить имя экземпляра Службы приложений, соответствующего этапу Промежуточное хранениеи сохранить результат в переменной 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".staging
Напечатать переменную, чтобы убедиться, что вы получите правильное имя.echo $staging
Ниже приведен пример выхода.
tailspin-space-game-web-staging-1234
Выполните следующую команду, чтобы добавить слот с именем swap в промежуточную среду.
az webapp deployment slot create \ --name $staging \ --resource-group tailspin-space-game-rg \ --slot swap
Выполните следующую команду, чтобы указать имя узла слота развертывания.
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
Запишите это имя узла для дальнейшего использования.
В качестве дополнительного шага перейдите на сайт в браузере. Вы увидите домашнюю страницу по умолчанию, так как вы еще не развернули код в этом слоте.
По умолчанию слот развертывания доступен из Интернета. На практике вы можете настроить виртуальную сеть Azure, которая помещает слот буфера в сеть, которая не является маршрутизируемой из Интернета, но доступ к ней может получить только ваша команда. Рабочий слот останется доступен из Интернета.
Переключение слотов развертывания в промежуточном режиме
Здесь вы используете задачу AzureAppServiceManage@0 для переключения слотов развертывания в среде Промежуточное хранение.
Эту задачу можно также использовать для запуска, остановки или удаления слота. Кроме того, вы можете использовать его для установки расширений сайта или обеспечения непрерывного мониторинга на Служба приложений.
В 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
указывает действие, которое необходимо предпринять. Помните, что эту задачу можно использовать для запуска, остановки или удаления слота. Здесь "Переключение слотов" указывает для замены исходных и целевых слотов.
Эта конфигурация всегда развертывается в слоте буфера. Затем он переключает рабочие и переключения слотов. Процесс переключения гарантирует, что рабочая среда указывает на последнее развертывание.
- Теперь
В интегрированном терминале добавьте azure-pipelines.yml в индекс. Зафиксируйте изменения, а затем отправьте ветвь в GitHub.
Совет
Сохраните azure-pipelines.yml перед выполнением этих команд Git.
git add azure-pipelines.yml git commit -m "Swap deployment slots" git push origin blue-green
В Azure Pipelines выполните трассировку сборки с помощью каждого шага.
Примечание.
При возникновении ошибки ...'staging' slot did not respond to http ping. (CODE: 417)
попробуйте перезапустить службу приложений. Если проблема не исчезнет, сбросьте автоматическое переключение для слота.
В качестве дополнительного шага в браузере перейдите по URL-адресу, соответствующему каждому этапу.
Хотя вы еще не внесли изменения на веб-сайт, вы видите, что веб-сайт Space Game успешно развернут в каждой Служба приложений среде.