Créer, tester et conteneuriser des applications Python

Cette page explique comment configurer Cloud Build pour créer, tester, conteneuriser et déployer des applications Python.

Cloud Build vous permet d'utiliser n'importe quelle image de conteneur accessible au public pour exécuter vos tâches de développement, y compris la compilation, les tests, la conteneurisation, l'importation dans Artifact Registry, le déploiement et l'enregistrement de vos journaux de compilation. L'image python publique de Docker Hub est fournie avec les outils python et pip préinstallés. Vous pouvez configurer Cloud Build pour installer des dépendances, compiler, et exécuter des tests unitaires à l'aide de ces outils.

Avant de commencer

Les instructions de cette page partent du principe que vous connaissez bien Python. Autres caractéristiques :

  • Activer les API Cloud Build, Cloud Run, Cloud Storage and Artifact Registry.

    Activer les API

  • Pour exécuter les commandes gcloud sur cette page, installez Google Cloud CLI.
  • Gardez à portée de main votre projet Python, y compris le fichier requirements.txt. Vous avez besoin d'un Dockerfile avec votre code source.
  • Si vous souhaitez stocker le conteneur créé dans Artifact Registry, créez un dépôt Docker dans Artifact Registry.
  • Si vous souhaitez stocker les journaux de test dans Cloud Storage, créez un bucket dans Cloud Storage.

Autorisations IAM requises

Pour obtenir des instructions sur l'attribution de rôles, consultez la page Attribuer un rôle à l'aide de la page IAM.

Configurer des compilations Python

