Criar e testar aplicativos Python

Nesta página, descrevemos como configurar o Cloud Build para criar e testar seus aplicativos Python, fazer upload dos artefatos para o Artifact Registry, gerar informações de procedência e salvar os registros de teste no Cloud Storage.

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 pré-instalada com as ferramentas python e pip. É possível configurar o Cloud Build para usar essas ferramentas para instalar dependências, criar e executar testes de unidade usando essas ferramentas.

Antes de começar

Nas instruções desta página, pressupomos que você está familiarizado com o Python. Além disso:

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

    Ative as APIs

  • Para executar os comandos gcloud nesta página, instale a Google Cloud CLI.
  • Tenha seu projeto do Python em mãos.
  • Ter um repositório Python no Artifact Registry. Se você não tiver um, crie um novo repositório.
  • 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 do Python

Nesta seção, você verá um exemplo de arquivo de configuração de versão para um aplicativo Python. Ele tem etapas de versão para instalar requisitos, adicionar testes de unidade e, após a aprovação, criar e implantar o aplicativo.

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

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

    • name: defina o valor desse campo como python ou python:<tag> para usar a imagem Python do Docker Hub nessa tarefa. Para ver uma lista de tags disponíveis para outras imagens em Python, consulte a referência do Docker Hub para a imagem em Python.
    • entrypoint: a definiçã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 entrypoint da etapa de versão e execute comandos pip.
    • args: o campo args de uma etapa de criação recebe uma lista de argumentos e os passa para a imagem referenciada pelo campo name. Transmita os argumentos para executar o comando pip install nesse campo. A sinalização --user no comando pip install garante que as etapas subsequentes de versão possam acessar os módulos instalados nesta etapa de versão.

    A etapa de build a seguir adiciona argumentos para os requisitos de instalação:

     steps:
        - name: 'python'
          entrypoint: 'python'
          args: ['-m', 'pip', 'install', '--upgrade', 'pip']
        - name: python
          entrypoint: python
          args: ['-m', 'pip', 'install', 'build', 'pytest', 'Flask', '--user']
    
  3. Adicionar testes de unidade: se você definiu testes de unidade no aplicativo usando um framework de teste, como pytest, configure o Cloud Build para executar os testes adicionando os campos a seguir em uma etapa do 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 comandos python.
    • args: adicione os argumentos para executar o comando python pytest.

    A etapa de criação a seguir salva a saída do registro pytest em um arquivo XML JUNIT. O nome desse arquivo é construído usando $SHORT_SHA, a versão abreviada do ID de confirmação associado ao build. Uma próxima etapa de versão salvará os registros nesse arquivo no Cloud Storage.

        - name: 'python'
          entrypoint: 'python'
          args: ['-m', 'pytest', '--junitxml=${SHORT_SHA}_test_log.xml']
    
  4. Build: no arquivo de configuração do build, defina o builder e o args para criar seu aplicativo:

    • 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 comandos python.
    • args: adicione os argumentos para executar o build.

    Esta etapa inicia o build:

        - name: 'python'
          entrypoint: 'python'
          args: ['-m', 'build']
    
  5. Faça upload para o Artifact Registry:

    No arquivo de configuração, adicione o campo pythonPackages e especifique o repositório Python no Artifact Registry:

        artifacts:
           pythonPackages:
           - repository: 'https://LOCATION-python.pkg.dev/PROJECT-ID/REPOSITORY'
              paths: ['dist/*']
    

    Substitua os seguintes valores:

    • PROJECT-ID é o ID do projeto do Google Cloud que contém o repositório do Artifact Registry.
    • REPOSITORY é o ID do repositório.
    • LOCATION é o local regional ou multirregional do repositório.
  6. Opcional: ativar a geração de procedência

    O Cloud Build pode gerar metadados verificáveis de procedência do build de Níveis da cadeia de suprimentos para artefatos de software (SLSA) para proteger seu pipeline de integração contínua.

    Para ativar a geração de procedência, adicione requestedVerifyOption: VERIFIED à seção options no arquivo de configuração.

  7. Salvar registros de teste no Cloud Storage: é possível configurar o Cloud Build para armazenar todos os registros de teste no Cloud Storage especificando um local e um caminho do bucket existente para os registros de teste. A etapa de criação a seguir armazena os registros de teste que você salvou no arquivo XML JUNIT em um bucket do Cloud Storage:

        artifacts:
        objects:
           location: 'gs://${_BUCKET_NAME}/'
           paths:
              - '${SHORT_SHA}_test_log.xml'
    
  8. Inicie seu build: manualmente ou usando gatilhos de build.

    Quando o build for concluído, será possível ver os detalhes do repositório no Artifact Registry.

    Também é possível conferir os metadados da procedência do build e validar a procedência.

A seguir