Esta página fornece práticas recomendadas para acelerar as compilações do Cloud Build.
Criar contentores mais simples
Quando coloca uma aplicação num contentor, os ficheiros que não são necessários no tempo de execução, como dependências de tempo de compilação e ficheiros intermédios, podem ser incluídos inadvertidamente na imagem do contentor. Estes ficheiros desnecessários podem aumentar o tamanho da imagem do contentor e adicionar tempo e custos adicionais à medida que a imagem se move entre o registo de imagens de contentores e o tempo de execução do contentor.
Para ajudar a reduzir o tamanho da imagem do contentor, separe a criação da aplicação, juntamente com as ferramentas usadas para a criar, da montagem do contentor de tempo de execução.
Para mais informações, consulte o artigo Crie contentores mais simples.
Usar uma imagem Docker em cache
A forma mais fácil de aumentar a velocidade de criação da imagem de Docker é especificar uma imagem em cache que possa ser usada para criações subsequentes. Pode especificar a imagem em cache adicionando o argumento --cache-from
no ficheiro de configuração de compilação, o que indica ao Docker para compilar usando essa imagem como origem da cache.
Cada imagem do Docker é composta por camadas sobrepostas. A utilização de --cache-from
recompila todas as camadas a partir da camada alterada até ao final da compilação. Por conseguinte, a utilização de --cache-from
não é vantajosa se alterar uma camada nas fases anteriores da compilação do Docker.
Recomendamos que use sempre --cache-from
para as suas compilações, mas tenha em atenção os seguintes avisos:
- Precisa de uma imagem do Docker criada anteriormente para usar como cache.
- Pode usar
--cache-from
apenas para compilações do Docker. Não pode usá-lo para criadores que criem outro tipo de artefactos. - A imagem em cache tem de ser obtida a partir de um registo, o que pode aumentar o tempo necessário para a compilação.
Os passos seguintes explicam como criar usando uma imagem previamente colocada em cache:
YAML
Na configuração de compilação, adicione instruções para:
- Extraia a imagem em cache do Container Registry. Repare que o passo de compilação
docker pull
abaixo define oentrypoint
comobash
, o que lhe permite executar o comando e ignorar o erro devolvido. Isto é necessário quando cria uma imagem pela primeira vez e odocker pull
não tem uma imagem existente para usar. Adicione um argumento
--cache-from
para usar essa imagem para reconstruções.steps: - name: 'gcr.io/cloud-builders/docker' entrypoint: 'bash' args: ['-c', 'docker pull gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest || exit 0'] - name: 'gcr.io/cloud-builders/docker' args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest', '--cache-from', 'gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest', '.' ] images: ['gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest']
em que [IMAGE_NAME] é o nome da sua imagem.
- Extraia a imagem em cache do Container Registry. Repare que o passo de compilação
Crie a sua imagem com a configuração de compilação acima:
gcloud builds submit --config cloudbuild.yaml .
JSON
Na configuração de compilação, adicione instruções para:
- Extraia a imagem em cache do Container Registry. Tenha em atenção que o passo de compilação abaixo
docker pull
define oentrypoint
comobash
, o que lhe permite executar o comando e ignorar quaisquer erros devolvidos. Isto é necessário quando cria uma imagem pela primeira vez e odocker pull
não tem uma imagem existente para usar. Adicione um argumento
--cache-from
para usar essa imagem para reconstruções.{ "steps": [ { "name": "gcr.io/cloud-builders/docker", "entrypoint": "bash", "args": ["-c", "docker pull gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest || exit 0"] }, { "name": "gcr.io/cloud-builders/docker", "args": [ "build", "-t", "gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest", "--cache-from", "gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest", "." ] } ], "images": ["gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest"] }
em que [IMAGE_NAME] é o nome da sua imagem.
- Extraia a imagem em cache do Container Registry. Tenha em atenção que o passo de compilação abaixo
Crie a sua imagem com a configuração de compilação acima:
gcloud builds submit --config cloudbuild.json .
Colocar em cache diretórios com o Google Cloud Storage
Para aumentar a velocidade de uma compilação, reutilize os resultados de uma compilação anterior. Pode copiar os resultados de uma compilação anterior para um contentor do Google Cloud Storage, usar os resultados para um cálculo mais rápido e, em seguida, copiar os novos resultados de volta para o contentor. Use este método quando a compilação demorar muito tempo e produzir um pequeno número de ficheiros que não demoram a ser copiados para e do Google Cloud Storage.
Ao contrário do --cache-from
, que se destina apenas a compilações do Docker, o armazenamento em cache do Google Cloud Storage pode ser usado para qualquer compilador suportado pelo Cloud Build.
Siga estes passos para colocar diretórios em cache através do Google Cloud Storage:
YAML
No ficheiro de configuração de compilação, adicione instruções para:
- Copie os resultados de uma compilação anterior do contentor do Google Cloud Storage.
- Usar os resultados da compilação atual.
Copie os novos resultados de volta para o contentor.
steps: - name: gcr.io/cloud-builders/gsutil args: ['cp', 'gs://mybucket/results.zip', 'previous_results.zip'] # operations that use previous_results.zip and produce new_results.zip - name: gcr.io/cloud-builders/gsutil args: ['cp', 'new_results.zip', 'gs://mybucket/results.zip']
Crie o seu código com a configuração de compilação acima:
gcloud builds submit --config cloudbuild.yaml .
JSON
No ficheiro de configuração de compilação, adicione instruções para:
- Copie os resultados de uma compilação anterior do contentor do Google Cloud Storage.
- Usar os resultados da compilação atual.
Copie os novos resultados de volta para o contentor.
{ "steps": [ { "name": "gcr.io/cloud-builders/gsutil", "args": ["cp", "gs://mybucket/results.zip", "previous_results.zip"] }, { // operations that use previous_results.zip and produce new_results.zip }, { "name": "gcr.io/cloud-builders/gsutil", "args": ["cp", "new_results.zip", "gs://mybucket/results.zip"] } ] }
Crie o seu código com a configuração de compilação acima:
gcloud builds submit --config cloudbuild.json .
Evitar o carregamento de ficheiros desnecessários
Quando uma compilação é acionada, o diretório de código é carregado para utilização pelo Cloud Build.
Pode excluir ficheiros que a sua compilação não precisa com um ficheiro
.gcloudignore
para otimizar o tempo de carregamento.
Seguem-se alguns exemplos de ficheiros normalmente excluídos:
- Documentação e exemplos de código para programadores de projetos
- Código de estrutura gerado, ficheiros binários, ficheiros
*.jar
ou recursos Web compilados usados para desenvolvimento. - Dependências de terceiros fornecidas para desenvolvimento local
Para preparar um ficheiro .gcloudignore
para resolver estes casos, crie um ficheiro na raiz do projeto com conteúdos como:
.git
dist
node_modules
vendor
*.jar
A exclusão de código compilado e dependências de terceiros também resulta num processo de compilação mais consistente e num risco reduzido de implementação acidental de código que ainda está em desenvolvimento ativo.
O que se segue?
- Saiba como aumentar a vCPU para compilações.