Prácticas recomendadas para acelerar las compilaciones

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

  1. 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 valor bash a entrypoint, lo que te permite ejecutar el comando e ignorar el error devuelto. Esto es necesario cuando creas una imagen por primera vez y docker 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.

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

    gcloud builds submit --config cloudbuild.yaml .
    

JSON

  1. 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 valor bash a entrypoint, lo que te permite ejecutar el comando e ignorar los errores que se devuelvan. Esto es necesario cuando creas una imagen por primera vez y docker 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.

  2. 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

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

    gcloud builds submit --config cloudbuild.yaml .
    

JSON

  1. 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"]
          }
          ]
      }
      
  2. 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