构建、测试 Python 应用并实现容器化

本页面介绍如何配置 Cloud Build 以构建、测试、容器化和部署 Python 应用。

借助 Cloud Build,您可以使用任何公开可用的容器映像来执行开发任务,包括构建、测试、容器化、上传到 Artifact Registry、部署和保存构建日志。Docker Hub 中的公共 python 映像预装有 pythonpip 工具。您可以使用这些工具配置 Cloud Build,以便使用这些工具安装依赖项、构建和运行单元测试。

准备工作

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

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

    启用 API

  • 如需运行此页面中的 gcloud 命令,请安装 Google Cloud CLI
  • 准备好您的 Python 项目,包括 requirements.txt 文件。您需要 Dockerfile 以及源代码。
  • 如果您要在 Artifact Registry 中存储构建的容器,请在 Artifact Registry 中创建 Docker 代码库
  • 如果您要在 Cloud Storage 中存储测试日志,请在 Cloud Storage 中创建存储桶

必需的 IAM 权限

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

配置 Python 构建

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

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

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

    • name:将此字段的值设置为 python 以将 Docker Hub 中的 Python 映像用于此任务。
    • entrypoint:设置此字段会替换 name 中引用的映像的默认入口点。将此字段的默认值设置为 pip 以调用 pip 作为构建步骤的入口点并运行 pip 命令。
    • args:构建步骤的 args 字段采用一系列参数,并将其传递给 name 字段引用的映像。在该字段中传递相应参数以运行 pip install 命令。pip install 命令中的 --user 标志可确保后续构建步骤可以访问此构建步骤中安装的模块。

    以下构建步骤会添加参数来通过 requirements.txt 文件安装要求:

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

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

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

    # Run unit tests
    - name: python
      entrypoint: python
      args: ["-m", "pytest", "--junitxml=${SHORT_SHA}_test_log.xml"] 
  4. 将应用容器化:添加构建步骤以确保测试通过后,您可以构建应用。Cloud Build 提供预构建的 Docker 映像,可用于将 Python 应用容器化。如需将您的应用容器化,请在构建步骤中添加以下字段:

    • name:将此字段的值设置为 gcr.io/cloud-builders/docker,以将预构建的 Docker 映像用于您的任务。
    • args:为 docker build 命令添加参数作为此字段的值。

    以下构建步骤会构建映像 myimage,并使用提交 ID 的短版本来标记该映像。该构建步骤使用默认替代变量作为项目 ID、代码库名称和短 SHA 值,因此这些值会在构建时自动替换。

    # 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. 将容器推送到 Artifact Registry:您可以将构建的容器存储在 Artifact Registry 中,这是一种 Google Cloud 服务,可用于存储、管理和保护构建工件。为此,您需要在 Artifact Registry 中已有 Docker 代码库。如需配置 Cloud Build 以将映像存储在 Artifact Registry Docker 代码库中,请添加具有以下字段的构建步骤:

    • name:将此字段的值设置为 gcr.io/cloud-builders/docker 以使用 Container Registry 中的官方 docker 构建器映像来执行任务。
    • args:为 docker push 命令添加参数作为此字段的值。对于目标网址,输入要在其中存储映像的 Artifact Registry Docker 代码库。

    以下构建步骤会将您在上一步中构建的映像推送到 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}']

    可选:如果您希望 Cloud Build 生成构建出处信息,请在构建步骤中使用 images 字段,而不是使用 Docker push 构建步骤中的单独字段。如果您使用的是区域级 build,还必须添加 requestedVerifyOption 字段,并将值设置为 VERIFIED 以启用出处生成功能。

  6. 将容器部署到 Cloud Run:如需在 Cloud Run 上部署映像,请添加包含以下字段的构建步骤:

    • name:将此字段的值设置为 google/cloud-sdk,以使用 gcloud CLI 映像调用 gcloud 命令,以在 Cloud Run 上部署映像。
    • args:为 gcloud run deploy 命令添加参数作为此字段的值。

    以下构建步骤会将之前构建的映像部署到 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. 将测试日志保存到 Cloud Storage:您可以配置 Cloud Build,以便通过指定现有存储桶位置和测试日志的路径在 Cloud Storage 中存储所有测试日志。以下构建步骤会将保存在 JUNIT XML 文件中的测试日志存储到 Cloud Storage 存储桶:

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

    以下代码段展示了针对上述所有步骤的完整构建配置文件:

    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. 启动构建手动使用构建触发器

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

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

后续步骤