En esta página se incluyen las prácticas recomendadas para agilizar la compilación en Cloud Build.
Crear contenedores optimizados
Cuando se contenedoriza una aplicación, se pueden incluir por error en la imagen del contenedor archivos que no son necesarios en el tiempo de ejecución, como las dependencias del tiempo de compilación y los archivos intermedios. Estos archivos innecesarios pueden aumentar el tamaño de la imagen de contenedor y añadir tiempo y costes adicionales, ya que la imagen se mueve entre el registro de imágenes de contenedor y el tiempo de ejecución del contenedor.
Para reducir el tamaño de la imagen de contenedor, separa la compilación de la aplicación, junto con las herramientas que se usan para compilarla, del ensamblaje del contenedor de tiempo de ejecución.
Para obtener más información, consulta Crear contenedores más ligeros.
Usar una imagen de Docker almacenada en caché
La forma más sencilla de aumentar la velocidad de compilación de tu imagen Docker es especificar una imagen almacenada en caché que se pueda usar en compilaciones posteriores. Puedes especificar la imagen almacenada en caché añadiendo el argumento --cache-from
en el archivo de configuración de compilación, lo que indicará a Docker que compile usando esa imagen como origen de caché.
Cada imagen de Docker se compone de capas apiladas. Si usas --cache-from
, se vuelven a compilar todas las capas desde la capa modificada hasta el final de la compilación. Por lo tanto, no es recomendable usar --cache-from
si cambias una capa en las primeras fases de la compilación de Docker.
Te recomendamos que siempre uses --cache-from
para tus compilaciones, pero ten en cuenta las siguientes advertencias:
- Necesitas una imagen de Docker creada anteriormente para usarla como caché.
- Puedes usar
--cache-from
solo para compilaciones de Docker. No puedes usarlo para compiladores que creen otro tipo de artefactos. - La imagen almacenada en caché debe obtenerse de un registro, lo que puede aumentar el tiempo que se tarda en compilar.
En los siguientes pasos se explica cómo compilar con una imagen almacenada en caché anteriormente:
YAML
En la configuración de compilación, añade instrucciones para:
- Extrae la imagen almacenada en caché de Container Registry. Ten en cuenta que el paso de compilación
docker pull
que se indica a continuación asigna el valorbash
aentrypoint
, lo que te permite ejecutar el comando e ignorar el error devuelto. Esto es necesario cuando creas una imagen por primera vez ydocker pull
no tiene ninguna imagen que extraer. Añade un argumento
--cache-from
para usar esa imagen en las recompilaciones.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']
donde [IMAGE_NAME] es el nombre de tu imagen.
- Extrae la imagen almacenada en caché de Container Registry. Ten en cuenta que el paso de compilación
Crea tu imagen con la configuración de compilación anterior:
gcloud builds submit --config cloudbuild.yaml .
JSON
En la configuración de compilación, añade instrucciones para:
- Extrae la imagen almacenada en caché de Container Registry. Ten en cuenta que el paso de compilación
docker pull
que se indica a continuación asigna el valorbash
aentrypoint
, lo que te permite ejecutar el comando e ignorar los errores que se devuelvan. Esto es necesario cuando creas una imagen por primera vez ydocker pull
no tiene ninguna imagen que extraer. Añade un argumento
--cache-from
para usar esa imagen en las recompilaciones.{ "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"] }
donde [IMAGE_NAME] es el nombre de tu imagen.
- Extrae la imagen almacenada en caché de Container Registry. Ten en cuenta que el paso de compilación
Crea tu imagen con la configuración de compilación anterior:
gcloud builds submit --config cloudbuild.json .
Almacenar directorios en caché con Google Cloud Storage
Para aumentar la velocidad de una compilación, reutiliza los resultados de una compilación anterior. Puedes copiar los resultados de una compilación anterior en un segmento de Google Cloud Storage, usar los resultados para calcular más rápido y, a continuación, copiar los nuevos resultados en el segmento. Usa este método cuando la compilación tarde mucho tiempo y genere un número reducido de archivos que no tarden en copiarse a Google Cloud Storage y desde él.
A diferencia de --cache-from
, que solo se usa para compilaciones de Docker, el almacenamiento en caché de Google Cloud Storage se puede usar con cualquier compilador compatible con Cloud Build.
Sigue estos pasos para almacenar en caché directorios con Google Cloud Storage:
YAML
En el archivo de configuración de compilación, añade instrucciones para:
- Copia los resultados de una compilación anterior del segmento de Google Cloud Storage.
- Usar los resultados de la compilación actual.
Copia los nuevos resultados en el segmento.
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']
Compila tu código con la configuración de compilación anterior:
gcloud builds submit --config cloudbuild.yaml .
JSON
En el archivo de configuración de compilación, añade instrucciones para:
- Copia los resultados de una compilación anterior del segmento de Google Cloud Storage.
- Usar los resultados de la compilación actual.
Copia los nuevos resultados en el segmento.
{ "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"] } ] }
Compila tu código con la configuración de compilación anterior:
gcloud builds submit --config cloudbuild.json .
Evitar la subida de archivos innecesarios
Cuando se activa una compilación, se sube el directorio de tu código para que lo use Cloud Build.
Puedes excluir los archivos que no necesite tu compilación con un archivo .gcloudignore
para optimizar el tiempo de subida.
Estos son algunos ejemplos de archivos que se suelen excluir:
- Documentación y código de muestra para desarrolladores de proyectos
- Código de scaffolding generado, archivos binarios, archivos
*.jar
o recursos web compilados que se usan para el desarrollo. - Dependencias de terceros y de proveedores para el desarrollo local
Para preparar un archivo .gcloudignore
que aborde estos casos, crea un archivo en la raíz de tu proyecto con contenido como el siguiente:
.git
dist
node_modules
vendor
*.jar
Si excluyes el código compilado y las dependencias de terceros, también conseguirás un proceso de compilación más coherente y reducirás el riesgo de desplegar accidentalmente código que aún esté en fase de desarrollo.
Siguientes pasos
- Consulta cómo aumentar la vCPU de las compilaciones.