Como criar um pipeline de CI/CD com o Azure Pipelines e o Compute Engine

Last reviewed 2023-03-09 UTC

Neste tutorial, mostramos como usar o Azure Pipelines e o Compute Engine para criar um pipeline de (CI/CD) de integração/implantação contínuas para um aplicativo da Web ASP.NET MVC. O aplicativo usa os Serviços de Informações da Internet da Microsoft e é executado no Windows Server.

O canal CI/CD usa dois ambientes separados, um para testes e outro para produção.

No início do pipeline, os desenvolvedores confirmam as alterações no código de exemplo. Essa ação aciona o pipeline para criar o aplicativo, empacotá-lo como um arquivo ZIP e fazer upload dele para o Cloud Storage.

Em seguida, o pacote é lançado automaticamente no ambiente de desenvolvimento por uma atualização gradual. Depois que a versão for testada, um gerente de versão pode promovê-la que ela seja implantada no ambiente de produção.

Este tutorial se destina a desenvolvedores e engenheiros de DevOps. Ele pressupõe que você tenha conhecimento básico sobre .NET Framework, Windows Server, IIS, Azure Pipelines e Compute Engine. Também é preciso ter acesso administrativo a uma conta do Azure DevOps.

Objetivos

  • Use grupos de instâncias gerenciadas do Compute Engine para implementar implantações contínuas.
  • Configure um canal de CI/CD nos Azure Pipelines para orquestrar os processos de versão, criação e implantação.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.

Verifique a página de preços do Azure DevOps para ver as taxas aplicáveis ao uso do Azure DevOps.

Antes de começar

Geralmente, é aconselhável usar projetos separados para cargas de trabalho de desenvolvimento e produção, de modo que os papéis e permissões do gerenciamento de identidade e acesso (IAM, na sigla em inglês) possam ser concedidos individualmente. Para simplificar, este tutorial usa um único projeto para os ambientes de desenvolvimento e produção.

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Enable the Compute Engine and Cloud Storage APIs.

    Enable the APIs

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. É necessário ter uma conta Azure DevOps e ter acesso de administrador a ela. Se você ainda não tiver uma conta do Azure DevOps, inscreva-se na página inicial do Azure DevOps.

Criar um projeto do Azure DevOps

