Como lançar com o Cloud Deploy

1. Objetivos

Neste tutorial, você vai criar três clusters do GKE chamados "preview", "canary" e "prod". Em seguida, crie um destino do Cloud Deploy correspondente a cada cluster e um pipeline do Cloud Deploy que definirá a sequência de etapas para realizar a implantação nesses destinos.

O fluxo de implantação será acionado por um pipeline do cloudbuild que vai criar uma versão do Cloud Deploy e realizar a implantação no cluster de prévia. Depois de verificar se a implantação na prévia foi concluída e está funcionando como esperado, promova manualmente a versão no cluster canário. A promoção do lançamento no cluster de produção vai exigir aprovação. Você vai aprovar o pipeline de produção na interface do Cloud Deploy e, por fim, promovê-lo.

Os objetivos deste tutorial podem ser divididos nas seguintes etapas:

  • Preparar seu espaço de trabalho
  • Definir destinos do Cloud Deploy
  • Definir o pipeline do Cloud Deploy
  • Criar uma versão
  • Promover uma implantação
  • Aprovar uma versão de produção

Configuração de ambiente personalizada

  1. Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • O Nome do projeto é o nome de exibição para os participantes do projeto. Ele é uma string de caracteres que não é usada pelas APIs do Google e pode ser atualizada a qualquer momento.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser alterado após a definição. O Console do Cloud gera automaticamente uma string única, geralmente não importa o que seja. Na maioria dos codelabs, você precisará fazer referência ao ID do projeto, que geralmente é identificado como PROJECT_ID. Então, se você não gostar dele, gere outro ID aleatório ou crie um próprio e veja se ele está disponível. Em seguida, ele fica "congelado" depois que o projeto é criado.
  • Há um terceiro valor, um Número de projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, você precisará ativar o faturamento no Console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não será muito cara, se tiver algum custo. Para encerrar os recursos e não gerar cobranças além deste tutorial, siga as instruções de "limpeza" encontradas no final do codelab. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

2. Configuração da plataforma

Preparar seu espaço de trabalho

Vamos configurar aqui o ambiente necessário para executar este tutorial. Quando essa etapa for concluída, teremos um cluster do GKE criado para executar as implantações.

  1. Definir padrões de configuração da gcloud

gcloud config set project <your project>

gcloud config set deploy/region us-central1

  1. Clonar repositório

git clone https://github.com/gushob21/software-delivery-workshop

cd software-delivery-workshop/labs/cloud-deploy/

cloudshell workspace .

rm -rf deploy && mkdir deploy

  1. Definir as variáveis de ambiente

export PROJECT_ID=$(gcloud config get-value project)

export PROJECT_NUMBER=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")

  1. Ativar APIs

gcloud services enable \

