Exercício - Implementar o padrão de implantação azul-verde
Em Criar um pipeline de vários estágios usando o Azure Pipelines, você criou um pipeline de implantação básico que implanta um aplicativo Web no Serviço de Aplicativo do Azure nestes estágios: Desenvolvimento, Teste e Preparo.
Aqui você adiciona a esse fluxo de trabalho aplicando o padrão de implantação azul-verde durante o preparo.
Para tal, terá de:
- Adicione um slot de implantação à instância do Serviço de Aplicativo que corresponda ao Preparo.
- Adicione uma tarefa ao pipeline para trocar os slots de implantação.
Adicionar um slot de implantação
Aqui você adiciona um slot de implantação à instância do Serviço de Aplicativo que corresponde ao Preparo.
Por padrão, cada instância do Serviço de Aplicativo fornece um slot padrão, chamado produção. Você implantou no slot de produção quando configurou o pipeline na seção anterior.
Uma instância do Serviço de Aplicativo pode ter vários slots. Aqui você adiciona um segundo slot de implantação à instância do Serviço de Aplicativo que corresponde ao Preparo. O slot de implantação é chamado swap.
Para adicionar o slot:
Aceda ao Portal do Azure e inicie sessão.
No menu, selecione Cloud Shell. Quando lhe for pedido, selecione a experiência Bash .
Execute o seguinte comando para obter o nome da instância do Serviço de Aplicativo que corresponde ao Preparo e para armazenar o resultado em uma variável Bash chamada
staging
.staging=$(az webapp list \ --resource-group tailspin-space-game-rg \ --query "[?contains(@.name, 'tailspin-space-game-web-staging')].{name: name}" \ --output tsv)
O
--query
argumento usa JMESPath, que é uma linguagem de consulta para JSON. O argumento seleciona a instância do Serviço de Aplicativo cujoname
campo contém "tailspin-space-game-web-staging".Imprima a
staging
variável para verificar se você obtém o nome correto.echo $staging
Eis um exemplo do resultado:
tailspin-space-game-web-staging-1234
Execute o seguinte comando para adicionar um slot chamado swap ao seu ambiente de preparação.
az webapp deployment slot create \ --name $staging \ --resource-group tailspin-space-game-rg \ --slot swap
Execute o seguinte comando para listar o nome do host do slot de implantação.
az webapp deployment slot list \ --name $staging \ --resource-group tailspin-space-game-rg \ --query [].hostNames \ --output tsv
O resultado é semelhante a esta saída:
tailspin-space-game-web-staging-25391-swap.azurewebsites.net
Anote este nome de host para mais tarde.
Como etapa opcional, acesse seu site em um navegador. Você vê a página inicial padrão porque ainda não implantou seu código nesse slot.
Por padrão, um slot de implantação pode ser acessado pela Internet. Na prática, você pode configurar uma rede virtual do Azure que coloca seu slot de permuta em uma rede que não é roteável da Internet, mas que apenas sua equipe pode acessar. Seu slot de produção permaneceria acessível a partir da internet.
Trocar slots de implantação no preparo
Aqui você usa a tarefa AzureAppServiceManage@0 para trocar slots de implantação em seu ambiente de preparação .
Você também pode usar essa tarefa para iniciar, parar ou excluir um slot. Ou você pode usá-lo para instalar extensões de site ou para habilitar o monitoramento contínuo no Serviço de Aplicativo.
No Visual Studio Code, modifique azure-pipelines.yml usando este código:
Gorjeta
Você pode substituir o arquivo inteiro ou apenas atualizar a parte realçada.
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'
Tenha em atenção estas alterações:
- A
AzureWebApp@1
tarefa agora especifica estes valores:deployToSlotOrASE
, quando definido comotrue
, implanta em um slot de implantação existente.resourceGroupName
Especifica o nome do grupo de recursos. Este valor é necessário quandodeployToSlotOrASE
étrue
.slotName
Especifica o nome do slot de implantação. Aqui você implanta no slot chamado swap.
- A nova tarefa,
AzureAppServiceManage@0
, troca os slots de implantação.sourceSlot
etargetSlot
especificar os slots a trocar.action
especifica a ação a ser tomada. Lembre-se de que você pode usar essa tarefa para iniciar, parar ou excluir um slot. Aqui, "Swap Slots" especifica para trocar os slots de origem e de destino.
Essa configuração sempre é implantada no slot de permuta. Em seguida, troca a produção e troca de slots. O processo de permuta garante que a produção aponte para a implantação mais recente.
- A
No terminal integrado, adicione azure-pipelines.yml ao índice. Confirme as alterações e, em seguida, empurre a ramificação para o GitHub.
Gorjeta
Salve azure-pipelines.yml antes de executar esses comandos do Git.
git add azure-pipelines.yml git commit -m "Swap deployment slots" git push origin blue-green
No Azure Pipelines, rastreie a compilação através de cada uma das etapas.
Nota
Se você encontrar o seguinte erro ...'staging' slot did not respond to http ping. (CODE: 417)
, tente reiniciar o serviço de aplicativo. Se o problema persistir, redefina a troca automática para o slot.
Como etapa opcional, em um navegador, vá para o URL que corresponde a cada etapa.
Embora você ainda não tenha feito alterações no site, você vê que o site Space Game foi implantado com êxito em cada ambiente do Serviço de Aplicativo.