Cette section décrit un exemple de fichier de configuration de compilation pour une application Python. Il comporte des étapes de compilation pour installer les exigences, ajouter des tests unitaires et une fois les tests réussis, créer et déployer l'application.

  1. Dans le répertoire racine de votre projet, créez un fichier de configuration Cloud Build nommé cloudbuild.yaml.

  2. Conditions d'installation: l'image python de Docker Hub est fournie préinstallée avec pip. Pour installer des dépendances à partir de pip, ajoutez une étape de compilation avec les champs suivants:

    • name: définissez la valeur de ce champ sur python pour utiliser l'image Python de Docker Hub pour cette tâche.
    • entrypoint: la définition de ce champ remplace le point d'entrée par défaut de l'image référencée dans name. Définissez la valeur de ce champ sur pip pour appeler pip en tant que point d'entrée de l'étape de compilation et exécuter les commandes pip.
    • args : Le champ args d'une étape de compilation prend une liste d'arguments et la transmet à l'image à laquelle le champ name fait référence. Transmettez les arguments pour exécuter la commande pip install dans ce champ. L'option --user de la commande pip install garantit que les étapes de compilation suivantes peuvent accéder aux modules installés dans cette étape de compilation.

    L'étape de compilation suivante ajoute des arguments permettant d'installer les éléments requis à partir du fichier requirements.txt:

    steps:
      # Install dependencies
      - name: python
        entrypoint: pip
        args: ["install", "-r", "requirements.txt", "--user"]
  3. Ajouter des tests unitaires: si vous avez défini des tests unitaires dans votre application à l'aide d'un framework de test tel que pytest, vous pouvez configurer Cloud Build pour qu'il exécute les tests en ajoutant les champs suivants dans une étape de compilation:

    • name: définissez la valeur de ce champ sur python pour utiliser l'image Python de Docker Hub pour votre tâche.
    • entrypoint: définissez la valeur de ce champ sur python pour exécuter les commandes python.
    • args: ajoutez les arguments pour exécuter la commande python pytest.

    L'étape de compilation suivante enregistre la sortie du journal pytest dans un fichier XML JUnit. Le nom de ce fichier est créé à l'aide de la version courte de l'ID de commit associé à votre compilation. Une étape de compilation ultérieure enregistrera les journaux de ce fichier dans Cloud Storage.

    # Run unit tests
    - name: python
      entrypoint: python
      args: ["-m", "pytest", "--junitxml=${SHORT_SHA}_test_log.xml"] 
  4. Conteneuriser l'application: après avoir ajouté l'étape de compilation pour vous assurer que les tests sont concluants, vous pouvez compiler l'application. Cloud Build fournit une image Docker prédéfinie que vous pouvez utiliser pour conteneuriser votre application Python. Pour conteneuriser votre application, ajoutez les champs suivants à l'étape de compilation:

    • name: définissez la valeur de ce champ sur gcr.io/cloud-builders/docker afin d'utiliser l'image Docker prédéfinie pour votre tâche.
    • args: ajoutez les arguments de la commande docker build en tant que valeurs pour ce champ.

    L'étape de compilation suivante crée l'image myimage et lui ajoute un tag correspondant à la version abrégée de votre ID de commit. L'étape de compilation utilise les substitutions par défaut pour l'ID de projet, le nom du dépôt et les valeurs SHA courtes. Par conséquent, ces valeurs sont automatiquement remplacées au moment de la compilation.

    # Docker Build
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t',
             'us-central1-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}', '.']
  5. Transférer le conteneur vers Artifact Registry: vous pouvez stocker le conteneur créé dans Artifact Registry, un service Google Cloud qui vous permet de stocker, gérer et sécuriser des artefacts de compilation. Pour ce faire, vous devez disposer d'un dépôt Docker existant dans Artifact Registry. Pour configurer Cloud Build afin de stocker l'image dans un dépôt Docker Artifact Registry, ajoutez une étape de compilation avec les champs suivants:

    • name: définissez la valeur de ce champ sur gcr.io/cloud-builders/docker pour utiliser l'image de compilateur officielle docker de Container Registry pour votre tâche.
    • args: ajoutez les arguments de la commande docker push en tant que valeurs de ce champ. Pour l'URL de destination, saisissez le dépôt Docker Artifact Registry dans lequel vous souhaitez stocker l'image.

    L'étape de compilation suivante transfère l'image que vous avez créée lors de l'étape précédente vers Artifact Registry:

    # Docker push to Google Artifact Registry
    - name: 'gcr.io/cloud-builders/docker'
      args: ['push',  'us-central1-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}']

    Facultatif: Si vous souhaitez que Cloud Build génère des informations de origine de la compilation, utilisez le champ images lors de l'étape de compilation au lieu d'utiliser un autre champ distinct à l'aide d'une étape de compilation Docker push. Si vous utilisez des builds régionaux, vous devez également ajouter le champ requestedVerifyOption et définir la valeur sur VERIFIED pour permettre la génération de provenance.

  6. Déployez le conteneur sur Cloud Run: pour déployer l'image sur Cloud Run, ajoutez une étape de compilation avec les champs suivants:

    • name: définissez la valeur de ce champ sur google/cloud-sdk pour utiliser l'image de la gcloud CLI afin d'appeler la commande gcloud permettant de déployer l'image sur Cloud Run.
    • args: ajoutez les arguments de la commande gcloud run deploy en tant que valeurs de ce champ.

    L'étape de compilation suivante déploie l'image créée précédemment sur Cloud Run:

    # Deploy to Cloud Run
    - name: google/cloud-sdk
      args: ['gcloud', 'run', 'deploy', 'helloworld-${SHORT_SHA}',
             '--image=us-central1-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}',
             '--region', 'us-central1', '--platform', 'managed',
             '--allow-unauthenticated']
  7. Enregistrer les journaux de test dans Cloud Storage: vous pouvez configurer Cloud Build pour stocker tous les journaux de test dans Cloud Storage en spécifiant un emplacement de bucket et un chemin d'accès existants vers les journaux de test. L'étape de compilation suivante stocke les journaux de test que vous avez enregistrés dans le fichier XML JUnit dans un bucket Cloud Storage:

    # Save test logs to Google Cloud Storage
    artifacts:
      objects:
        location: gs://${_BUCKET_NAME}/
        paths:
          - ${SHORT_SHA}_test_log.xml

    L'extrait de code suivant montre le fichier de configuration de compilation complet pour toutes les étapes décrites ci-dessus:

    steps:
      # Install dependencies
      - name: python
        entrypoint: pip
        args: ["install", "-r", "requirements.txt", "--user"]
    
      # Run unit tests
      - name: python
        entrypoint: python
        args: ["-m", "pytest", "--junitxml=${SHORT_SHA}_test_log.xml"]
    
      # Docker Build
      - name: 'gcr.io/cloud-builders/docker'
        args: ['build', '-t',
               'us-central1-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}', '.']
    
      # Docker push to Google Artifact Registry
      - name: 'gcr.io/cloud-builders/docker'
        args: ['push',  'us-central1-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}']
    
      # Deploy to Cloud Run
      - name: google/cloud-sdk
        args: ['gcloud', 'run', 'deploy', 'helloworld-${SHORT_SHA}',
               '--image=us-central1-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}',
               '--region', 'us-central1', '--platform', 'managed',
               '--allow-unauthenticated']
    
    # Save test logs to Google Cloud Storage
    artifacts:
      objects:
        location: gs://${_BUCKET_NAME}/
        paths:
          - ${SHORT_SHA}_test_log.xml
    # Store images in Google Artifact Registry
    images:
      - us-central1-docker.pkg.dev/${PROJECT_ID}/${_ARTIFACT_REGISTRY_REPO}/myimage:${SHORT_SHA}
  8. Démarrez votre compilation: manuellement ou à l'aide de déclencheurs de compilation.

    Une fois la compilation terminée, vous pouvez afficher les détails du dépôt dans Artifact Registry.

    Vous pouvez également afficher les métadonnées de provenance de la compilation et valider la provenance pour protéger votre chaîne d'approvisionnement logicielle.

Étapes suivantes