Упражнение – Реализация шаблона сине-зеленого развертывания
В Создании многоэтапного конвейера с помощью Azure Pipelinesвы создали базовый конвейер развертывания, который развертывает веб-приложение в Службе приложений Azure на следующих этапах: Dev, Test, и Staging.
Здесь вы добавите этот рабочий процесс, применяя шаблон развертывания сине-зеленый во время промежуточного .
Для этого выполните следующие действия:
- Добавьте слот развертывания в экземпляр App Service, соответствующий Staging.
- Добавьте задачу в конвейер для замены слотов для развертывания.
Добавление слота развертывания
Здесь вы добавите слот развертывания в экземпляр службы приложений, соответствующий промежуточной.
По умолчанию каждый экземпляр службы приложений предоставляет слот по умолчанию с именем production. Вы развернули в рабочем слоте при настройке конвейера в предыдущем разделе.
Экземпляр службы приложений может иметь несколько слотов. Здесь вы добавите второй слот развертывания в экземпляр службы приложений, соответствующий промежуточной . Слот развертывания называется для смены с.
Чтобы добавить слот, выполните следующие действия.
В меню выберите Cloud Shell. При появлении запроса выберите интерфейс Bash.
Выполните следующую команду, чтобы получить имя экземпляра службы 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".Напечатать переменную
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
указывает имя слота развертывания. Вы развертываете в слоте с названием swap.
-
- Новая задача,
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 успешно развернут в каждой среде службы приложений.