Créer des étapes de compilation personnalisées

Lors de l'écriture de configurations de compilations, vous pouvez utiliser les étapes de compilation Open Source compatibles fournies par Cloud Build ou définir des étapes de compilation personnalisées.

Une étape de compilation personnalisée est une image de conteneur que la VM de calcul Cloud Build extrait et exécute avec le volume source installé sur /workspace. Une étape de compilation personnalisée peut exécuter n'importe quel script ou fichier binaire à l'intérieur du conteneur. Ainsi, elle dispose des mêmes fonctions qu'un conteneur.

Les étapes de compilation personnalisées sont utiles pour réaliser les étapes suivantes :

  • Télécharger du code source ou des packages depuis des emplacements externes
  • Utiliser une chaîne d'outils externe
  • Mettre en cache les bibliothèques nécessaires
  • Pré-compiler la source (avec Cloud Build chargé uniquement de la mise en package éventuelle de la compilation dans une image de conteneur)

Une étape de compilation personnalisée s'exécute avec la source installée sous /workspace et un répertoire de travail se trouvant quelque part dans /workspace. Tous les fichiers laissés dans /workspace par une étape de compilation donnée sont disponibles pour d'autres étapes de compilation, que ces étapes soient exécutées simultanément ou ultérieurement.

L'étape de compilation personnalisée peut être déployée sur ou transférée depuis le dépôt Google Container Registry (hébergé sur gcr.io/$PROJECT-NAME/) auquel votre compte de service de compilateur a accès. Les identifiants de l'outil de ligne de commande docker ne sont pas suffisants pour fournir un accès par authentification à Docker Hub.

Ce guide explique comment créer une étape de compilation personnalisée à l'aide d'un exemple qui vous aide à créer une étape de compilation exécutant un script d'interface système. Vous pouvez créer un "exécuteur de script d'interface système" en tant qu'étape de compilation personnalisée pour exécuter un script d'interface système depuis votre source de compilation.

Créer une étape de compilation personnalisée

Pour créer une étape de compilation personnalisée, vous pouvez créer un fichier de configuration de compilation qui compile et déploie l'image de l'étape de compilation dans un registre d'images, tel que Container Registry, auquel le compte de service de compilation peut accéder. Vous pouvez également utiliser un autre outil pour compiler l'image de l'étape de compilation personnalisée, puis la stocker dans un registre d'images. Une fois cette opération terminée, vous pouvez appeler l'étape de compilation personnalisée dans de futures compilations.

À propos du champ entrypoint

Le fichier Dockerfile de votre image peut contenir un champ ENTRYPOINT et/ou CMD. ENTRYPOINT spécifie le point d'entrée à utiliser pour l'étape de compilation personnalisée si le conteneur doit être exécuté en tant que fichier exécutable. CMD fournit des valeurs par défaut pour l'exécution et, si ENTRYPOINT est omis, doit inclure un fichier exécutable.

Dans une configuration de compilation, le champ entrypoint facultatif définit la manière dont l'étape de compilation doit être exécutée lorsqu'elle est appelée. Par exemple, vous pouvez spécifier la commande principale à appeler lors de l'exécution de l'étape de compilation : le point d'entrée de l'étape de compilation docker est "/usr/bin/docker". Lorsque vous utilisez votre étape de compilation dans une compilation ultérieure, vous pouvez ignorer le champ ENTRYPOINT du fichier Dockerfile en spécifiant un point d'entrée (entrypoint) dans cette compilation.

Si vous ne spécifiez pas le champ entrypoint dans le fichier de demande de compilation de l'étape de compilation et si aucun ENTRYPOINT n'est spécifié dans le fichier Dockerfile de l'image de l'étape de compilation, le premier élément de args est utilisé comme point d'entrée et les éléments restants de args comme arguments.

Exemple : exécuter un script d'interface système à partir de votre source

Pour qu'une étape de compilation personnalisée puisse exécuter un script d'interface système à partir de votre source, l'image de conteneur de cette étape doit contenir un outil capable d'exécuter le script. Les images de base standards, telles que les images de conteneurs ubuntu, debian, alpine et busybox peuvent toutes exécuter des scripts. Cependant, bash n'est pas préinstallé avec les images alpine et busybox (et celles-ci ne peuvent donc pas exécuter de scripts bash), contrairement à ubuntu et debian.

