Automatize a promoção de lançamentos e o avanço da implementação no Cloud Deploy

Esta página mostra como usar o Cloud Deploy para promover automaticamente uma versão para um destino e avançar uma implementação para a fase seguinte.

Neste início rápido, vai fazer o seguinte:

  1. Crie dois clusters do GKE ou dois serviços do Cloud Run.

  2. Crie uma configuração do Skaffold e um manifesto do Kubernetes ou uma definição de serviço do Cloud Run.

  3. Defina o pipeline de entrega e os destinos de implementação do Cloud Deploy.

    O pipeline vai ser implementado em dois destinos: dev e staging. Além disso, o alvo usa uma estratégia de implementação canary.staging

  4. Defina duas regras de automatização:

    • Uma automatização para promover o lançamento no staging alvo no implementação bem-sucedida para dev.

    • Uma automatização para avançar a implementação para a fase stable após a conclusão bem-sucedida da fase canary-25.

  5. Instancie o pipeline de entrega criando uma versão, que é implementada automaticamente no destino dev.

  6. Veja o pipeline de fornecimento e o lançamento na Google Cloud consola.

    Devido à promoção automatizada, este lançamento é promovido automaticamente na secção staging.

    Uma vez que o destino staging usa uma estratégia de implementação canária e esta é a primeira implementação nesse tempo de execução, a fase canary-25 é ignorada. Consulte o artigo Por que motivo, por vezes, as fases são ignoradas para compreender melhor o motivo pelo qual a fase de teste é ignorada na primeira vez.

    Devido ao avanço de fase automático, a implementação avançou para a fase stable.