cloudresourcemanager.googleapis.com \

    `container.googleapis.com \`

    `cloudbuild.googleapis.com \`

    `containerregistry.googleapis.com \`

    `secretmanager.googleapis.com \`

    `clouddeploy.googleapis.com` 
  1. Criar clusters do GKE
     `gcloud container clusters create preview \`
    

--zone=us-central1-a --async

    `gcloud container clusters create canary \`

--zone=us-central1-b --async

    `gcloud container clusters create prod \`

--zone=us-central1-c

Como definir destinos do Cloud Deploy

  1. Crie um arquivo no diretório "deploy" chamado "preview.yaml" com o seguinte comando no Cloud Shell:

cat <<EOF >deploy/preview.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: preview

annotations: {}

labels: {}

description: Target for preview environment

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-a/clusters/preview

EOF

    As you noticed, the "kind" tag is "Target". It allows us to add some metadata to the target, a description and finally the GKE cluster where the deployment is supposed to happen for this target.
  1. Crie um arquivo no diretório "deploy" chamado "canary.yaml" com o seguinte comando no Cloud Shell:

cat <<EOF >deploy/canary.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: canary

annotations: {}

labels: {}

description: Target for canary environment

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-b/clusters/canary

EOF

  1. Crie um arquivo no diretório "deploy" chamado "prod.yaml" com o seguinte comando no Cloud Shell:

cat <<EOF >deploy/prod.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: prod

annotations: {}

labels: {}

description: Target for prod environment

requireApproval: true

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-c/clusters/prod

EOF

Observe a tag requireApproval, que está definida como "true". Isso não vai permitir a promoção para o destino de produção até que a aprovação seja concedida. Você precisa da função roles/clouddeploy.approver para aprovar um lançamento.

  1. Criar os destinos de implantação
         `gcloud config set deploy/region us-central1` 
    

gcloud beta deploy apply --file deploy/preview.yaml

gcloud beta deploy apply --file deploy/canary.yaml

gcloud beta deploy apply --file deploy/prod.yaml

3. Criação de apps

Como parte da criação de um novo aplicativo, o pipeline de CICD geralmente é configurado para realizar builds, testes de integração e implantações automáticas. As etapas a seguir são consideradas parte do processo de configuração de um novo app. Cada novo aplicativo terá um pipeline de implantação configurado.

Como definir o pipeline do Cloud Deploy

  1. Crie um arquivo no diretório "deploy" chamado "pipeline.yaml" com o seguinte comando no Cloud Shell:

cat <<EOF >>deploy/pipeline.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: DeliveryPipeline

metadata:

name: sample-app

labels:

`app: sample-app`

description: delivery pipeline

serialPipeline:

stages:

- targetId: preview

`profiles:`

`- preview`

- targetId: canary

`profiles:`

`- canary`

- targetId: prod

`profiles:`

`- prod`

EOF

    As you noticed, the "kind" tag is "DeliveryPipeline". It lets you define the metadata for the pipeline, a description and an order of deployment into various targets via serialPipeline tag.

A tag serialPipeline contém uma tag chamada "stages", que é uma lista de todos os destinos em que esse pipeline de entrega está configurado para implantação.

targetId identifica o destino específico a ser usado nesta etapa do pipeline de entrega. O valor é a propriedade "metadata.name" da definição de destino.

profiles é uma lista de zero ou mais nomes de perfil do Skaffold do skaffold.yaml. O Cloud Deploy usa o perfil com a renderização do Skaffold ao criar a versão.

  1. Aplicar pipeline

gcloud beta deploy apply --file deploy/pipeline.yaml

4. Fase de desenvolvimento

À medida que os aplicativos são desenvolvidos, os conjuntos de ferramentas de CICD automatizados criam e armazenam recursos. Os comandos a seguir são executados para criar o aplicativo usando o Skaffold e armazenar recursos para implantação com o Cloud Deploy. Essa etapa seria realizada pelo seu processo de CICD para cada build de aplicativo.

  1. Criar e armazenar o aplicativo com o skaffold

skaffold build \

--file-output=artifacts.json \

--default-repo gcr.io/$PROJECT_ID \

--push=true

5. Fase de lançamento

Ao final do processo de CICD, normalmente quando o código é marcado para produção, você inicia o processo de lançamento chamando o comando cloud deploy release. Depois que a implantação for validada e aprovada, você vai mover a versão pelos vários ambientes de destino promovendo e aprovando a ação por processos automatizados ou aprovações manuais.

Como criar uma versão

Criamos arquivos do Cloud Deploy neste tutorial para entender como ele funciona. Para fins de demonstração, criamos os mesmos arquivos do Cloud Deploy e os enviamos para um repositório do GitHub com um aplicativo Go de exemplo. Vamos usar o Cloud Deploy para lançar esse aplicativo.

export REL_TIMESTAMP=$(date '+%Y%m%d-%H%M%S')

gcloud beta deploy releases create \

sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--description="Release demo" \

--build-artifacts=artifacts.json \

--annotations="release-id=rel-${REL_TIMESTAMP}"

Revisar a versão

Quando uma versão do Cloud Deploy é criada, ela é lançada automaticamente no primeiro destino, que é a prévia.

  1. Acesse <Cloud Deploy> no console do Google Cloud.
  2. Clique em "sample-app".

Nessa tela, você vai encontrar uma representação gráfica do seu pipeline.

  1. Confirme um contorno verde no lado esquerdo da caixa de visualização, o que significa que a versão foi implantada nesse ambiente.
  2. Se quiser, clique no nome da versão em "Detalhes da versão" na seção inferior da tela para conferir mais detalhes.
  3. Para verificar se o lançamento implantou o aplicativo com sucesso, execute o seguinte comando no Cloud Shell:

gcloud container clusters get-credentials preview --zone us-central1-a && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. Clique no ícone de visualização da Web no canto superior direito da tela.
  2. Selecione "Visualizar na porta 8080".

Isso vai abrir uma nova página com a mensagem "Hello World!".

  1. Use ctrl+c no terminal para encerrar o encaminhamento de porta.

Como promover uma versão

Agora que a versão foi implantada no primeiro destino (prévia) do pipeline, é possível promovê-la para o próximo destino (canário). Execute o comando a seguir para iniciar o processo.

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

Revisar a promoção da versão

  1. Acesse o pipeline sample-app no console do Google Cloud.
  2. Confirme um contorno verde no lado esquerdo da caixa do Canary, o que significa que a versão foi implantada nesse ambiente.
  3. Verifique se o aplicativo foi implantado corretamente criando um túnel para ele

gcloud container clusters get-credentials canary --zone us-central1-b && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. Clique no ícone de visualização da Web no canto superior direito da tela.
  2. Selecione "Visualizar na porta 8080".

Isso vai abrir uma nova página com a mensagem "Hello World!".

  1. Use ctrl+c no terminal para encerrar o encaminhamento de porta.

Como aprovar uma versão de produção

Quando criamos o destino de produção usando prod.yaml, especificamos a tag requireApproval como "true". Isso vai forçar a exigência de aprovação para promoção em produção.

  1. Promova a versão canário para produção com o seguinte comando:

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

  1. Acesse o pipeline sample-app no console do Google Cloud.
  2. Observe o indicador amarelo "1 pendente".

Essa mensagem indica que há uma versão na fila para implantação na produção, mas que precisa de revisão e aprovação.

  1. Clique no botão "Analisar" logo abaixo do aviso amarelo.
  2. Na próxima tela, clique em "Revisar" novamente para acessar a tela de aprovação para produção.
  3. Se quiser, revise a diferenciação do manifesto para analisar as mudanças. Nesse caso, um arquivo totalmente novo.
  4. Clique no botão "Aprovar".
  5. Volte à página do pipeline do app de exemplo, onde você verá o lançamento para produção em andamento.

Revisar a versão de produção

Assim como nos outros ambientes, você pode analisar a implantação quando ela for concluída seguindo as etapas abaixo.

  1. Execute o comando a seguir no Cloud Shell para criar o encaminhamento de porta:

gcloud container clusters get-credentials prod --zone us-central1-c && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. Clique no ícone de visualização da Web no canto superior direito da tela.
  2. Selecione "Visualizar na porta 8080".

Isso vai abrir uma nova página com a mensagem "Hello World!".

  1. Use ctrl+c no terminal para encerrar o encaminhamento de porta.