Use o Azure DevOps para gerenciar o código-fonte, executar compilações e testes e orquestrar a implantação no Compute Engine. Para começar, crie um projeto na sua conta do Azure DevOps.

  1. Acesse a página inicial do Azure DevOps (https://dev.azure.com/YOUR_AZURE_DEVOPS_ACCOUNT_NAME).
  2. Clique em New project.
  3. Insira um nome de projeto, como CloudDemo.
  4. Defina Visibility como Private e clique em Create.
  5. Depois de criar o projeto, clique em Repos no menu à esquerda.
  6. Clique em Import para bifurcar o repositório dotnet-docs-samples do GitHub e defina os seguintes valores:
    • Tipo de repositório: Git
    • URL do clone: https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
  7. Clique em Importar.

    Quando o processo de importação estiver concluído, você verá o código-fonte do repositório dotnet-docs-samples.

  8. No menu, clique em Repositórios > Ramificações.

  9. Mova o mouse sobre a ramificação main. Um botão ... será exibido à direita.

  10. Clique em ... > Definir como ramificação padrão.

Crie continuamente

Agora é possível usar o Azure Pipelines para configurar um pipeline de build. Para cada confirmação enviada para o repositório Git, o Azure Pipelines cria o código, empacota-o em um arquivo ZIP e publica o pacote resultante no armazenamento interno do Azure Pipelines.

Mais tarde, você vai configurar um pipeline de lançamento que usa os pacotes do armazenamento do Azure Pipelines e os implanta no Compute Engine.

Criar uma definição de compilação

Crie uma nova definição de build no Azure Pipelines que use a sintaxe YAML:

  1. Usando o Visual Studio ou um cliente de linha de comando git, clone seu novo repositório Git.
  2. Na raiz do repositório, crie um arquivo chamado azure-pipelines.yml.
  3. Copie o código a seguir e cole-o no arquivo:

    resources:
    - repo: self
      fetchDepth: 1
    trigger:
    - main
    variables:
      artifactName: 'CloudDemo.Mvc'
    jobs:
    - job: Build
      displayName: Build application
      condition: succeeded()
      pool:
        vmImage: windows-latest
        demands:
        - msbuild
        - visualstudio
      variables:
        Solution: 'applications/clouddemo/net4/CloudDemo.Mvc.sln'
        BuildPlatform: 'Any CPU'
        BuildConfiguration: 'Release'
        ArtifactName: 'CloudDemo.Web'
      steps:
      - task: NuGetCommand@2
        displayName: 'NuGet restore'
        inputs:
          restoreSolution: '$(Solution)'
      - task: VSBuild@1
        displayName: 'Build solution'
        inputs:
          solution: '$(Solution)'
          msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)\\"'
          platform: '$(BuildPlatform)'
          configuration: '$(BuildConfiguration)'
      - task: PublishBuildArtifacts@1
        displayName: 'Publish Artifact'
        inputs:
          PathtoPublish: '$(build.artifactstagingdirectory)/CloudDemo.Mvc.zip'
          ArtifactName: '$(ArtifactName)'
  4. Confirme as alterações e envie-as para o Azure Pipelines.

    Visual Studio

    1. Abra o Team Explorer e clique no ícone Home.
    2. Clique em Changes.
    3. Insira uma mensagem de confirmação como Add pipeline definition.
    4. Clique em Confirmar tudo e enviar por push.

    Linha de comando

    1. Organize todos os arquivos modificados:

      git add -A
      
    2. Confirme as alterações no repositório local:

      git commit -m "Add pipeline definition"
      
    3. Envie as alterações para o Azure DevOps:

      git push
      
  5. No menu do Azure DevOps, selecione Pipelines e clique em Criar pipeline.

  6. Selecione Azure Repos Git.

  7. Selecione seu Repositório.

  8. Na página Revise o YAML do pipeline, clique em Executar.

    Uma nova versão é acionada. O build pode demorar cerca de dois minutos para ser concluído. No final do build, o pacote de aplicativo CloudDemo.Mvc.zip, que contém todos os arquivos do aplicativo da Web, fica disponível na área de armazenamento de artefatos interno do Azure Pipelines.

Como implantar continuamente

Agora que o Azure Pipelines cria automaticamente o código para cada confirmação, você pode voltar sua atenção para a implantação.

Ao contrário de outros sistemas de integração contínua, o Azure Pipelines distingue entre criação e implantação e fornece um conjunto especializado de ferramentas chamado Gerenciamento de versões para todas as tarefas relacionadas à implantação.

O Gerenciamento de versões do Azure Pipelines é criado com base nestes conceitos:

  • Uma versão se refere a um conjunto de artefatos que compõem uma versão específica do app e que geralmente é o resultado de um processo de compilação.
  • Implantação refere-se ao processo de escolher uma versão e implantá-la em um ambiente específico.
  • Uma implantação executa um conjunto de tarefas, que podem ser agrupadas em jobs.
  • Os estágios permitem segmentar seu pipeline e podem ser usados para orquestrar implantações em vários ambientes, por exemplo, ambientes de desenvolvimento e teste.

Configure o pipeline de versão a ser acionado sempre que uma nova compilação for concluída. O pipeline consiste em três fases:

  1. Na primeira fase, o pipeline seleciona o pacote do aplicativo da área de armazenamento de artefatos do Azure Pipelines e o publica em um bucket do Cloud Storage para que o pacote possa ser acessado pelo Compute Engine.
  2. Na segunda fase, o pipeline atualiza o ambiente de desenvolvimento por uma atualização gradual.
  3. Na fase final, após a aprovação, o pipeline atualiza o ambiente de produção por uma atualização gradual.

