Crie, teste e coloque em contentores aplicações Python

Esta página descreve como configurar o Cloud Build para criar, testar, colocar em contentores e implementar aplicações Python.

O Cloud Build permite-lhe usar qualquer imagem de contentor disponível publicamente para executar as suas tarefas de desenvolvimento, incluindo a criação, os testes, a colocação em contentores, o carregamento para o Artifact Registry, a implementação e a poupança dos seus registos de compilação. A imagem python pública do Docker Hub vem pré-instalada com as ferramentas python e pip. Pode configurar o Cloud Build usar estas ferramentas para instalar dependências, criar e executar testes de unidades.

Antes de começar

As instruções nesta página pressupõem que tem conhecimentos de Python. Além disso:

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

    Enable the APIs

  • Para executar os comandos gcloud nesta página, instale a CLI do Google Cloud.
  • Tenha o seu projeto Python à mão, incluindo o ficheiro requirements.txt. Precisa de um Dockerfile juntamente com o código-fonte.
  • Se quiser armazenar o contentor criado no Artifact Registry, crie um repositório Docker no Artifact Registry.
  • Se quiser armazenar registos de testes no Cloud Storage, crie um contentor no Cloud Storage.

Autorizações de IAM necessárias

Para obter instruções sobre como conceder estas funções, consulte o artigo Conceder uma função através da página do IAM.

Configurar compilações Python

Esta secção explica um exemplo de um ficheiro de configuração de compilação para uma app Python. Tem passos de compilação para instalar requisitos, adicionar testes unitários e, depois de os testes serem aprovados, compilar e implementar a app.

  1. No diretório raiz do projeto, crie um ficheiro de configuração do Cloud Build denominado cloudbuild.yaml.

  2. Requisitos de instalação: a imagem python do Docker Hub é pré-instalada com o pip. Para instalar dependências a partir de pip, adicione um passo de compilação com os seguintes campos:

    • name: defina o valor deste campo como python para usar a imagem do Python do Docker Hub para esta tarefa.
    • entrypoint: a definição deste campo substitui o ponto de entrada predefinido da imagem referenciada em name. Defina o valor deste campo como pip para invocar pip como ponto de entrada da etapa de compilação e executar comandos pip.
    • args: o campo args de um passo de compilação recebe uma lista de argumentos e transmite-os à imagem referenciada pelo campo name. Transmita os argumentos para executar o comando pip install neste campo. A flag --user no comando pip install garante que os passos de compilação subsequentes podem aceder aos módulos instalados neste passo de compilação.

    O seguinte passo de compilação adiciona argumentos para instalar requisitos do ficheiro requirements.txt:

    steps:
      # Install dependencies
      - name: python
        entrypoint: pip
        args: ["install", "-r", "requirements.txt", "--user"]
  3. Adicione testes unitários: se definiu testes unitários na sua aplicação através de uma framework de testes, como o pytest, pode configurar o Cloud Build para executar os testes adicionando os seguintes campos num passo de compilação:

    • name: defina o valor deste campo como python para usar a imagem do Python do Docker Hub para a sua tarefa.
    • entrypoint: defina o valor deste campo como python para executar comandos python.
    • args: adicione os argumentos para executar o comando python pytest.

    O passo de compilação seguinte guarda a saída do registo pytest num ficheiro XML JUNIT. O nome deste ficheiro é criado com a versão abreviada do ID de commit associado à sua compilação. Um passo de compilação subsequente guarda os registos neste ficheiro no Cloud Storage.

    # Run unit tests
    - name: python
      entrypoint: python
      args: ["-m", "pytest", "--junitxml=${SHORT_SHA}_test_log.xml"] 
  4. Coloque a app num contentor: depois de adicionar o passo de compilação para garantir que os testes foram aprovados, pode compilar a aplicação. O Cloud Build fornece uma imagem Docker pré-criada que pode usar para colocar a sua aplicação Python num contentor. Para colocar a sua app num contentor, adicione os seguintes campos num passo de compilação:

    • name: defina o valor deste campo como gcr.io/cloud-builders/docker para usar a imagem do Docker pré-criada para a sua tarefa.
    • args: adicione os argumentos do comando docker build como valores para este campo.

    O seguinte passo de compilação cria a imagem myimage e atribui-lhe uma etiqueta com a versão abreviada do ID de confirmação. O passo de compilação usa as substituições predefinidas para o ID do projeto, o nome do repositório e os valores SHA curtos. Por isso, estes valores são substituídos automaticamente no momento da compilação.

    # 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. Enviar o contentor para o Artifact Registry: pode armazenar o contentor criado no Artifact Registry, que é um Google Cloud serviço que pode usar para armazenar, gerir e proteger artefactos de compilação. Para isso, tem de ter um repositório do Docker existente no Artifact Registry. Para configurar o Cloud Build de modo a armazenar a imagem num repositório Docker do Artifact Registry, adicione um passo de compilação com os seguintes campos:

    • name: defina o valor deste campo como gcr.io/cloud-builders/docker para usar a imagem do criador docker oficial para a sua tarefa.
    • args: adicione os argumentos do comando docker push como valores deste campo. Para o URL de destino, introduza o repositório Docker do Artifact Registry onde quer armazenar a imagem.

    O seguinte passo de compilação envia a imagem que compilou no passo anterior para o 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}']

    Opcional: se quiser que o Cloud Build gere informações de proveniência da compilação das cadeias de fornecimento para artefactos de software (SLSA), conclua o seguinte:

  6. Implemente o contentor no Cloud Run: para implementar a imagem no Cloud Run, adicione um passo de compilação com os seguintes campos:

    • name: defina o valor deste campo como google/cloud-sdk para usar a imagem da CLI gcloud para invocar o comando gcloud para implementar a imagem no Cloud Run.
    • args: adicione os argumentos do comando gcloud run deploy como os valores deste campo.

    O seguinte passo de compilação implementa a imagem criada anteriormente no 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. Guardar registos de testes no Cloud Storage: pode configurar o Cloud Build para armazenar quaisquer registos de testes no Cloud Storage especificando uma localização e um caminho de contentor existentes para os registos de testes. O seguinte passo de compilação armazena os registos de testes que guardou no ficheiro XML JUNIT num contentor do Cloud Storage:

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

    O fragmento seguinte mostra o ficheiro de configuração de compilação completo para todos os passos descritos acima:

    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. Inicie a compilação: manualmente ou usando acionadores de compilação.

    Quando a compilação estiver concluída, pode ver os detalhes do repositório no Artifact Registry.

    Também pode ver metadados de proveniência da compilação e validar a proveniência.

O que se segue?