Prácticas recomendadas para acelerar las compilaciones

En esta página, se proporcionan prácticas recomendadas para acelerar las compilaciones de Cloud Build.

Compila contenedores más eficientes

Cuando creas contenedores para una aplicación, los archivos que no se necesitan en el entorno de ejecución, como las dependencias de tiempo de compilación y los archivos intermedios, se pueden incluir inadvertidamente en la imagen del contenedor. Estos archivos innecesarios pueden aumentar el tamaño de la imagen del contenedor y agregar tiempo y costo adicionales cuando la imagen se mueve entre tu registro de imágenes del contenedor y el entorno de ejecución del contenedor.

Para ayudar a reducir el tamaño de la imagen de tu contenedor, separa la compilación de la aplicación, junto con las herramientas usadas para compilarla, del ensamblaje del contenedor de entorno de ejecución.

Si deseas obtener más información, consulta la sección para compilar contenedores más eficientes.

Usa la caché de Kaniko

La caché de Kaniko es una característica de Cloud Build que almacena en caché artefactos de compilación de contenedores mediante el almacenamiento y la indexación de capas intermedias dentro de un registro de imágenes de contenedor, como Container Registry de Google, en el que están disponibles para su uso en compilaciones posteriores. Si deseas obtener más información, consulta la sección para usar la caché de Kaniko.

Usa una imagen de Docker almacenada en caché

La forma más sencilla de aumentar la velocidad de compilación de tu imagen de Docker es con la especificación de una imagen en caché que se puede usar para compilaciones posteriores. Puedes especificar la imagen en caché si agregas el argumento --cache-from en tu archivo de configuración de compilación que instruirá a Docker a que compile con esa imagen como una fuente en caché.

Cada imagen de Docker está compuesta por capas apiladas. Con el uso de --cache-from, se vuelven a compilar todas las capas desde la capa modificada hasta el final de la compilación; por eso, no es beneficioso usar --cache-from si cambias una capa en las etapas iniciales de tu compilación de Docker.

Se recomienda que siempre uses --cache-from para tus compilaciones, pero ten en cuenta las advertencias siguientes:

  • Necesitas una imagen de Docker compilada con anterioridad desde la que se pueda acceder al almacenamiento en caché.
  • Puedes usar --cache-from solo para compilaciones de Docker; no con compilaciones que crean otros tipos de artefactos.
  • Se debe recuperar la imagen en caché desde un registro que pueda aumentar el tiempo de compilación.

En los pasos siguientes, se explica cómo compilar con una imagen almacenada en caché con anterioridad:

YAML

  1. En tu configuración de compilación, agrega instrucciones para realizar lo siguiente:

    • Extraer la imagen en caché desde Container Registry. Ten en cuenta que el paso de compilación docker pull debajo establece entrypoint en bash, lo que te permite ejecutar el comando y, además, ignorar el error mostrado. Esto es necesario cuando compilas una imagen por primera vez y docker pull no tiene una imagen existente para extraer.
    • Agrega un argumento --cache-from para usar esa imagen a fin de volver a compilar.

      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.

  2. Compila tu imagen con la configuración de compilación anterior:

    gcloud builds submit --config cloudbuild.yaml .
    

