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
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éeentrypoint
surbash
, 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 commandedocker 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.
- Extraire l'image mise en cache de Container Registry. Notez que l'étape de compilation
Compilez l'image à l'aide de la configuration ci-dessus :
gcloud builds submit --config cloudbuild.yaml .
JSON
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éeentrypoint
surbash
, 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 commandedocker 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.
- Extraire l'image mise en cache de Container Registry. Notez que l'étape de compilation
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
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']
Compilez le code en utilisant la configuration de compilation ci-dessus :
gcloud builds submit --config cloudbuild.yaml .
JSON
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"] } ] }
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 dont votre build n'a pas besoin à l'aide d'un élément
.gcloudignore
pour optimiser le temps 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.
Étape suivante
- Découvrez comment augmenter le nombre de vCPU pour les compilations.