Crea, testa e containerizza le applicazioni Python

Questa pagina descrive come configurare Cloud Build per creare, testare, containerizzare ed eseguire il deployment delle applicazioni Python.

Cloud Build ti consente di utilizzare qualsiasi immagine container disponibile pubblicamente per eseguire le tue attività di sviluppo, tra cui creazione, test, containerizzazione, caricamento su Artifact Registry, deployment e salvataggio dei log di build. L'immagine python pubblica di Docker Hub è preinstallata con gli strumenti python e pip. Puoi configurare Cloud Build usando questi strumenti per installare dipendenze, creare ed eseguire test delle unità con questi strumenti.

Prima di iniziare

Le istruzioni in questa pagina presuppongono che tu abbia familiarità con Python. Inoltre:

  • Abilita le API Cloud Build, Cloud Run, Cloud Storage and Artifact Registry.

    Abilita le API

  • Per eseguire i comandi gcloud in questa pagina, installa Google Cloud CLI.
  • Tieni a portata di mano il tuo progetto Python, incluso il file requirements.txt. È necessario un Dockerfile insieme al codice sorgente.
  • Se vuoi archiviare il container creato in Artifact Registry, crea un repository Docker in Artifact Registry.
  • Se vuoi archiviare i log di test in Cloud Storage, crea un bucket in Cloud Storage.

Autorizzazioni IAM richieste

Per istruzioni sulla concessione di questi ruoli, consulta Concessione di un ruolo utilizzando la pagina IAM.

Configurazione di build Python

Questa sezione illustra un file di configurazione di compilazione di esempio per un'app Python. Include passaggi di build per installare i requisiti, aggiungere test delle unità e, al termine dei test, creare e distribuire l'app.

  1. Nella directory principale del progetto, crea un file di configurazione di Cloud Build denominato cloudbuild.yaml.

  2. Requisiti di installazione: l'immagine python di Docker Hub è preinstallata con pip. Per installare le dipendenze da pip, aggiungi un passaggio di build con i seguenti campi:

    • name: imposta il valore di questo campo su python per utilizzare l'immagine Python di Docker Hub per questa attività.
    • entrypoint: l'impostazione di questo campo esegue l'override del punto di ingresso predefinito dell'immagine a cui viene fatto riferimento in name. Imposta il valore di questo campo su pip per richiamare pip come punto di ingresso del passaggio di build ed eseguire i comandi pip.
    • args: il campo args di un passaggio di build accetta un elenco di argomenti e li passa all'immagine a cui fa riferimento il campo name. Passa gli argomenti per eseguire il comando pip install in questo campo. --user nel comando pip install garantisce che i passaggi di build successivi possano accedere ai moduli installati in questo passaggio di build.

    Il seguente passaggio di build aggiunge argomenti ai requisiti di installazione dal file requirements.txt:

    steps:
      # Install dependencies
      - name: python
        entrypoint: pip
        args: ["install", "-r", "requirements.txt", "--user"]
  3. Aggiungi i test delle unità: se hai definito i test delle unità nell'applicazione utilizzando un framework di test come pytest, puoi configurare Cloud Build in modo che esegua i test aggiungendo i seguenti campi in un passaggio di build:

    • name: imposta il valore di questo campo su python per utilizzare l'immagine Python di Docker Hub per l'attività.
    • entrypoint: imposta il valore di questo campo su python per eseguire i comandi python.
    • args: aggiungi gli argomenti per l'esecuzione del comando python pytest.

    Il passaggio di build seguente salva l'output del log pytest in un file XML JUNIT. Il nome di questo file è stato creato utilizzando la versione breve dell'ID di commit associato alla tua build. Un passaggio di build successivo salverà i log di questo file in Cloud Storage.

    # Run unit tests
    - name: python
      entrypoint: python
      args: ["-m", "pytest", "--junitxml=${SHORT_SHA}_test_log.xml"] 
  4. Containerizza l'app: dopo aver aggiunto il passaggio di build per assicurarti che i test siano stati superati, puoi creare l'applicazione. Cloud Build fornisce un'immagine Docker predefinita che puoi utilizzare per containerizzare la tua applicazione Python. Per containerizzare la tua app, aggiungi i seguenti campi in un passaggio di build:

    • name: imposta il valore di questo campo su gcr.io/cloud-builders/docker per utilizzare l'immagine Docker predefinita per l'attività.
    • args: aggiungi gli argomenti per il comando docker build come valori per questo campo.

    Il seguente passaggio di build crea l'immagine myimage e la tagga con la versione breve del tuo ID commit. Il passaggio di build utilizza le sostituzioni predefinite per l'ID progetto, il nome del repository e i valori SHA brevi, pertanto questi valori vengono sostituiti automaticamente in fase di creazione.

    # 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. Esegui il push del container in Artifact Registry: puoi archiviare il container creato in Artifact Registry, un servizio Google Cloud che puoi utilizzare per archiviare, gestire e proteggere gli artefatti della build. Per farlo, in Artifact Registry devi avere un repository Docker esistente. Per configurare Cloud Build per l'archiviazione dell'immagine in un repository Docker di Artifact Registry, aggiungi un passaggio di build con i seguenti campi:

    • name: imposta il valore di questo campo su gcr.io/cloud-builders/docker per utilizzare l'immagine builder docker ufficiale di Container Registry per la tua attività.
    • args: aggiungi gli argomenti per il comando docker push come valori di questo campo. Per l'URL di destinazione, inserisci il repository Docker di Artifact Registry in cui vuoi archiviare l'immagine.

    Il seguente passaggio di build esegue il push dell'immagine che hai creato nel passaggio precedente ad 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}']

    (Facoltativo) Se vuoi che Cloud Build generi informazioni sulla provenienza della build Livelli della catena di fornitura per Software Artifacts (SLSA), completa quanto segue:

  6. Esegui il deployment del container in Cloud Run: per eseguire il deployment dell'immagine su Cloud Run, aggiungi un passaggio di build con i seguenti campi:

    • name: imposta il valore di questo campo su google/cloud-sdk per utilizzare l'immagine dell'interfaccia a riga di comando gcloud CLI per richiamare il comando gcloud ed eseguire il deployment dell'immagine su Cloud Run.
    • args: aggiungi gli argomenti per il comando gcloud run deploy come valori di questo campo.

    Il seguente passaggio di build esegue il deployment dell'immagine creata in precedenza in 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. Salva i log di test in Cloud Storage: puoi configurare Cloud Build in modo che archivi tutti i log di test in Cloud Storage specificando la località di un bucket esistente e il percorso dei log di test. Il seguente passaggio di build archivia i log di test salvati nel file XML JUNIT in un bucket Cloud Storage:

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

    Lo snippet seguente mostra il file di configurazione di compilazione completo per tutti i passaggi descritti sopra:

    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. Avvia la build: manualmente o utilizzando i trigger di build.

    Una volta completata la build, puoi visualizzare i dettagli del repository in Artifact Registry.

    Puoi anche visualizzare i metadati di provenienza della build e convalidare la provenienza.

Passaggi successivi