Si une image contient tous les outils (y compris l'interface système) nécessaires à l'exécution du script, vous pouvez directement utiliser cette image en tant qu'étape de compilation.

Cet exemple utilise une image ubuntu pour exécuter des scripts, dans la mesure où bash est préinstallé dans celle-ci et qu'elle est compatible avec de nombreux outils de développement. La compilation elle-même crée des images basées sur alpine ; ces images sont beaucoup plus petites et ne contiennent que ce qui est nécessaire à l'environnement d'exécution.

Voici l'exemple de fichier de configuration ./cloudbuild.yaml pour l'étape de compilation personnalisée :

steps:
- name: 'ubuntu'
  args: ['bash', './myscript.bash']
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/custom-script-test', '.']
images: ['gcr.io/$PROJECT_ID/custom-script-test']

L'étape exécute le script suivant, appelé ./myscript.bash :

echo "Hello, world!" > file.txt

Voici l'exemple de fichier Dockerfile :

FROM alpine
COPY file.txt /file.txt
ENTRYPOINT ["cat", "/file.txt"]

Pour envoyer la compilation qui utilise cette étape de compilation personnalisée, exécutez la commande suivante dans la fenêtre d'interface système ou de terminal :

$ gcloud builds submit --config cloudbuild.yaml .
...
$ gcloud docker -- pull gcr.io/<your-project-id>/custom-script-test
...
$ docker run gcr.io/<your-project-id>/custom-script-test
Hello, world!

Le script exécuté par l'étape de compilation personnalisée peut nécessiter plus de ressources que celles fournies dans l'image alpine de base utilisée dans cet exemple. Si tel est le cas, vous pouvez précompiler une image avec les ressources nécessaires en utilisant les directives COPY du fichier Dockerfile pour transférer des ressources depuis l'espace de travail vers l'image de conteneur.

Par exemple, supposons que vous souhaitiez exécuter un script qui utilise curl pour extraire un fichier à inclure dans l'image compilée. Dans la mesure où l'outil de ligne de commande curl n'est pas préinstallé dans l'image ubuntu, nous allons créer une image avec une image ubuntu de base et curl en superposition.

Voici un exemple de fichier de configuration ./cloudbuild.yaml pour une compilation utilisant une étape de compilation personnalisée ubuntu-curl :

steps:
- name: 'gcr.io/$PROJECT_ID/ubuntu-curl'
  args: ['bash', './curl.bash']
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/custom-script-test2', '.']
images: ['gcr.io/$PROJECT_ID/custom-script-test2']

Le fichier Dockerfile.ubuntu-curl qui installe l'outil curl :

FROM ubuntu
RUN apt-get -q update && apt-get install -qqy curl

Le script ./curl.bash peut se présenter comme suit :

#!/bin/bash
curl http://example.com > example.html

L'exemple de fichier Dockerfile :

FROM alpine
COPY example.html /example.html
ENTRYPOINT ["cat", "/example.html"]

Pour exécuter l'étape de compilation personnalisée pour ubuntu-curl, puis compiler l'image, exécutez la commande suivante dans la fenêtre d'interface système ou de terminal :

# First, build and push the `ubuntu-curl` custom build step.
$ docker build -f Dockerfile.ubuntu-curl -t gcr.io/your-project/ubuntu-curl .
...
$ gcloud docker -- push gcr.io/your-project/ubuntu-curl
...

Une fois l'image que vous venez de créer déployée sur un registre Docker à l'aide de Dockerfile.ubuntu-curl, vous pouvez utiliser l'image directement comme étape de compilation.

# Then, use the custom `ubuntu-curl` build step in a new build.
$ gcloud builds submit --config cloudbuild.yaml .
...
$ gcloud docker -- pull gcr.io/your-project/custom-script-test2
...
$ docker run gcr.io/your-project/custom-script-test2
`<`contents of example.com source`>`

Vous pouvez accomplir la même action en une seule compilation en ajoutant une étape préliminaire pour compiler l'image de l'exécuteur de script. Une fois cette image compilée, vous pouvez l'utiliser comme prochaine étape de votre compilation. Cela permet de ne pas insérer de données dans curl.bash et d'exécuter l'essentiel du travail dans le service Cloud Build.

Voici un exemple de fichier de configuration ./cloudbuild.yaml dans lequel l'étape préliminaire a été ajoutée :

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-f', 'Dockerfile.ubuntu-curl', '-t', 'script-runner', '.']
- name: 'script-runner'
  args: ['bash', './curl.bash']
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/custom-script-test2', '.']
images: ['gcr.io/$PROJECT_ID/custom-script-test2']

Tant que vous laissez script-runner hors du champ images de cloudbuild.yaml, le service Cloud Build ne tente pas de le déployer (ce qui entraînerait un échec dans cet exemple). Cependant, dans le cadre de la compilation, l'image script-runner existe dans le cache de l'image et peut être utilisée comme étape de compilation.

Étape suivante