Criar um bucket do Cloud Storage para artefatos de build

Crie um bucket do Cloud Storage para armazenar pacotes de aplicativos. Mais tarde, você vai configurar o Compute Engine para que novas instâncias de VM possam extrair automaticamente pacotes de aplicativos desse bucket.

  1. No Console do Google Cloud, mude para o projeto recém-criado.
  2. Abra o Cloud Shell.

    Acesse o Cloud Shell

  3. Para economizar tempo, defina os valores padrão de código do projeto e zona do Compute Engine:

    gcloud config set project PROJECT_ID
    gcloud config set compute/zone ZONE

    Substitua PROJECT_ID pelo ID do projeto do Google Cloud e ZONE pelo nome da zona que você usará para criar recursos. Se você não tiver certeza sobre qual zona escolher, use us-central1-a.

    Exemplo:

    gcloud config set project devops-test-project-12345
    gcloud config set compute/zone us-central1-a
  4. Crie um novo bucket do Cloud Storage para pacotes de aplicativos:

    gsutil mb gs://$(gcloud config get-value core/project)-artifacts
    

    Se você não quiser manter os pacotes de aplicativos de todos os builds, configure uma regra de ciclo de vida de objeto para excluir arquivos que tenham passado de uma certa idade.

Configurar uma conta de serviço para o Azure Pipelines

Crie uma conta de serviço do Google Cloud que o Azure Pipelines possa usar para acessar seu projeto do Google Cloud.

  1. Crie uma conta de serviço para o Azure Pipelines:

    AZURE_PIPELINES_SERVICE_ACCOUNT=$(gcloud iam service-accounts create azure-pipelines --format "value(email)")
    
  2. Conceda os papéis de IAM de Leitor de objetos do Storage (roles/storage.objectViewer) e Criador de objetos do Storage (roles/storage.objectCreator) à conta de serviço azure-pipelines para que o Azure Pipelines possa fazer upload de pacotes de aplicativos para o Cloud Storage:

    gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \
        --member serviceAccount:$AZURE_PIPELINES_SERVICE_ACCOUNT \
        --role roles/storage.objectViewer
    gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \
        --member serviceAccount:$AZURE_PIPELINES_SERVICE_ACCOUNT \
        --role roles/storage.objectCreator
    
  3. Conceda o papel de Administrador do Compute (roles/compute.admin) à conta de serviço azure-pipelines para que o Azure Pipelines possa gerenciar instâncias de VM:

    gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \
        --member serviceAccount:$AZURE_PIPELINES_SERVICE_ACCOUNT \
        --role roles/compute.admin
    
  4. Gere uma chave de conta de serviço:

    gcloud iam service-accounts keys create azure-pipelines-key.json \
      --iam-account=$AZURE_PIPELINES_SERVICE_ACCOUNT
    
    cat azure-pipelines-key.json | base64 -w 0;echo
    
    rm azure-pipelines-key.json
    

    Você precisa da chave da conta de serviço em uma das etapas a seguir.

Configurar o ambiente de desenvolvimento

