Executar hooks antes e depois da implementação

Este início rápido mostra como executar um comando de implementação, um programa arbitrário a executar antes ou depois da implementação com o Cloud Deploy.

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

  1. Crie um cluster do GKE ou um serviço do Cloud Run.

    Também pode usar um cluster do GKE Enterprise para tal, mas este início rápido usa apenas o GKE e o Cloud Run.

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

    É no ficheiro de configuração do Skaffold que configura os hooks de implementação a executar. Identifica um contentor a executar antes da implementação e um contentor a executar após a implementação.

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

    Na configuração do pipeline de fornecimento, vai fazer referência aos hooks de implementação que foram definidos no skaffold.yaml para executar esses hooks.

    Este pipeline inclui apenas uma fase e usa apenas um alvo.

  4. Crie uma versão que é implementada automaticamente no destino.

    Um dos hooks é executado antes da implementação da aplicação e o outro é executado depois.

  5. Veja os resultados dos hooks de pré- e pós-implementação nos registos do Cloud Build, através da página Detalhes da implementação do Cloud Deploy naGoogle Cloud consola.

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

    3. Adicione a função iam.serviceAccountUser, que inclui a autorização actAspara implementar 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
      

    Crie o seu ambiente de tempo de execução

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

    Para o GKE, crie um cluster: deploy-hooks-cluster, com as definições predefinidas. O ponto final da API Kubernetes do cluster tem de ser acessível 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 deploy-hooks-cluster \
                     --project=PROJECT_ID \
                     --region=us-central1
    

    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 no seu destino.

    Neste início rápido, cria um ficheiro skaffold.yaml, que identifica o manifesto a usar para implementar a app de exemplo e também identifica os contentores a executar antes e depois da implementação (os hooks de implementação).

    1. Abra uma janela de terminal.

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

      GKE

      mkdir deploy-hooks-gke-quickstart
      cd deploy-hooks-gke-quickstart
      

      Cloud Run

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

      GKE

      apiVersion: skaffold/v4beta7
      kind: Config
      manifests:
        rawYaml:
        - k8s-pod.yaml
      deploy:
        kubectl: {}
      customActions:
      - name: predeploy-action
        containers:
        - name: predeploy-echo
          image: ubuntu
          command: ["/bin/sh"]
          args: ["-c", 'echo "this is a predeploy action"' ]
      - name: postdeploy-action
        containers:
        - name: postdeploy-echo
          image: ubuntu
          command: ["/bin/sh"]
          args: ["-c", 'echo "this is a postdeploy action"' ]
      

      Cloud Run

      apiVersion: skaffold/v4beta7
      kind: Config
      manifests:
        rawYaml:
        - service.yaml
      deploy:
        cloudrun: {}
      customActions:
      - name: predeploy-action
        containers:
        - name: predeploy-echo
          image: ubuntu
          command: ["/bin/sh"]
          args: ["-c", 'echo "this is a predeploy action"' ]
      - name: postdeploy-action
        containers:
        - name: postdeploy-echo
          image: ubuntu
          command: ["/bin/sh"]
          args: ["-c", 'echo "this is a postdeploy action"' ]
      

      Este ficheiro inclui a secção customActions:. Isto define os contentores a executar antes e depois da implementação, ou seja, os hooks.

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

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

      GKE

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

      apiVersion: v1
      kind: Pod
      metadata:
        name: my-hooks-pod
      spec:
        containers:
        - name: nginx
          image: my-app-image
      

      Este ficheiro é um manifesto básico do Kubernetes, que é aplicado ao cluster 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

      Crie um ficheiro denominado service.yaml com o seguinte conteúdo:

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

      Este ficheiro é uma definição simples do serviço do Cloud Run, que é usada 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 seu pipeline de entrega e segmentação

    Pode definir o seu pipeline e destino num ficheiro ou em ficheiros separados. Neste início rápido, vai criar um único ficheiro.

    1. Crie o pipeline de fornecimento e a definição do alvo:

      GKE

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

      apiVersion: deploy.cloud.google.com/v1
      kind: DeliveryPipeline
      metadata:
        name: deploy-hooks-demo-app-gke-1
      description: main application pipeline
      serialPipeline:
        stages:
        - targetId: hooks-staging
          profiles: []
          strategy:
            standard:
              predeploy:
                actions: ["predeploy-action"]
              postdeploy:
                actions: ["postdeploy-action"]
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Target
      metadata:
        name: hooks-staging
      description: hooks staging cluster
      gke:
        cluster: projects/PROJECT_ID/locations/us-central1/clusters/deploy-hooks-cluster
      

      Cloud Run

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

      apiVersion: deploy.cloud.google.com/v1
      kind: DeliveryPipeline
      metadata:
        name: deploy-hooks-demo-app-run-1
      description: main application pipeline
      serialPipeline:
        stages:
        - targetId: hooks-staging
          profiles: []
          strategy:
            standard:
              predeploy:
                actions: ["predeploy-action"]
              postdeploy:
                actions: ["postdeploy-action"]
      ---
      
      apiVersion: deploy.cloud.google.com/v1
      kind: Target
      metadata:
        name: hooks-staging
      description: staging Run service
      run:
        location: projects/PROJECT_ID/locations/us-central1
      
    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 de implementação, com um destino, pronto para implementar a sua aplicação e executar as tarefas de pré-implementação e pós-implementaçã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 um alvo apresentado na coluna Alvos.

      Página do pipeline de entrega na consola Google Cloud , que mostra o seu pipeline

    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-hooks-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=deploy-hooks-demo-app-gke-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 com 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-hooks-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=deploy-hooks-demo-app-run-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.

    Tal como acontece com todos os lançamentos (a menos que incluam --disable-initial-rollout), o Cloud Deploy também cria automaticamente um recurso de implementação. A aplicação é implementada automaticamente no destino configurado para este pipeline de entrega.

    Além disso, a tarefa de pré-implementação é executada antes da implementação da aplicação e a tarefa de pós-implementação é executada depois.

    Veja os resultados na Google Cloud consola

    Após alguns minutos, o lançamento é implementado no tempo de execução de destino.

    Os hooks de pré e pós-implementação que configurámos (para fins de exemplo) imprimem strings nos registos do Cloud Build. Podemos ver esses registos para confirmar que os hooks funcionaram como esperado.

    1. Na Google Cloud consola, navegue para a página Cloud Deploy Pipelines de fornecimento para ver o seu pipeline de fornecimento ("deploy-hooks-demo-app-gke-1" ou "deploy-hooks-demo-app-run-1").

      Abra a página Pipelines de fornecimento

    2. Clique no nome do pipeline de implementação ("deploy-hooks-demo-app-gke-1" ou "deploy-hooks-demo-app-run-1").

      A visualização do pipeline mostra o estado de implementação da app. Uma vez que existe apenas uma fase no pipeline, a visualização mostra apenas um nó.

      Visualização do pipeline de entrega a mostrar sucesso

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

    3. Clique no separador Implementações, em Detalhes do pipeline de fornecimento.

    4. Clique no nome da implementação para ver os respetivos detalhes.

      Implementações na consola Google Cloud

      Predeploy e Postdeploy são apresentados como trabalhos.

    5. Clique em Pré-implementar

      É apresentado o registo de execução da tarefa.

    6. Desloque a página para baixo na lista de entradas do registo para encontrar predeploy-echo e clique no mesmo.

      Registo da tarefa de pré-implementação

      Repare no textPayload. Essa string é o que foi configurado no predeploy-action na sua configuração do Skaffold.

    7. Clique na tarefa Postdeploy e encontre a entrada de registo postdeploy-echo.

      Registo da tarefa Postdeploy

    Limpar

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

    1. Elimine o cluster do GKE ou o serviço do Cloud Run:

      GKE

      gcloud container clusters delete deploy-hooks-cluster --region=us-central1 --project=PROJECT_ID
      

      Cloud Run

      gcloud run services delete my-hooks-run-service --region=us-central1 --project=PROJECT_ID
      
    2. Elimine o pipeline de envio, o destino, o lançamento e a implementação:

      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?