Como criar aplicativos Python

Nesta página, descrevemos como configurar o Cloud Build para criar, testar e implantar aplicativos Python. Se você não estiver familiarizado com o Cloud Build, leia os guias de início rápido e a visão geral da configuração de build primeiro.

O Cloud Build permite que você use qualquer imagem de contêiner disponível publicamente para executar suas tarefas. A imagem pública python do Docker Hub vem com as ferramentas python e pip pré-instaladas. É possível configurar essas ferramentas para instalar dependências, criar e executar testes de unidade usando essas ferramentas.

Antes de começar

As instruções nesta página presumem que você tenha familiaridade com o Python. Além disso:

  • Ative as APIs Cloud Build, Cloud Run, and Artifact Registry.

    Ative as APIs

  • Para executar os comandos gcloud desta página, instale o SDK do Cloud.
  • Tenha seu projeto em Python em mãos, incluindo o arquivo requirements.txt.
  • Se quiser colocar o aplicativo Python em contêiner usando o Cloud Build, você precisará de um Dockerfile com seu código-fonte.
  • Para armazenar o contêiner criado no Artifact Registry, crie um repositório do Docker no Artifact Registry.
  • Para armazenar registros de teste no Cloud Storage, crie um bucket no Cloud Storage.

Permissões do IAM obrigatórias

Para instruções sobre como conceder esses papéis, consulte Como conceder um papel usando a página do IAM.

Como configurar builds em Python

Esta seção mostra um exemplo de arquivo de configuração de build para um aplicativo Python. Ele tem etapas de versão para instalar os requisitos, adicionar testes de unidade e, depois que os testes forem aprovados, criados e implantarem o aplicativo.

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

  2. Requisitos de instalação: a imagem python do Docker Hub vem com pip. Para instalar dependências de pip, adicione uma etapa de criação com os seguintes campos:

    • name: defina o valor desse campo como python para usar a imagem Python do Docker Hub nesta tarefa.
    • entrypoint: a configuração desse campo substitui o ponto de entrada padrão da imagem referenciada em name. Defina o valor desse campo como pip para invocar pip como o ponto de entrada da etapa de criação e execute os comandos pip.
    • args: o campo args de uma etapa da criação recebe uma lista de argumentos e os transmite para a imagem referenciada pelo campo name. Transmita os argumentos para executar o comando pip install nesse campo.

    A etapa de criação a seguir adiciona argumentos para instalar requisitos do arquivo requirements.txt:

    steps:
      # Install dependencies
      - name: python
        entrypoint: pip
        args: ["install", "-r", "requirements.txt", "--user"]
  3. Adicionar testes de unidade: se você tiver definido testes de unidade no seu aplicativo usando um framework de teste como pytest, poderá configurar o Cloud Build para executar os testes adicionando o campos a seguir em uma etapa de build:

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

    A etapa de criação a seguir salva a saída de registro pytest em um arquivo XML JUNIT. O nome desse arquivo é criado usando a versão curta do código de confirmação associado à sua compilação. Uma etapa de criação subsequente salvará os registros nesse arquivo no Cloud Storage.

    # Run unit tests
    - name: python
      entrypoint: python
      args: ["-m", "pytest", "--junitxml=${SHORT_SHA}_test_log.xml"] 
  4. colocar em contêiner o aplicativo: depois de adicionar a etapa de criação para garantir que os testes tenham passado, crie o aplicativo; O Cloud Build oferece uma imagem do Docker pré-criada que pode ser usada para armazenar o aplicativo Python em contêiner. Para contentorizar o aplicativo, adicione os seguintes campos em uma etapa da criação:

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

    A etapa de criação a seguir cria a imagem myimage e a marca com a versão curta do seu código de confirmação. A etapa de criação usa as substituições padrão para o ID do projeto, o nome do repositório e os valores SHA curtos. Por isso, esses valores são substituídos automaticamente no momento da criação.

    # Docker Build
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t',
             'us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA', '.']
  5. Envie o contêiner para o Artifact Registry: é possível armazenar o contêiner criado no Artifact Registry, um serviço do Google Cloud que pode ser usado para armazenar, gerenciar e proteger artefatos de versão. Para fazer isso, você precisa ter um repositório atual do Docker no Artifact Registry. Para configurar o Cloud Build para armazenar a imagem em um repositório do Artifact Registry Docker, adicione uma etapa de criação com os seguintes campos:

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

    A etapa de criação a seguir envia a imagem criada na etapa 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/$_REPO_NAME/myimage:$SHORT_SHA']
  6. Implantar o contêiner no Cloud Run: para implantar a imagem no Cloud Run, adicione uma etapa de criação com os seguintes campos:

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

    A etapa de criação a seguir implanta a imagem criada anteriormente no Cloud Run:

    # Deploy to Cloud Run
    - name: google/cloud-sdk
      args: ['gcloud', 'run', 'deploy', 'helloworld',
             '--image=us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA',
             '--region', 'us-central1', '--platform', 'managed',
             '--allow-unauthenticated']
  7. Salvar registros de teste no Cloud Storage: é possível configurar o Cloud Build para armazenar registros de teste no Cloud Storage especificando um local e um caminho do bucket atuais para os registros de teste. A etapa de criação a seguir armazena os registros de teste salvos no arquivo XML JUNIT em um bucket do Cloud Storage:

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

    O snippet a seguir mostra o arquivo de configuração de criação completo para todas as etapas descritas 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/$_REPO_NAME/myimage:$SHORT_SHA', '.']
    
      # Docker push to Google Artifact Registry
      - name: 'gcr.io/cloud-builders/docker'
        args: ['push',  'us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/myimage:$SHORT_SHA']
    
      # Deploy to Cloud Run
      - name: google/cloud-sdk
        args: ['gcloud', 'run', 'deploy', 'helloworld',
               '--image=us-central1-docker.pkg.dev/$PROJECT_ID/$_REPO_NAME/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/$_REPO_NAME/myimage:$SHORT_SHA
  8. Inicie a versão manualmente ou usando acionadores de versão.

A seguir