JSON

  1. En tu configuración de compilación, agrega instrucciones para realizar lo siguiente:

    • Extraer la imagen en caché desde Container Registry. Ten en cuenta que el paso de compilación docker pull debajo establece entrypoint en bash, lo que te permite ejecutar el comando y, además, ignorar los errores mostrados. Esto es necesario cuando compilas una imagen por primera vez y docker pull no tiene una imagen existente para extraer.
    • Agrega un argumento --cache-from para usar esa imagen a fin de volver a compilar.

      {
          "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.

  2. Compila tu imagen con la configuración de compilación anterior:

    gcloud builds submit --config cloudbuild.json .
    

Almacena directorios en caché con Google Cloud Storage

Con el fin de aumentar la velocidad de una compilación, vuelve a usar los resultados de una compilación anterior. Puedes copiar los resultados de una compilación previa en un depósito de Google Cloud Storage, usar los resultados para hacer cálculos más rápido y, luego, copiar los resultados nuevos otra vez en el depósito. Usa este método si tu compilación tarda mucho y produce pocos archivos que no demoran mucho en copiarse desde y hacia Google Cloud Storage.

A diferencia de --cache-from, que es solo para compilaciones de Docker, el almacenamiento en caché de Google Cloud Storage se puede usar con cualquier compilador compatible con Cloud Build.

Usa los pasos a continuación para almacenar en caché los directorios que usan Google Cloud Storage:

YAML

  1. En tu archivo de configuración de compilación, agrega instrucciones para realizar lo siguiente:

    • Copia los resultados de una compilación previa desde el depósito de Google Cloud Storage.
    • Usa los resultados para la compilación actual.
    • Vuelve a copiar los resultados nuevos en el depósito.

      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']
      
  2. Compila tu código con la configuración de compilación anterior:

    gcloud builds submit --config cloudbuild.yaml .
    

JSON

  1. En tu archivo de configuración de compilación, agrega instrucciones para realizar lo siguiente:

    • Copia los resultados de una compilación previa desde el depósito de Google Cloud Storage.
    • Usa los resultados para la compilación actual.
    • Vuelve a copiar los resultados nuevos en el depósito.

      {
          "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"]
          }
          ]
      }
      
  2. Compila tu código con la configuración de compilación anterior:

    gcloud builds submit --config cloudbuild.json .
    

Usa tamaños personalizados de máquinas virtuales

Además del tipo de máquina estándar, Cloud Build proporciona dos tipos de máquina virtual con capacidad alta de CPU para ejecutar tus compilaciones. A fin de aumentar la velocidad de tu compilación, selecciona una máquina virtual con una capacidad alta de CPU. Solicitar una máquina con capacidad alta de CPU puede incrementar el tiempo de inicio de tu compilación, ya que Cloud Build solo inicia estas máquinas a la demanda.

Para obtener información sobre la selección de tamaños personalizados de disco, consulta diskSize.

En los pasos a continuación, se explica cómo especificar un tamaño personalizado de una VM para una compilación:

gcloud

Para especificar un tamaño de VM personalizado, usa el argumento --machine-type:

gcloud builds submit --config=cloudbuild.yaml \
    --machine-type=n1-highcpu-8 .

YAML

  1. Especifica el tamaño de la VM en tu archivo de configuración de compilación:

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t', 'gcr.io/my-project/image1', '.']
      # operations that take a long time to build
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t', 'gcr.io/my-project/image2', '.']
    options:
      machineType: 'N1_HIGHCPU_8'
    
  2. Compila con la configuración de compilación anterior:

    gcloud builds submit --config cloudbuild.yaml .
    

JSON

  1. Especifica el tamaño de la VM en tu archivo de configuración de compilación:

    {
        "steps": [
        {
            "name": "gcr.io/cloud-builders/docker",
            "args": ["build", "-t", "gcr.io/my-project/image1", "."]
        },
        // operations that take a long time to build
        {
            "name": "gcr.io/cloud-builders/docker",
            "args": ["build", "-t", "gcr.io/my-project/image2", "."]
        }
        ],
        "options": {
            "machineType": "N1_HIGHCPU_8"
        }
    }
    
  2. Compila con la configuración de compilación anterior de la siguiente manera:

    gcloud builds submit --config cloudbuild.json .
    

Evita subir archivos innecesarios

Cuando se activa una compilación, tu directorio de código se sube para que Cloud Build lo use.

Para optimizar el tiempo de carga, puedes excluir archivos que tu compilación no necesita con un archivo .gcloudignore.

Estos son algunos ejemplos de archivos que, por lo general, se excluyen:

  • Documentación y código de muestra para desarrolladores de proyectos
  • Código de andamiaje generado, objetos binarios, archivos *.jar o activos web compilados que se usan para el desarrollo
  • Dependencias de terceros copiadas para el desarrollo local

Para preparar un archivo .gcloudignore a fin de abordar estos casos, crea un archivo en la raíz de tu proyecto con contenido como el siguiente:

.git
dist
node_modules
vendor
*.jar

La exclusión del código compilado y las dependencias de terceros también da como resultado un proceso de compilación más coherente y un menor riesgo de implementación accidental de código que aún está en desarrollo activo.

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Documentación de Cloud Build