构建和测试 Python 应用

本页面介绍如何配置 Cloud Build 以构建和测试 Python 应用、将工件上传到 Artifact Registry、生成出处信息,以及在 Cloud Storage 中保存测试日志。

通过 Cloud Build,您可以使用任何公开可用的容器映像来执行任务。Docker Hub 中的公共 python 映像预装有 pythonpip 工具。您可以使用这些工具配置 Cloud Build,以便使用这些工具安装依赖项、构建和运行单元测试。

准备工作

本页面的说明假定您熟悉 Python。此外:

  • 启用 Cloud Build, Artifact Registry, and Cloud Storage API。

    启用 API

  • 如需运行此页面中的 gcloud 命令,请安装 Google Cloud CLI
  • 准备好 Python 项目。
  • 在 Artifact Registry 中拥有 Python 代码库。如果没有,请创建一个新代码库
  • 如果您要在 Cloud Storage 中存储测试日志,请在 Cloud Storage 中创建存储桶

必需的 IAM 权限

如需了解如何授予这些角色,请参阅使用 IAM 页面授予角色

配置 Python 构建

本部分逐步演示了 Python 应用的构建配置文件示例。该部分包含安装要求、添加单元测试,以及测试通过后构建和部署应用的构建步骤。

  1. 在项目根目录中,创建名为 cloudbuild.yamlCloud Build 配置文件

  2. 安装要求:Docker Hub 中的 python 映像预安装了 pip。如需从 pip 安装依赖项,请使用以下字段添加构建步骤:

    • name:将此字段的值设置为 pythonpython:<tag>,以使用 Docker Hub 中的 Python 映像执行此任务。如需查看其他 Python 映像的可用标记列表,请参阅 Python 映像的 Docker Hub 参考文档
    • entrypoint:设置此字段会替换 name 中引用的映像的默认入口点。将此字段的默认值设置为 pip 以调用 pip 作为构建步骤的入口点并运行 pip 命令。
    • args:构建步骤的 args 字段采用一系列参数,并将其传递给 name 字段引用的映像。在该字段中传递相应参数以运行 pip install 命令。pip install 命令中的 --user 标志可确保后续构建步骤可以访问此构建步骤中安装的模块。

    以下构建步骤添加了一些参数来满足安装要求:

     steps:
        - name: 'python'
          entrypoint: 'python'
          args: ['-m', 'pip', 'install', '--upgrade', 'pip']
        - name: python
          entrypoint: python
          args: ['-m', 'pip', 'install', 'build', 'pytest', 'Flask', '--user']
    
  3. 添加单元测试:如果您已使用测试框架(如 pytest)在应用中定义了单元测试,则可以配置 Cloud Build,以便通过在构建步骤中添加以下字段来运行测试:

    • name:将此字段的值设置为 python 以将 Docker Hub 中的 Python 映像用于您的任务。
    • entrypoint:将此字段的值设置为 python 以运行 python 命令。
    • args:添加相应参数以运行 python pytest 命令。

    以下构建步骤会将 pytest 日志输出保存到 JUNIT XML 文件。此文件的名称是使用 $SHORT_SHA与 build 关联的提交 ID 的简短版本)构造的。后续构建步骤会将此文件中的日志保存到 Cloud Storage。

        - name: 'python'
          entrypoint: 'python'
          args: ['-m', 'pytest', '--junitxml=${SHORT_SHA}_test_log.xml']
    
  4. 构建:在构建配置文件中,定义构建器和 args 来构建应用:

    • name:将此字段的值设置为 python 以将 Docker Hub 中的 Python 映像用于您的任务。
    • entrypoint:将此字段的值设置为 python 以运行 python 命令。
    • args:添加用于执行构建的参数。

    以下构建步骤开始构建:

        - name: 'python'
          entrypoint: 'python'
          args: ['-m', 'build']
    
  5. 上传到 Artifact Registry

    当您使用 Cloud Build 配置文件中提供的 python_packages 字段将工件上传到 Artifact Registry 时,Cloud Build 会为独立 Python 软件包生成软件工件的供应链级别 (SLSA) 构建出处信息。

    在配置文件中,添加 pythonPackages 字段并在 Artifact Registry 中指定 Python 代码库:

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

    替换以下值:

    • PROJECT-ID 是包含 Artifact Registry 代码库的 Google Cloud 项目的 ID。
    • REPOSITORY 是代码库的 ID。
    • LOCATION 是代码库的单区域或多区域位置
  6. 可选:为区域 build 启用出处

    如果您使用的是区域级 build,请在 build 配置文件的 options 中添加 requestedVerifyOption 字段。将值设置为 VERIFIED 以启用出处元数据生成功能。如果您不添加 requestedVerifyOption: VERIFIED,Cloud Build 仅会为全局构建生成出处。

    options:
      requestedVerifyOption: VERIFIED
    
  7. 将测试日志保存到 Cloud Storage:您可以配置 Cloud Build,以便通过指定现有存储桶位置和测试日志的路径在 Cloud Storage 中存储所有测试日志。以下构建步骤会将保存在 JUNIT XML 文件中的测试日志存储到 Cloud Storage 存储桶:

        artifacts:
        objects:
           location: 'gs://${_BUCKET_NAME}/'
           paths:
              - '${SHORT_SHA}_test_log.xml'
    
  8. 启动构建手动使用构建触发器

    构建完成后,您可以在 Artifact Registry 中查看代码库详情

    您还可以查看 build 出处元数据验证出处,以帮助保护您的软件供应链。

后续步骤