1. Objetivos
Neste tutorial, você vai criar três clusters do GKE chamados "preview", "canário" e "prod". Em seguida, crie um destino do Cloud Deploy correspondente a cada cluster e um pipeline do Cloud Deploy que defina a sequência de etapas para realizar a implantação nesses destinos.
O fluxo de implantação será acionado por um pipeline do Cloud Build, que vai criar a versão do Cloud Deploy e realizar a implantação no cluster de visualização. Depois de verificar se a implantação na prévia foi concluída e está funcionando conforme o esperado, promova a versão manualmente no cluster de canário. A promoção da versão 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, promover.
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
- 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.
- 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.
- 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
Como preparar seu espaço de trabalho
Vamos configurar nosso ambiente aqui, o que é necessário para executar este tutorial. Quando essa etapa for concluída, teremos um cluster do GKE criado para executar as implantações.
- Definir padrões de configuração do gcloud
gcloud config set project <your project>
gcloud config set deploy/region us-central1
- Clone Repo
git clone https://github.com/gushob21/software-delivery-workshop
cd software-delivery-workshop/labs/cloud-deploy/
cloudshell workspace .
rm -rf deploy && mkdir deploy
- 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)")
- Ativar APIs
gcloud services enable \
cloudresourcemanager.googleapis.com \
`container.googleapis.com \`
`cloudbuild.googleapis.com \`
`containerregistry.googleapis.com \`
`secretmanager.googleapis.com \`
`clouddeploy.googleapis.com`
- 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
- Crie um arquivo no diretório de implantação chamado preview.yaml com o seguinte comando no cloudshell:
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.
- Crie um arquivo no diretório de implantação 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
- Crie um arquivo no diretório de implantação 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 que a tag "requireApproval" 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 uma versão.
- 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 executar builds automáticos, testes de integração e implantações. 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
- Crie um arquivo no diretório de implantação 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 neste estágio 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.
- Aplicar pipeline
gcloud beta deploy apply --file deploy/pipeline.yaml
4. Fase de desenvolvimento
À medida que os aplicativos são desenvolvidos, as cadeias de ferramentas CICD automatizadas vão criar e armazenar recursos. Os comandos abaixo são executados para criar o aplicativo usando o skaffold e armazenar recursos para implantação com o Cloud Deploy. Essa etapa é realizada pelo processo CICD para cada build de aplicativo.
- 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 para os 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 de exemplo e 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.
- Acesse <Cloud Deploy> no console do Google Cloud.
- Clique em "sample-app".
Nesta tela, você vai encontrar uma representação gráfica do seu pipeline.
- Confirme um contorno verde no lado esquerdo da caixa de visualização, o que significa que a versão foi implantada nesse ambiente.
- Se quiser, confira mais detalhes sobre a versão clicando no nome dela em "Detalhes da versão" na parte de baixo da tela.
- Para verificar se a versão implantou o aplicativo, execute o comando a seguir no cloushell.
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
- Clique no ícone de visualização da Web no canto superior direito da tela.
- Selecione "Visualizar na porta 8080"
Isso vai levar você a uma nova página que mostra a mensagem "Hello World!"
- 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é-lançamento) no pipeline, ela pode ser promovida 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
Analisar a promoção da versão
- Acesse o pipeline sample-app no console do Google Cloud.
- Confirme um contorno verde no lado esquerdo da caixa Canary, o que significa que a versão foi implantada nesse ambiente.
- Crie um túnel para o aplicativo e verifique se ele foi implantado corretamente
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
- Clique no ícone de visualização da Web no canto superior direito da tela.
- Selecione "Visualizar na porta 8080"
Isso vai levar você a uma nova página que mostra a mensagem "Hello World!"
- Use
ctrl+c
no terminal para encerrar o encaminhamento de porta.
Como aprovar uma versão de produção
Lembre-se de que, quando criamos o destino de produção pelo arquivo prod.yaml, especificamos a tag requireApproval como "true". Isso vai forçar a aprovação da promoção no produto.
- Promova a versão canário para a produção com o seguinte comando:
gcloud beta deploy releases promote \
--release=sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--quiet
- Acesse o pipeline sample-app no console do Google Cloud.
- 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 ser analisada e aprovada.
- Clique no botão "Revisar" logo abaixo do aviso amarelo.
- Na próxima tela, clique em "Revisar" novamente para acessar a tela de aprovação para produção.
- Opcionalmente, analise a diferença do manifesto para analisar as mudanças. Nesse caso, um arquivo totalmente novo.
- Clique no botão "Aprovar".
- Retorne à página do pipeline do app de exemplo, onde você vai encontrar a versão para produção em andamento.
Analisar a versão de produção
Assim como nos outros ambientes, você pode analisar a implantação quando ela for concluída usando as etapas abaixo.
- Execute o comando a seguir no cloudshell para criar o encaminhamento de portas.
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
- Clique no ícone de visualização da Web no canto superior direito da tela.
- Selecione "Visualizar na porta 8080"
Isso vai levar você a uma nova página que mostra a mensagem "Hello World!"
- Use
ctrl+c
no terminal para encerrar o encaminhamento de porta.