Antes de começar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI gcloud com a sua identidade federada.

  7. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI gcloud com a sua identidade federada.

  13. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  14. Se já tiver a CLI instalada, certifique-se de que está a executar a versão mais recente:

    gcloud components update
    
  15. Certifique-se de que a conta de serviço predefinida do Compute Engine tem autorizações suficientes.

    A conta de serviço pode já ter as autorizações necessárias. Estes passos são incluídos para projetos que desativam as concessões de funções automáticas para contas de serviço predefinidas.

    1. Primeiro, adicione a função clouddeploy.jobRunner:
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --role="roles/clouddeploy.jobRunner"
      
    2. Adicione a função clouddeploy.releaser:
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --role="roles/clouddeploy.releaser"
      
    3. Adicione a função de programador para o seu tempo de execução específico.
      • Para o GKE:
        gcloud projects add-iam-policy-binding PROJECT_ID \
            --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
            --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
            --role="roles/container.developer"
        
      • Para o Cloud Run:
        gcloud projects add-iam-policy-binding PROJECT_ID \
            --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
            --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
            --role="roles/run.developer"
        
    4. Adicione a função iam.serviceAccountUser, que inclui a autorização actAs para a conta de serviço predefinida para implementação no tempo de execução:
      gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --role="roles/iam.serviceAccountUser" \
          --project=PROJECT_ID
      
    5. Adicione a função iam.serviceAccountUser, incluindo a autorização actAs para si, para usar a conta de serviço predefinida:
      gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
          --member=user:YOUR_EMAIL_ADDRESS \
          --role="roles/iam.serviceAccountUser" \
          --project=PROJECT_ID
      

      Neste caso, YOUR_EMAIL_ADDRESS é o endereço de email que usa para aceder ao Google Cloud.

    Crie os seus ambientes de tempo de execução

    Se estiver a implementar no Cloud Run, pode ignorar este comando.

    Para o GKE, crie dois clusters: automation-quickstart-cluster-dev e automation-quickstart-cluster-staging, com as predefinições. Os pontos finais da API Kubernetes dos clusters têm de ser acessíveis através da rede a partir da Internet pública. Os clusters do GKE são acessíveis externamente por predefinição.

    gcloud container clusters create-auto automation-quickstart-cluster-dev \
                     --project=PROJECT_ID \
                     --region=us-central1 \
                     && gcloud container clusters create-auto automation-quickstart-cluster-staging \
                     --project=PROJECT_ID \
                     --region=us-central1
    

    Obtenha o número do projeto.

    Precisa do número do projeto para identificar a conta de serviço predefinida. Isto é necessário para configurar o recurso de automatização.

    1. Execute o seguinte comando para obter o número do projeto:

      gcloud projects describe PROJECT_ID --format="value(projectNumber)"
      
    2. Copie o número do projeto a partir do resultado da linha de comandos e cole-o aqui.

      Não precisa de executar isto como um comando. Colá-lo aqui preenche a referência da conta de serviço na configuração da automatização mais tarde neste início rápido.

      PROJECT_NUMBER
      

    Prepare a configuração do Skaffold e o manifesto da aplicação

    O Cloud Deploy usa o Skaffold para fornecer os detalhes sobre o que implementar e como o implementar corretamente para os seus alvos separados.

    Neste início rápido, cria um ficheiro skaffold.yaml que identifica o manifesto da aplicação a usar para implementar a app de exemplo.

    1. Abra uma janela de terminal.

    2. Crie um novo diretório e navegue para o mesmo.

      GKE

      mkdir deploy-automation-gke-quickstart
      cd deploy-automation-gke-quickstart
      

      Cloud Run

      mkdir deploy-automation-run-quickstart
      cd deploy-automation-run-quickstart
      
    3. Crie um ficheiro denominado skaffold.yaml com o seguinte conteúdo:

      GKE

      apiVersion: skaffold/v4beta7
      kind: Config
      metadata:
        name: gke-automation
      manifests:
        rawYaml:
        - k8s-deployment.yaml
      deploy:
        kubectl: {}
      

      Cloud Run

      apiVersion: skaffold/v4beta7
      kind: Config
      metadata:
        name: run-automation
      profiles:
      - name: dev
        manifests:
          rawYaml:
          - run-dev.yaml
      - name: staging
        manifests:
          rawYaml:
          - run-staging.yaml
      deploy:
        cloudrun: {}
      

      Este ficheiro é uma configuração mínima do Skaffold. Para este início rápido, cria o ficheiro No entanto, também pode pedir ao Cloud Deploy que crie um para si, para aplicações simples que não sejam de produção.

      Consulte a referência skaffold.yaml para mais informações acerca deste ficheiro.

    4. Crie a definição da sua aplicação: um par de definições de serviço para o Cloud Run ou um manifesto do Kubernetes para o GKE.

      GKE

      Crie um ficheiro denominado k8s-deployment.yaml com o seguinte conteúdo:

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: my-deployment
        labels:
          app: my-app
        namespace: default
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: my-app
        template:
          metadata:
            labels:
              app: my-app
          spec:
            containers:
            - name: nginx
              image: my-app-image
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: my-service
        namespace: default
      spec:
        selector:
          app: my-app
        ports:
          - protocol: TCP
            port: 80
      

      Este ficheiro é um manifesto simples do Kubernetes, que é usado para implementar a aplicação. A imagem do contentor a implementar é definida aqui como um marcador de posição, my-app-image, que é substituído pela imagem específica quando cria a versão.

      Cloud Run

      1. Crie um ficheiro denominado run-dev.yaml com o seguinte conteúdo:

        apiVersion: serving.knative.dev/v1
        kind: Service
        metadata:
          name: my-automation-run-service-dev
        spec:
          template:
            spec:
              containers:
              - image: my-app-image
        
      2. Crie um ficheiro denominado run-staging.yaml com o seguinte conteúdo:

        apiVersion: serving.knative.dev/v1
        kind: Service
        metadata:
          name: my-automation-run-service-staging
        spec:
          template:
            spec:
              containers:
              - image: my-app-image
        

      Estes ficheiros são definições simples do serviço Cloud Run, que são usadas para implementar a aplicação. A imagem do contentor a implementar é definida aqui como um marcador de posição, my-app-image, que é substituído pela imagem específica quando cria a versão.

    Crie o pipeline de entrega, os alvos e a automatização

    Pode definir o pipeline de entrega e os alvos num ficheiro ou em ficheiros separados. Também pode definir uma ação de automatização num ficheiro separado. Este início rápido usa um ficheiro para o pipeline, as segmentações e a automatização.

    1. Crie o pipeline de fornecimento, as definições de segmentação e a ação de automatização:

      GKE

      No diretório deploy-automation-gke-quickstart, crie um novo ficheiro: clouddeploy.yaml, com o seguinte conteúdo:

      apiVersion: deploy.cloud.google.com/v1
      kind: DeliveryPipeline
      metadata:
        name: my-automation-demo-app-1
      description: Automation demonstration pipeline
      serialPipeline:
        stages:
        - targetId: automation-quickstart-dev
        - targetId: automation-quickstart-staging
          profiles: []
          strategy:
            canary:
              runtimeConfig:
                kubernetes:
                  serviceNetworking:
                    service: "my-service"
                    deployment: "my-deployment"
              canaryDeployment:
                percentages: [25]
                verify: false
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Target
      metadata:
        name: automation-quickstart-dev
      description: Dev cluster to demonstrate deploy automation
      gke:
        cluster: projects/PROJECT_ID/locations/us-central1/clusters/automation-quickstart-cluster-dev
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Target
      metadata:
        name: automation-quickstart-staging
      description: Staging cluster to demonstrate deploy automation
      gke:
        cluster: projects/PROJECT_ID/locations/us-central1/clusters/automation-quickstart-cluster-staging
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Automation
      metadata:
        name: my-automation-demo-app-1/promote
      description: promotes a release
      suspended: false
      serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com
      selector:
        targets:
        - id: automation-quickstart-dev
      rules:
      - promoteReleaseRule:
          name: "promote-release"
          wait: 1m
          toTargetId: "@next"
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Automation
      metadata:
        name: my-automation-demo-app-1/advance
      description: advances a rollout
      suspended: false
      serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com
      selector:
        targets:
        - id: automation-quickstart-staging
      rules:
      - advanceRolloutRule:
          name: "advance-rollout"
          sourcePhases: ["canary-25"]
          wait: 1m
      

      Cloud Run

      No diretório deploy-automation-run-quickstart, crie um novo ficheiro: clouddeploy.yaml, com o seguinte conteúdo:

      apiVersion: deploy.cloud.google.com/v1
      kind: DeliveryPipeline
      metadata:
        name: my-automation-demo-app-1
      description: Automation demonstration pipeline
      serialPipeline:
        stages:
        - targetId: automation-quickstart-dev
          profiles: [dev]
        - targetId: automation-quickstart-staging
          profiles: [staging]
          strategy:
            canary:
              runtimeConfig:
                cloudRun:
                  automaticTrafficControl: true
              canaryDeployment:
                percentages: [25]
                verify: false
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Target
      metadata:
        name: automation-quickstart-dev
      description: Dev cluster to demonstrate deploy automation
      run:
        location: projects/PROJECT_ID/locations/us-central1
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Target
      metadata:
        name: automation-quickstart-staging
      description: Staging cluster to demonstrate deploy automation
      run:
        location: projects/PROJECT_ID/locations/us-central1
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Automation
      metadata:
        name: my-automation-demo-app-1/promote
      description: Promotes a release to the next target
      suspended: false
      serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com
      selector:
        targets:
        - id: automation-quickstart-dev
      rules:
      - promoteReleaseRule:
          name: "promote-release"
          wait: 1m
          toTargetId: "@next"
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Automation
      metadata:
        name: my-automation-demo-app-1/advance
      description: advances a rollout
      suspended: false
      serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com
      selector:
        targets:
        - id: automation-quickstart-staging
      rules:
      - advanceRolloutRule:
          name: "advance-rollout"
          sourcePhases: ["canary-25"]
          wait: 1m
      
    2. Registe o pipeline e os destinos no serviço Cloud Deploy:

      gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID
      

      Agora, tem um pipeline com um alvo múltiplo que compreende dois alvos do GKE ou do Cloud Run, pronto para implementar a sua aplicação.

    3. Confirme o seu pipeline e alvos:

      Na Google Cloud consola, navegue para a página Cloud Deploy Pipelines de entrega para ver uma lista dos pipelines de entrega disponíveis.

      Abra a página Pipelines de fornecimento

      É apresentada a pipeline de fornecimento que acabou de criar, com dois alvos listados na coluna Alvos.

      Visualização do pipeline de entrega na consola Google Cloud

    4. Clique no nome do pipeline para abrir a visualização do pipeline de entrega e os detalhes.

    5. Selecione o separador Automatizações em Detalhes do pipeline de fornecimento.

      São apresentadas as duas automatizações que criou.

      Visualização do pipeline de entrega na consola Google Cloud

    Crie um lançamento

    Um lançamento é o recurso central do Cloud Deploy que representa as alterações que estão a ser implementadas. O pipeline de fornecimento define o ciclo de vida dessa versão. Consulte a secção Arquitetura do serviço Cloud Deploy para ver detalhes sobre esse ciclo de vida.

    GKE

    Execute o seguinte comando a partir do diretório deploy-automation-gke-quickstart para criar um recurso release que represente a imagem do contentor a implementar:

     gcloud deploy releases create test-release-001 \
       --project=PROJECT_ID \
       --region=us-central1 \
       --delivery-pipeline=my-automation-demo-app-1 \
       --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
    

    Repare na flag --images=, que usa para substituir o marcador de posição (my-app-image) no manifesto pela imagem específica qualificada por SHA. A Google recomenda que crie modelos dos seus manifestos desta forma e que use nomes de imagens qualificados por SHA na criação de lançamentos.

    Cloud Run

    Execute o seguinte comando a partir do diretório deploy-automation-run-quickstart para criar um recurso release que represente a imagem do contentor a implementar:

     gcloud deploy releases create test-release-001 \
       --project=PROJECT_ID \
       --region=us-central1 \
       --delivery-pipeline=my-automation-demo-app-1 \
       --images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a
    

    Repare na flag --images=, que usa para substituir o marcador de posição (my-app-image) na definição do serviço pela imagem específica qualificada com SHA. A Google recomenda que crie modelos das definições de serviços e tarefas desta forma e que use nomes de imagens qualificados por SHA na criação de lançamentos.

    Por predefinição, quando cria um lançamento, é criada automaticamente uma implementação para o primeiro destino no seu pipeline.

    Como este início rápido inclui duas automatizações, acontecem duas coisas automaticamente:

    • Após uma implementação bem-sucedida no primeiro destino, a versão é promovida automaticamente para o segundo destino.

      Existe um tempo de espera de um minuto na automatização de promoção.

    • No segundo destino, onde existe uma versão canary de 25% configurada, a segunda automação avança a implementação de canary-25 para stable.

      Para este primeiro lançamento, a fase canary-25 é ignorada, porque não existe uma versão pré-existente da app para testar. Além disso, a implementação é automaticamente avançada para stable.

      Existe um atraso de um minuto na automatização avançada.

    Quando tudo terminar, a aplicação é implementada com êxito em ambos os destinos sem que tenha de fazer mais nada.

    Se quiser saber mais sobre a execução de uma estratégia de implementação canary, pode experimentar o início rápido da canary.

    Veja os resultados na Google Cloud consola

    Pode ver os resultados, incluindo as execuções de automatização, na Google Cloud consola.

    1. Navegue para a página Pipelines de fornecimento do Cloud Deploy para ver o seu pipeline de fornecimento.

      Abra a página Pipelines de fornecimento

    2. Clique no nome do pipeline de entrega "my-automation-demo-app-1".

      A visualização do pipeline mostra o estado de implementação da app. Se tiver decorrido tempo suficiente, ambos os alvos são apresentados a verde.

      Visualização do pipeline de entrega na consola Google Cloud

      O lançamento é apresentado no separador Lançamentos em Detalhes do pipeline de envio.

    3. Clique no separador Execuções de automatizações.

      Existem duas entradas, uma para cada uma das duas automatizações que criou. Pode clicar em qualquer uma das opções para ver os detalhes dessa execução da automatização.

      Detalhes da execução da automatização apresentados na consola Google Cloud

    Limpar

    Para evitar incorrer em cobranças na sua Google Cloud conta pelos recursos usados nesta página, siga estes passos.

    1. Elimine os clusters do GKE ou os serviços do Cloud Run:

      GKE

      gcloud container clusters delete automation-quickstart-cluster-dev --region=us-central1 --project=PROJECT_ID \
      && gcloud container clusters delete automation-quickstart-cluster-staging --region=us-west1 --project=PROJECT_ID
      

      Cloud Run

      gcloud run services delete my-automation-run-service-dev --region=us-central1 --project=PROJECT_ID \
      && gcloud run services delete my-automation-run-service-staging --region=us-central1 --project=PROJECT_ID
      
    2. Elimine o pipeline de implementação, os destinos, as automatizações, o lançamento e as implementações:

      gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
      
    3. Elimine os contentores do Cloud Storage que o Cloud Deploy criou.

      Uma termina com _clouddeploy e a outra é [region].deploy-artifacts.[project].appspot.com.

      Abra a página do navegador do Cloud Storage

    É tudo. Concluiu este início rápido!

    O que se segue?