Antes de poder configurar as etapas no Azure Pipelines para automatizar a implantação, você precisa preparar o ambiente de desenvolvimento. Essa preparação inclui a criação de um grupo de instâncias gerenciadas que gerenciará as instâncias de VM do servidor da Web. Ele também inclui a criação de um balanceador de carga HTTP.

  1. No Cloud Shell, crie uma conta de serviço para o grupo gerenciado de instâncias:

    DEV_SERVICE_ACCOUNT=$(gcloud iam service-accounts create clouddemo-dev --format "value(email)")
    
  2. Conceda o papel IAM de Leitor de objetos do Storage (roles/storage.objectViewer) à conta de serviço para que as instâncias de VM possam fazer o download de pacotes de aplicativos do Cloud Storage:

    gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \
        --member serviceAccount:$DEV_SERVICE_ACCOUNT \
        --role roles/storage.objectViewer
    
  3. Conceda permissão à conta de serviço azure-pipelines para usar a conta de serviço clouddemo-dev:

    gcloud iam service-accounts add-iam-policy-binding $DEV_SERVICE_ACCOUNT \
        --member serviceAccount:$AZURE_PIPELINES_SERVICE_ACCOUNT \
        --role roles/iam.serviceAccountUser
    
  4. Crie um modelo de instância que use uma imagem padrão do Windows Server 2019 Core. Você usará esse modelo apenas inicialmente, porque cada compilação produzirá um modelo novo.

    gcloud compute instance-templates create clouddemo-initial \
        --machine-type n1-standard-2 \
        --image-family windows-2019-core \
        --image-project windows-cloud \
        --service-account $DEV_SERVICE_ACCOUNT \
        --scopes https://www.googleapis.com/auth/devstorage.read_only \
        --tags gclb-backend
    
  5. Crie uma verificação de integridade HTTP. Como o aplicativo não tem um endpoint de verificação de integridade dedicado, é possível consultar o caminho /.

    gcloud compute http-health-checks create clouddemo-dev-http \
        --check-interval=10s --unhealthy-threshold=10 \
        --request-path=/
    
  6. Crie um grupo de instâncias gerenciadas com base no modelo de instância inicial. Para simplificar, os comandos a seguir criam um grupo de instâncias gerenciadas zonais. No entanto, é possível usar a mesma abordagem para grupos de instâncias gerenciadas regionais que distribuem instâncias de VM em mais de uma zona.

    gcloud compute instance-groups managed create clouddemo-dev \
        --template=clouddemo-initial \
        --http-health-check=clouddemo-dev-http \
        --initial-delay=2m \
        --size=1 && \
    gcloud compute instance-groups set-named-ports clouddemo-dev --named-ports http:80
    
  7. Crie um serviço de back-end do balanceador de carga que use a verificação de integridade HTTP e o grupo de instâncias gerenciadas criados anteriormente:

    gcloud compute backend-services create clouddemo-dev-backend \
        --http-health-checks clouddemo-dev-http \
        --port-name http --protocol HTTP --global && \
    gcloud compute backend-services add-backend clouddemo-dev-backend \
        --instance-group clouddemo-dev --global \
        --instance-group-zone=$(gcloud config get-value compute/zone)
    
  8. Crie um front-end para o balanceador de carga:

    gcloud compute url-maps create clouddemo-dev --default-service clouddemo-dev-backend && \
    gcloud compute target-http-proxies create clouddemo-dev-proxy --url-map=clouddemo-dev && \
    gcloud compute forwarding-rules create clouddemo-dev-fw-rule --global --target-http-proxy clouddemo-dev-proxy --ports=80
    
  9. Crie uma regra de firewall que permita que o balanceador de carga do Google envie solicitações HTTP para instâncias anotadas com a tag gclb-backend. Posteriormente, você aplicará essa tag às instâncias de VM do serviço da Web.

    gcloud compute firewall-rules create gclb-backend --source-ranges=130.211.0.0/22,35.191.0.0/16 --target-tags=gclb-backend --allow tcp:80
    

Configurar o ambiente de produção

