Crea, testa e containerizza le applicazioni Python

Questa pagina descrive come configurare Cloud Build per creare, testare, eseguire il containerizzazione e il deployment di 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 in Artifact Registry, deployment e salvataggio dei log di compilazione. L'immagine python pubblica di Docker Hub è preinstallata con gli strumenti python e pip. Puoi configurare Cloud Build per utilizzare questi strumenti per installare le dipendenze, eseguire la compilazione ed eseguire i test delle unità.

Prima di iniziare

Le istruzioni riportate in questa pagina presuppongono che tu abbia dimestichezza con Python. Inoltre:

  • Enable the Cloud Build, Cloud Run, Cloud Storage and Artifact Registry APIs.

    Enable the APIs

  • Per eseguire i comandi gcloud in questa pagina, installa Google Cloud CLI.
  • Tieni a portata di mano il progetto Python, incluso il file requirements.txt. Devi avere un Dockerfile insieme al codice sorgente.
  • Se vuoi archiviare il container compilato 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 su come concedere questi ruoli, consulta Concedere un ruolo utilizzando la pagina IAM.

Configurazione delle build Python

Questa sezione illustra un esempio di file di configurazione di build per un'app Python. Contiene i passaggi di compilazione per installare i requisiti, aggiungere i test di unità e, dopo il superamento dei test, compilare e eseguire il deployment dell'app.

  1. Nella directory principale del progetto, crea un file di configurazione Cloud Build chiamato 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 compilazione con i seguenti campi:

    • name: imposta il valore di questo campo su python per utilizzare l'immagine Python da Docker Hub per questa attività.
    • entrypoint: l'impostazione di questo campo sostituisce il punto di contatto predefinito dell'immagine a cui si fa riferimento in name. Imposta il valore di questo campo su pip per richiamare pip come punto di contatto del passaggio di compilazione ed eseguire i comandi pip.
    • args: il campo args di un passaggio di compilazione prende 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. Il flag --user nel comando pip install assicura che i passaggi di compilazione successivi possano accedere ai moduli installati in questo passaggio di compilazione.

    Il seguente passaggio di compilazione aggiunge gli argomenti ai requisiti di installazione dal filerequirements.txt:

    steps:
      # Install dependencies
      - name: python
        entrypoint: pip
        args: ["install", "-r", "requirements.txt", "--user"]
  3. Aggiungi test di unità: se hai definito test di unità nella tua applicazione utilizzando un framework di test come pytest, puoi configurare Cloud Build per eseguire i test aggiungendo i seguenti campi in un passaggio di compilazione:

    • name: imposta il valore di questo campo su python per utilizzare l'immagine Python da 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 seguente passaggio di compilazione salva l'output del log pytest in un file XML JUNIT. Il nome di questo file viene creato utilizzando la versione breve dell'ID commit associato alla tua build. Un passaggio di compilazione successivo salverà i log in questo file in Cloud Storage.

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

    • 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 passaggio di compilazione seguente crea l'immagine myimage e la contrassegna con la versione breve dell'ID commit. Il passaggio di compilazione utilizza le sostituzione predefinite per l'ID progetto, il nome del repository e i valori SHA brevi, pertanto questi valori vengono sostituiti automaticamente in fase di compilazione.

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

    • name: imposta il valore di questo campo su gcr.io/cloud-builders/docker per utilizzare l'immagine del generatore 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 dove vuoi archiviare l'immagine.

    Il seguente passaggio di compilazione esegue il push dell'immagine creata nel passaggio precedente in 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 sull'origine della compilazione Supply-chain Levels for Software Artifacts (SLSA), completa quanto segue:

    • Utilizza il campo images nel passaggio di compilazione anziché un passaggio di compilazione Docker push separato.
    • Aggiungi requestedVerifyOption: VERIFIED alla sezione options del file di configurazione di build.
  6. Esegui il deployment del contenitore in Cloud Run: per eseguire il deployment dell'immagine su Cloud Run, aggiungi un passaggio di compilazione con i seguenti campi:

    • name: imposta il valore di questo campo su google/cloud-sdk per utilizzare l'immagine gcloud CLI per richiamare il comando gcloud per 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 compilazione 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 da archiviare i log di test in Cloud Storage specificando la posizione e il percorso del bucket esistente per i log di test. Il seguente passaggio di compilazione memorizza 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 gli trigger di build.

    Al termine della build, puoi visualizzare i dettagli del repository in Artifact Registry.

    Puoi anche visualizzare i metadati dell'origine della compilazione e convalidare l'origine.

Passaggi successivi