Este tutorial é a segunda parte de uma série que discute a criação de um pipeline de integração contínua (CI, na sigla em inglês) automatizado para criar imagens de contêiner de várias arquiteturas no Google Cloud.
Neste tutorial, você implementa um pipeline para criar imagens de contêineres de várias arquiteturas usando o Cloud Build e o Container Registry. Veja neste tutorial a estratégia de criação de várias arquiteturas descrita na seção Como implementar um pipeline de criação de imagens de contêiner de várias arquiteturas na parte 1 desta série.
Por exemplo, suponha que você mantenha uma frota de dispositivos de Internet das Coisas (IoT, na sigla em inglês). À medida que surgem novos requisitos para sua solução de IoT, você precisa de novos dispositivos de hardware. Se os novos dispositivos tiverem uma arquitetura de hardware diferente da existente, será necessário modificar o pipeline de criação para oferecer suporte à nova arquitetura.
Este tutorial destina-se a profissionais de TI que querem simplificar e otimizar os pipelines complexos para criar imagens de contêiner ou para estender esses pipelines para criar imagens de multiarquitetura.
Neste tutorial, presume-se que você tenha um conhecimento básico dos seguintes produtos:
- Terraform, para criar infraestrutura no Google Cloud.
- Google Cloud CLI, para executar tarefas da plataforma no Google Cloud.
- Cloud Shell, para executar comandos neste tutorial. Todas as ferramentas usadas neste tutorial estão pré-instaladas no Cloud Shell.
- Cloud Build, para configurar um pipeline de CI.
- Docker, como uma plataforma de gerenciamento de contêineres.
- Container Registry, para armazenar as imagens de contêiner que o processo de compilação produz.
Neste tutorial, você usará o Terraform para configurar os recursos necessários para provisionar e configurar o pipeline para criar imagens de contêiner.
Arquitetura
O diagrama a seguir ilustra o fluxo de trabalho do pipeline criado neste tutorial para criar imagens de contêiner.
As alterações feitas no código-fonte do gatilho de imagem de contêiner acionam o Cloud Build para criar uma imagem de contêiner de várias arquiteturas. Quando a criação é concluída, a imagem do contêiner de várias arquiteturas é armazenada no Container Registry.
Objetivos
- Use o Terraform para provisionar o pipeline e criar imagens de contêiner no Google Cloud.
- Modifique o código-fonte da imagem do contêiner para acionar um novo build.
- Inspecione a imagem do contêiner armazenada no Container Registry.
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.
Antes de começar
-
No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.
-
Verifique se a cobrança está ativada para o seu projeto do Google Cloud.
Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.
Prepare o ambiente
Neste tutorial, todos os comandos serão executados no Cloud Shell.
-
No Console do Google Cloud, ative o Cloud Shell.
Na parte inferior do Console do Google Cloud, uma sessão do Cloud Shell é iniciada e exibe um prompt de linha de comando. O Cloud Shell é um ambiente shell com a CLI do Google Cloud já instalada e com valores já definidos para o projeto atual. A inicialização da sessão pode levar alguns segundos.
Clone o repositório do código de amostra:
cd "$HOME" git clone \ https://github.com/GoogleCloudPlatform/solutions-build-multi-architecture-images-tutorial.git
Gere as credenciais padrão do aplicativo:
gcloud auth application-default login --quiet
A saída será assim:
Go to the following link in your browser: https://accounts.google.com/o/oauth2/auth?code_challenge=... Enter verification code:
Em uma janela do navegador, abra o URL exibido na saída da geração das credenciais padrão do aplicativo (a etapa anterior).
Selecione Permitir para continuar.
Copie o código na tela e insira-o no Cloud Shell.
A saída será assim:
/tmp/tmp.xxxxxxxxxx/application_default_credentials.json
Anote o caminho para o arquivo
application_default_credentials.json
. Use esse caminho para definir uma variável de ambiente na próxima seção.
Definir variáveis de ambiente
Antes de provisionar a infraestrutura necessária para este tutorial, é necessário inicializar e exportar as variáveis de ambiente a seguir:
No Cloud Shell, crie uma variável de ambiente que armazene o nome da conta de serviço do Google Cloud que o Terraform usa para provisionar recursos:
export TF_SERVICE_ACCOUNT_NAME=tf-service-account
Crie uma variável de ambiente que armazene o ID do projeto do Google Cloud que o Terraform usa para armazenar o estado:
export TF_STATE_PROJECT=${DEVSHELL_PROJECT_ID}
Crie uma variável de ambiente que armazene o bucket do Cloud Storage que o Terraform usa para salvar os arquivos de estado:
export TF_STATE_BUCKET=tf-state-bucket-${TF_STATE_PROJECT}
Crie uma variável de ambiente que armazene o ID do projeto do Cloud que contém os recursos do pipeline de criação da imagem do contêiner:
export GOOGLE_CLOUD_PROJECT=${DEVSHELL_PROJECT_ID}
Crie uma variável de ambiente para armazenar o caminho para as credenciais padrão do aplicativo do Google Cloud padrão, que é o valor que você anotou na seção anterior:
export GOOGLE_APPLICATION_CREDENTIALS=PATH
Substitua:
PATH
: caminho para o arquivoapplication_default_credentials.json
Como provisionar o ambiente
Você precisa executar o script de shell generate-tf-backend.sh
que gera a configuração de back-end do Terraform, as contas de serviço necessárias do Google Cloud e o bucket do Cloud Storage para armazenar informações sobre o estado remoto do Terraform.
No Cloud Shell, provisione seu ambiente de criação:
cd $HOME/solutions-build-multi-architecture-images-tutorial/ ./generate-tf-backend.sh
O script é idempotente e seguro para ser executado várias vezes.
Depois de executar o script pela primeira vez, a saída será semelhante a esta:
Generating the descriptor to hold backend data in terraform/backend.tf terraform { backend "gcs" { bucket = "tf-state-bucket-project-id" prefix = "terraform/state" } }
Como criar o pipeline de criação
O arquivo de modelo do Terraform terraform/main.tf
define os recursos criados para este tutorial. Ao executar o Terraform com esse descritor, crie os recursos do Google Cloud a seguir:
- Um repositório de código do Cloud Source Repositories para armazenar o descritor de imagem do contêiner e o arquivo de configuração da compilação do Cloud Build.
- Um tópico do Pub/Sub em que o Cloud Build publica mensagens sobre cada alteração do código-fonte.
- Uma compilação do Cloud Build que cria a imagem do contêiner de várias arquiteturas.
- Um repositório do Container Registry para armazenar imagens de contêiner.
No Cloud Shell, faça o seguinte:
Para inicializar o diretório de trabalho do Terraform, execute o comando terraform init:
cd terraform terraform init
(Opcional) Para revisar as alterações que o Terraform aplicará, execute o comando terraform plan:
terraform plan
A saída é uma lista de todas as ações que o Terraform deve executar para provisionar recursos no ambiente do Google Cloud. O resumo de todas as ações é semelhante ao seguinte:
Plan: 8 to add, 0 to change, 0 to destroy.
O número total de ações de adição é 8, sem alterações e exclusões.
Execute o comando terraform apply para criar os recursos no projeto do Cloud:
terraform apply
Para continuar executando o comando, digite
yes
.
Como enviar os arquivos de origem para o Cloud Source Repositories
Para que o pipeline de compilação execute o build, o Dockerfile e os arquivos de configuração do Cloud Build precisam ser armazenados em um repositório de código-fonte do Cloud Source Repositories.
No Cloud Shell, clone o repositório de origem:
cd $HOME gcloud source repos clone cross-build
Copie o Dockerfile e o arquivo de configuração do Cloud Build no repositório de código-fonte:
cp -r "$HOME"/solutions-build-multi-architecture-images-tutorial/terraform/cloud-build/. "$HOME"/cross-build
Confirme e envie os arquivos ao repositório de código-fonte:
cd "$HOME"/cross-build git add . git commit -m "Initial commit" git push
Como inspecionar os resultados
Enquanto o job do Cloud Build estiver em execução e após a conclusão, você poderá inspecionar a execução de cada etapa da criação na página Histórico de versões do Cloud Build.
Versão do Cloud Build
Na página Histórico de versões, você tem uma visão geral das etapas de criação com o tempo necessário para executar cada etapa, conforme mostrado na ilustração a seguir.
Se você abrir uma etapa de criação, verá a saída dessa etapa. Por exemplo, os detalhes de criação da etapa buildx inspect no diagrama anterior mostram a arquitetura da plataforma de destino diferente compatível com a plataforma:
12 Name: mybuilder0 13 Endpoint: unix:///var/run/docker.sock 14 Status: running 15 Platforms: linux/amd64, linux/arm64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
Os detalhes de criação da quarta etapa mostram a saída do build para cada arquitetura de destino:
#8 0.268 I am running on linux/amd64, building for linux/amd64 #12 0.628 I am running on linux/amd64, building for linux/arm/v7 #10 0.279 I am running on linux/amd64, building for linux/arm/v6 #14 0.252 I am running on linux/amd64, building for linux/arm64
Manifesto de imagem no Container Registry
Após a conclusão da compilação, será possível inspecionar o manifesto da imagem na página Imagens do Container Registry no console do Google Cloud, conforme mostrado na ilustração a seguir.
Se você abrir o repositório test na lista de repositórios, verá todas as versões da imagem do contêiner que pertencem ao repositório test, conforme mostrado na ilustração a seguir.
É possível abrir a imagem que tem a tag latest para abrir a página Detalhes do resumo para ver informações detalhadas sobre a imagem, conforme mostrado na ilustração a seguir.
Na página Detalhes do resumo, você pode expandir a seção Manifesto e verificar se toda a arquitetura de destino criada pelo build está indicada no arquivo, conforme mostrado no exemplo a seguir:
{ "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", "schemaVersion": 2, "manifests": [ { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "digest": "sha256:839024acb1038509e3bc66f3744857840951d0d512be54fd6670ea1e8babdcb6", "size": 735, "platform": { "architecture": "amd64", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "digest": "sha256:33489767c29efb805e446a61d91cc55e042d3cfadcd186d9a1c8698f2f12309d", "size": 735, "platform": { "architecture": "arm64", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "digest": "sha256:f1958815778ca8c83d324bad3fc68a9e3e9d5ea48b5bb27a8aca7d8da20cf8d4", "size": 735, "platform": { "architecture": "arm", "os": "linux", "variant": "v7" } } ] }
Também é possível ver o manifesto da imagem diretamente do Cloud Shell.
No Cloud Shell, exiba o manifesto da imagem:
DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect gcr.io/"${DEVSHELL_PROJECT_ID}"/test:latest
A saída é a mesma do arquivo de manifesto que você pode expandir na página Detalhes do resumo.
Como configurar a implantação contínua do pipeline de compilação
Para criar a imagem do contêiner para a nova arquitetura de hardware, modifique o arquivo de configuração da compilação adicionando a nova arquitetura de destino. Depois de confirmar e enviar a alteração para o repositório de origem no Cloud Source Repositories, o Cloud Build iniciará um novo build. O build produz uma nova versão da imagem de contêiner de várias arquiteturas, incluindo a compatibilidade com a arquitetura de hardware recém-adicionada.
No Cloud Shell, adicione a nova plataforma de destino ao arquivo de configuração da compilação:
cd "$HOME"/cross-build sed -i -e 's/linux\/arm\/v7/linux\/arm\/v7,linux\/386/g' build-docker-image-trigger.yaml
Confirme e envie a alteração para o repositório de código-fonte:
git add . git commit -m "add a new target platform" git push
Veja o manifesto mais recente para verificar se a nova plataforma de destino faz parte da imagem de contêiner mais recente:
DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect gcr.io/${DEVSHELL_PROJECT_ID}/test:latest
Verifique se a plataforma de destino recém-adicionada está no arquivo de manifesto, semelhante à seguinte saída:
{ "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", "schemaVersion": 2, "manifests": [ { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "digest": "sha256:bc80d063fccb4c370df9b505cbf4f8a814a366d99644de09ebee98af2ef0ff63", "size": 735, "platform": { "architecture": "amd64", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "digest": "sha256:be10e4f01f529149815ebad7eb09edaa84ebef5b7d70d51f7d1acb5ceb1f61cd", "size": 735, "platform": { "architecture": "arm64", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "digest": "sha256:f6ba5d5d3bc1ea0177e669517ea15a0d4fb97c06c7eca338afa43734d87af779", "size": 735, "platform": { "architecture": "arm", "os": "linux", "variant": "v7" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "digest": "sha256:a3c34621cca10974026f8ad0782af78539cd7bb0ebfa0082a27b2c3ed4418ca0", "size": 735, "platform": { "architecture": "386", "os": "linux" } } ] }
Limpar
A maneira mais fácil de eliminar o faturamento é excluir o projeto do Google Cloud criado para o tutorial. A outra opção é excluir os recursos individuais.
Excluir o projeto
- No Console do Google Cloud, acesse a página Gerenciar recursos.
- Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
- Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.
Excluir recursos individuais
Se você quiser manter o projeto usado neste tutorial, execute as etapas a seguir para excluir os recursos criados neste tutorial.
No Cloud Shell, exclua as imagens do contêiner:
gcloud container images delete gcr.io/${DEVSHELL_PROJECT_ID}/test --quiet
Exclua os recursos provisionados usando o Terraform:
cd $HOME/solutions-build-multi-architecture-images-tutorial/terraform terraform destroy
Digite
yes
para confirmar a exclusão.
A seguir
- Leia Imagens de contêiner de multiarquitetura para dispositivos IoT.
- Saiba mais sobre como gerenciar a infraestrutura como código com o Terraform, o Cloud Build e o GitOps.
- Veja mais informações sobre DevOps na página DevOps.
- Confira arquiteturas de referência, diagramas e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.