A configuração do ambiente de produção requer uma sequência de etapas semelhante à que configura o ambiente de desenvolvimento.

  1. No Cloud Shell, crie uma verificação de integridade HTTP:

    gcloud compute http-health-checks create clouddemo-prod-http \
        --check-interval=10s --unhealthy-threshold=10 \
        --request-path=/
    
  2. Crie outro grupo de instâncias gerenciadas com base no modelo de instância inicial criado anteriormente:

    gcloud compute instance-groups managed create clouddemo-prod \
        --template=clouddemo-initial \
        --http-health-check=clouddemo-prod-http \
        --initial-delay=2m \
        --size=1 && \
    gcloud compute instance-groups set-named-ports clouddemo-prod --named-ports http:80
    
  3. Crie um serviço de back-end do balanceador de carga que use a verificação de integridade HTTP e o grupo de instâncias gerenciadas criados anteriormente:

    gcloud compute backend-services create clouddemo-prod-backend --http-health-checks clouddemo-prod-http --port-name http --protocol HTTP --global && \
    gcloud compute backend-services add-backend clouddemo-prod-backend --instance-group clouddemo-prod --global --instance-group-zone=$(gcloud config get-value compute/zone)
    
  4. Crie um front-end de balanceador de carga:

    gcloud compute url-maps create clouddemo-prod --default-service clouddemo-prod-backend && \
    gcloud compute target-http-proxies create clouddemo-prod-proxy --url-map=clouddemo-prod && \
    gcloud compute forwarding-rules create clouddemo-prod-fw-rule --global --target-http-proxy clouddemo-prod-proxy --ports=80
    

Configurar o pipeline de versão

Crie uma nova definição de versão:

  1. No menu do Azure DevOps, selecione Pipelines > Versões.
  2. Clique em New pipeline.
  3. Na lista de modelos, selecione Job vazio.
  4. Quando for necessário inserir um nome para o estágio, digite Publish.
  5. Na parte superior da tela, nomeie a versão como clouddemo-ComputeEngine.
  6. No diagrama de pipeline, ao lado de Artifacts, clique em Add.
  7. Selecione Build e adicione as configurações a seguir:

    • Source: selecione o repositório Git que contém o arquivo azure-pipelines.yml.
    • Default version: Latest
    • Source alias: CloudDemo.Web
  8. Clique em Adicionar.

  9. Na caixa Artifact, clique em Continuous deployment trigger (ícone de raio) para adicionar um gatilho de implantação.

  10. Em Continuous deployment trigger, defina a chave como Enabled.

  11. Clique em Save.

  12. Insira um comentário, se quiser, e confirme clicando em OK.

O canal agora fica assim:

Captura de tela do canal no Azure Pipelines

Publicar no Cloud Storage

