Exercício - Implementar o padrão de implantação azul-verde

Concluído

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:

  1. Aceda ao Portal do Azure e inicie sessão.

  2. No menu, selecione Cloud Shell. Quando lhe for pedido, selecione a experiência Bash .

  3. 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 cujo name campo contém "tailspin-space-game-web-staging".

  4. 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
    
  5. 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
    
  6. 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.

  7. 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.

    Screenshot of the default home page in Azure App Service.

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.

  1. 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 como true, implanta em um slot de implantação existente.
      • resourceGroupName Especifica o nome do grupo de recursos. Este valor é necessário quando deployToSlotOrASE é 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 e targetSlot 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.

  2. 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
    
  3. 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.

  1. 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.

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