Bonnes pratiques pour accélérer les compilations

Cette page présente les meilleures pratiques pour accélérer les compilations Cloud Build.

Compilation de conteneurs plus simples

Lorsque vous intégrez une application dans un conteneur, les fichiers inutiles au moment de l'exécution, tels que les dépendances de temps de compilation et les fichiers intermédiaires, peuvent être inclus par inadvertance dans l'image du conteneur. Ces fichiers inutiles peuvent augmenter la taille de l'image du conteneur, et donc augmenter le temps et les coûts associés au déplacement de l'image entre le registre d'images de conteneurs et l'environnement d'exécution du conteneur.

Pour vous aider à réduire la taille de votre image de conteneur, séparez la compilation de l'application, ainsi que les outils nécessaires pour la compiler, de l'ensemble du conteneur d'exécution.

Pour en savoir plus, consultez la page Compilation de conteneurs plus simples.

Utiliser le cache Kaniko

Le cache Kaniko est une fonctionnalité Cloud Build qui met en cache des artefacts de compilation de conteneurs en stockant et en indexant des couches intermédiaires dans un registre d'images de conteneurs, tel que le registre de conteneurs de Google, où elles sont disponibles pour de futures compilations. Pour en savoir plus, consultez la page Utiliser le cache Kaniko.

Utiliser une image Docker mise en cache

Le moyen le plus simple d'accélérer la compilation d'une image Docker est de définir une image mise en cache pouvant être utilisée pour de futures compilations. Vous pouvez définir l'image mise en cache en ajoutant l'argument --cache-from au fichier de configuration de compilation pour indiquer à Docker de procéder à la compilation en utilisant cette image comme source de cache.

Chaque image Docker est composée de couches empilées. L'utilisation de --cache-from a pour effet de recompiler toutes les couches depuis la couche modifiée jusqu'à la dernière couche. Par conséquent, --cache-from n'est pas utile si vous modifiez une couche au cours des premières étapes de la compilation Docker.

Il est recommandé de toujours utiliser --cache-from pour les compilations et de garder à l'esprit les mises en garde suivantes :

  • Vous avez besoin d'une image Docker précédemment compilée afin de pouvoir l'utiliser à partir du cache.
  • Vous pouvez utiliser --cache-from uniquement pour les compilations Docker. Vous ne pouvez pas l'utiliser pour les compilateurs créant d'autres types d'artefacts.
  • L'image mise en cache doit être extraite d'un registre, ce qui peut augmenter le temps nécessaire à la compilation.

Les étapes suivantes expliquent comment procéder à une compilation à l'aide d'une image précédemment mise en cache :

YAML

  1. Ajoutez des instructions au fichier de configuration de compilation pour effectuer les actions suivantes :

    • Extraire l'image mise en cache de Container Registry. Notez que l'étape de compilation docker pull ci-dessous définit le point d'entrée entrypoint sur bash, ce qui permet d'exécuter la commande et d'ignorer l'erreur renvoyée. Cela est nécessaire lorsque vous créez une image pour la première fois et que la commande docker pull n'a pas d'image existante à extraire.
    • Ajouter un argument --cache-from afin d'utiliser cette image pour les recompilations.

      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']
      

      où [IMAGE_NAME] correspond au nom de l'image.

  2. Compilez l'image à l'aide de la configuration ci-dessus :

    gcloud builds submit --config cloudbuild.yaml .
    

JSON

  1. Ajoutez des instructions au fichier de configuration de compilation pour effectuer les actions suivantes :

    • Extraire l'image mise en cache de Container Registry. Notez que l'étape de compilation docker pull ci-dessous définit le point d'entrée entrypoint sur bash, ce qui permet d'exécuter la commande et d'ignorer les erreurs renvoyées. Cela est nécessaire lorsque vous créez une image pour la première fois et que la commande docker pull n'a pas d'image existante à extraire.
    • Ajouter un argument --cache-from afin d'utiliser cette image pour les recompilations.

      {
          "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"]
      }
      

      où [IMAGE_NAME] correspond au nom de l'image.

  2. Compilez l'image à l'aide de la configuration ci-dessus :

    gcloud builds submit --config cloudbuild.json .
    

Mise en cache de répertoires avec Google Cloud Storage

Pour accélérer une compilation, réutilisez les résultats d'une compilation précédente. Vous pouvez copier les résultats d'une compilation précédente dans un bucket Google Cloud Storage, les utiliser pour accélérer les calculs, puis copier les nouveaux résultats dans ce même bucket. Utilisez cette méthode lorsque la compilation dure longtemps et génère un petit nombre de fichiers et ne prend pas le temps d'effectuer une copie depuis et vers Google Cloud Storage.

Contrairement à --cache-from, qui est réservé aux compilations Docker, la mise en cache de Google Cloud Storage peut être utilisée pour tout compilateur compatible avec Cloud Build.

Procédez comme suit pour mettre en cache des répertoires à l'aide de Google Cloud Storage :

YAML

  1. Ajoutez des instructions au fichier de configuration de compilation pour effectuer les actions suivantes :

    • Copier les résultats d'une compilation précédente depuis le bucket Google Cloud Storage.
    • Utiliser les résultats pour la compilation actuelle.
    • Copier les nouveaux résultats dans le bucket.

      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. Compilez le code en utilisant la configuration de compilation ci-dessus :

    gcloud builds submit --config cloudbuild.yaml .
    

JSON

  1. Ajoutez des instructions au fichier de configuration de compilation pour effectuer les actions suivantes :

    • Copier les résultats d'une compilation précédente depuis le bucket Google Cloud Storage.
    • Utiliser les résultats pour la compilation actuelle.
    • Copier les nouveaux résultats dans le bucket.

      {
          "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. Compilez le code en utilisant la configuration de compilation ci-dessus :

    gcloud builds submit --config cloudbuild.json .
    

Conseils pour éviter l'importation de fichiers inutiles

Lorsqu'une compilation est déclenchée, votre répertoire de code est importé pour une utilisation par Cloud Build.

Vous pouvez exclure des fichiers non requis par votre compilation à l'aide d'un fichier .gcloudignore pour optimiser la durée d'importation.

Voici des exemples de fichiers généralement exclus :

  • Documentation et exemple de code pour les développeurs de projets.
  • Code d'échafaudage généré, fichiers binaires, fichiers *.jar ou contenus Web compilés utilisés pour le développement.
  • Dépendances tierces fournies pour le développement local.

Pour préparer un fichier .gcloudignore afin de résoudre ces cas, créez un fichier dans le répertoire racine de votre projet avec un contenu tel que :

.git
dist
node_modules
vendor
*.jar

L'exclusion du code compilé et des dépendances tierces se traduit également par un processus de compilation plus cohérent et un risque réduit de déploiement accidentel de code en cours de développement.

Étapes suivantes