Agora que você criou a definição de versão, adicione as etapas para publicar o pacote do aplicativos no Cloud Storage.

  1. No Azure Pipelines, mude para a guia Tasks.
  2. Clique em Job do agente e defina as seguintes configurações:
    • Pool de agentes: Azure Pipelines
    • Especificação do agente: ubuntu-latest
  3. Ao lado de Job do agente, clique em Adicionar uma tarefa ao job do agente .
  4. Selecione a tarefa bash e clique em Adicionar.
  5. Clique na tarefa recém-adicionada e defina as seguintes configurações:

    • Display name: Publish to Cloud Storage
    • Tipo: inline
    • Script:

      cat << "EOF" > CloudDemo.Mvc.deploy.ps1
          $ErrorActionPreference = "Stop"
      
          # Download application package from Cloud Storage
          gsutil cp gs://$(CloudDemo.ProjectId)-artifacts/CloudDemo.Mvc-$(Build.BuildId)-$(Release.ReleaseId).zip $env:TEMP\app.zip
      
          # Install IIS
          Enable-WindowsOptionalFeature -Online -FeatureName `
              NetFx4Extended-ASPNET45, `
              IIS-WebServerRole, `
              IIS-WebServer, `
              IIS-CommonHttpFeatures, `
              IIS-HttpErrors, `
              IIS-HttpRedirect, `
              IIS-ApplicationDevelopment, `
              IIS-HealthAndDiagnostics, `
              IIS-HttpLogging, `
              IIS-LoggingLibraries, `
              IIS-RequestMonitor, `
              IIS-HttpTracing, `
              IIS-Security, `
              IIS-RequestFiltering, `
              IIS-Performance, `
              IIS-WebServerManagementTools, `
              IIS-IIS6ManagementCompatibility, `
              IIS-Metabase, `
              IIS-DefaultDocument, `
              IIS-ApplicationInit, `
              IIS-NetFxExtensibility45, `
              IIS-ISAPIExtensions, `
              IIS-ISAPIFilter, `
              IIS-ASPNET45, `
              IIS-HttpCompressionStatic
      
          # Extract application package to wwwroot
          New-Item -ItemType directory -Path $env:TEMP\app
          Add-Type -AssemblyName System.IO.Compression.FileSystem
          [System.IO.Compression.ZipFile]::ExtractToDirectory("$env:TEMP\app.zip", "$env:TEMP\app")
          Remove-Item $env:TEMP\app.zip
          Move-Item -Path $(dir -recurse $env:TEMP\app\**\PackageTmp | % { $_.FullName }) -Destination c:\inetpub\wwwroot\app -force
      
          # Configure IIS web application pool and application
          Import-Module WebAdministration
          New-WebAppPool clouddemo-net4
          Set-ItemProperty IIS:\AppPools\clouddemo-net4 managedRuntimeVersion v4.0
          New-WebApplication -Name clouddemo -Site 'Default Web Site' -PhysicalPath c:\inetpub\wwwroot\app -ApplicationPool clouddemo-net4
      
          # Grant read/execute access to the application pool user
          &icacls C:\inetpub\wwwroot\app\ /grant "IIS AppPool\clouddemo-net4:(OI)(CI)(RX)"
      EOF
      
      gcloud auth activate-service-account \
          --quiet \
          --key-file <(echo $(ServiceAccountKey) | base64 -d)
      
      gsutil cp $(System.ArtifactsDirectory)/CloudDemo.Web/CloudDemo.Web/CloudDemo.Mvc.zip gs://$(CloudDemo.ProjectId)-artifacts/CloudDemo.Mvc-$(Build.BuildId)-$(Release.ReleaseId).zip
      gsutil cp CloudDemo.Mvc.deploy.ps1 gs://$(CloudDemo.ProjectId)-artifacts/CloudDemo.Mvc-$(Build.BuildId)-$(Release.ReleaseId).deploy.ps1
      

    Este script faz o seguinte:

    1. Gera um script de inicialização que configura o IIS.
    2. Configura a Google Cloud CLI para usar a chave da conta de serviço da variável de ambiente para autenticar no Google Cloud.
    3. Faz upload do pacote de aplicativos e do script de inicialização para o Cloud Storage.
  6. Alterne para a guia Variables e adicione as seguintes variáveis.

    Nome Valor Secret
    ServiceAccountKey Chave da conta de serviço criada para azure-pipelines-deployer anteriormente. Sim
    CloudDemo.ProjectId ID do projeto do Google Cloud.
    CloudDemo.Zone A zona que você especificou anteriormente ao executar gcloud config set compute/zone (por exemplo, us-central1-a)
  7. Clique em Save.

  8. Insira um comentário se quiser e clique em OK para confirmar.

Implantar o ambiente de desenvolvimento

Agora é possível adicionar as etapas para iniciar uma implantação gradual no ambiente de desenvolvimento.

  1. No Azure Pipelines, mude para a guia Pipeline.
  2. Na caixa Estágios, selecione Adicionar > Novo estágio.
  3. Na lista de modelos, selecione Job vazio.
  4. Quando for necessário inserir um nome para o estágio, digite Dev.
  5. Clique no ícone de raio, referente ao cenário recém-criado.
  6. Defina as configurações a seguir:

    • Select trigger: After stage
    • Stages: Publish
  7. Mantenha o mouse sobre a guia Tarefas e clique em Tarefas > Dev.

  8. Clique em Job do agente e defina as seguintes configurações:

    • Pool de agentes: Azure Pipelines
    • Especificação do agente: ubuntu-latest
  9. Ao lado de Job do agente, clique em Adicionar uma tarefa ao job do agente .

  10. Selecione a tarefa bash e clique em Adicionar.

  11. Clique na tarefa recém-adicionada e defina as seguintes configurações:

    • Display name: Rolling deploy
    • Tipo: inline
    • Script:

      INSTANCE_TEMPLATE=clouddemo-$(Build.BuildId)-$(Release.ReleaseId)
      
      gcloud auth activate-service-account \
          --quiet \
          --key-file <(echo $(ServiceAccountKey) | base64 -d)
      
      gcloud compute instance-templates create $INSTANCE_TEMPLATE \
        --machine-type n1-standard-2 \
        --image-family windows-2019-core \
        --image-project windows-cloud \
        --service-account clouddemo-dev@$(CloudDemo.ProjectId).iam.gserviceaccount.com \
        --scopes https://www.googleapis.com/auth/devstorage.read_only \
        --tags gclb-backend \
        --metadata sysprep-specialize-script-url=gs://$(CloudDemo.ProjectId)-artifacts/CloudDemo.Mvc-$(Build.BuildId)-$(Release.ReleaseId).deploy.ps1 \
        --project $(CloudDemo.ProjectId) \
      
      gcloud compute instance-groups managed set-instance-template clouddemo-dev \
        --template $INSTANCE_TEMPLATE \
        --project $(CloudDemo.ProjectId) \
        --zone $(CloudDemo.Zone)
      
      gcloud compute instance-groups managed rolling-action start-update clouddemo-dev \
        --version template=$INSTANCE_TEMPLATE \
        --type proactive \
        --max-unavailable 0 \
        --project $(CloudDemo.ProjectId) \
        --zone $(CloudDemo.Zone)
      

    Este script faz o seguinte:

    1. Configura a Google Cloud CLI para usar a chave da conta de serviço da variável de ambiente para autenticar no Google Cloud.
    2. Cria um novo modelo de instância que usa o script de inicialização gerado pelo estágio anterior.
    3. Atualiza o grupo de instâncias atual para usar o novo modelo de instância. Observe que esse comando ainda não faz nenhuma das VMs existentes ser substituída ou atualizada. O que ele faz é garantir que qualquer VM futura nesse grupo de instâncias seja criada a partir do novo modelo.
    4. Inicia uma atualização gradual, fazendo com que o grupo de instâncias atual substitua as VMs atuais por novas VMs de modo gradual.
  12. Clique em Save.

  13. Insira um comentário, se quiser, e confirme clicando em OK.

Implantar o ambiente de produção

Por fim, você precisa configurar a implantação no ambiente de produção.

  1. No Azure Pipelines, mude para a guia Pipeline.
  2. Na caixa Estágios, selecione Adicionar > Novo estágio.
  3. Na lista de modelos, selecione Job vazio.
  4. Quando for necessário inserir um nome para o estágio, digite Prod.
  5. Clique no ícone de raio, referente ao cenário recém-criado.
  6. Defina as configurações a seguir:

    • Select trigger: After stage
    • Stages: Dev
    • Pre-deployment approvals: (ativadas)
    • Approvers: selecione seu próprio nome de usuário
  7. Mantenha o mouse sobre a guia Tarefas e clique em Tarefas > Prod.

  8. Clique em Job do agente e defina as seguintes configurações:

    • Pool de agentes: Azure Pipelines
    • Especificação do agente: ubuntu-latest
  9. Ao lado de Agent job, clique em Add a task to agent job para adicionar uma etapa à fase.

  10. Selecione a tarefa bash e clique em Adicionar.

  11. Clique na tarefa recém-adicionada e defina as seguintes configurações:

    • Display name: Rolling deploy
    • Tipo: inline
    • Script:

      INSTANCE_TEMPLATE=clouddemo-$(Build.BuildId)-$(Release.ReleaseId)
      
      gcloud auth activate-service-account \
          --quiet \
          --key-file <(echo $(ServiceAccountKey) | base64 -d)
      
      gcloud compute instance-templates create $INSTANCE_TEMPLATE \
        --machine-type n1-standard-2 \
        --image-family windows-2019-core \
        --image-project windows-cloud \
        --service-account clouddemo-prod@$(CloudDemo.ProjectId).iam.gserviceaccount.com \
        --scopes https://www.googleapis.com/auth/devstorage.read_only \
        --tags gclb-backend \
        --metadata sysprep-specialize-script-url=gs://$(CloudDemo.ProjectId)-artifacts/CloudDemo.Mvc-$(Build.BuildId)-$(Release.ReleaseId).deploy.ps1 \
        --project $(CloudDemo.ProjectId) \
      
      gcloud compute instance-groups managed set-instance-template clouddemo-prod \
        --template $INSTANCE_TEMPLATE \
        --project $(CloudDemo.ProjectId) \
        --zone $(CloudDemo.Zone)
      
      gcloud compute instance-groups managed rolling-action start-update clouddemo-prod \
        --version template=$INSTANCE_TEMPLATE \
        --type proactive \
        --max-unavailable 0 \
        --project $(CloudDemo.ProjectId) \
        --zone $(CloudDemo.Zone)
      
  12. Clique em Save.

  13. Insira um comentário, se quiser, e confirme clicando em OK.

execute o pipeline

Agora que você configurou o pipeline inteiro, é possível testá-lo executando uma alteração no código-fonte:

  1. No computador local, abra o arquivo applications\clouddemo\net4\CloudDemo.Mvc\Views\Home\Index.cshtml no repositório Git que você clonou anteriormente.
  2. Mude o valor de ViewBag.Title de Home Page para This app runs on GKE.
  3. Confirme as alterações e envie-as para o Azure Pipelines.

    Visual Studio

    1. Abra o Team Explorer e clique no ícone Home.
    2. Clique em Changes.
    3. Insira uma mensagem de confirmação como Change site title.
    4. Clique em Confirmar tudo e enviar por push.

    Linha de comando

    1. Organize todos os arquivos modificados:

      git add -A
      
    2. Confirme as alterações no repositório local:

      git commit -m "Change site title"
      
    3. Envie as alterações para o Azure Pipelines:

      git push
      
  4. No menu do Azure DevOps, selecione Pipelines.

    Um build é acionado.

  5. Após a conclusão do build, selecione Pipelines > Versões. Um processo de versão será iniciado.

  6. Clique em Release-1 para abrir a página de detalhes e aguarde até que o status do stage Dev mude para Succeeded.

  7. No console do Google Cloud, selecione Serviços de rede > Balanceamento de carga > clouddemo-dev.

    Anote o endereço IP do front-end.

  8. Abra uma nova janela do navegador e acesse este endereço:

    http://IP_ADDRESS/clouddemo/
    

    em que IP_ADDRESS é o endereço IP do front-end.

    Observe que o aplicativo foi implantado e está usando o título personalizado.

    Você pode ver um erro no início porque o balanceador de carga leva alguns minutos para ficar disponível.

  9. No Azure Pipelines, clique no botão Approve abaixo do cenário Prod, para promover a implantação no ambiente de produção.

    Se você não encontrar o botão, talvez seja necessário aprovar ou rejeitar uma versão anterior.

  10. Insira um comentário, se quiser, e clique em Approve para confirmar.

  11. Aguarde o status do ambiente Prod passar para Succeeded.

  12. No console do Google Cloud, selecione Serviços de rede > Balanceamento de carga > clouddemo-prod.

    Anote o endereço IP do front-end.

  13. Abra uma nova janela do navegador e acesse este endereço:

    http://IP_ADDRESS/clouddemo/
    

    em que IP_ADDRESS é o endereço IP do front-end.

    Observe que o aplicativo foi implantado e está usando o título personalizado.

Limpeza

Para evitar custos adicionais depois de concluir este tutorial, exclua as entidades criadas.

Excluir o projeto do Azure Pipelines

Para excluir o projeto do Azure Pipelines, consulte a documentação de serviços do Azure DevOps. A exclusão do projeto do Azure Pipelines faz com que todas as alterações no código-fonte sejam perdidas.

Excluir os projetos de desenvolvimento e produção do Google Cloud

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

A seguir