配置部署预览


本教程介绍如何使用 Cloud Run 修订版本网址通过 Cloud Build 触发器实现预览版 GitHub 拉取请求。借助预览版,您可以在不更改服务的现行版本或“生产”版本的情况下向服务部署潜在更改。通过部署一个打开的拉取请求的 0% 流量修订版本,您可以预览更改,并确保合并之前更改在接近生产的环境中按预期生效。

本教程适用于公共和私有 GitHub 代码库。请注意,预览版本身将设为公开,如果模糊处理,则为网址。

目标

  • 创建 Cloud Run 服务。
  • 在 GitHub 上实现基于源代码控制的持续集成。
  • 通过 Secret Manager 创建和管理对 Secret 的访问权限。
  • 部署自定义 Cloud Build 构建器。
  • 创建 Cloud Build 触发器,以便基于 GitHub 拉取请求调用构建。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 Cloud Run, Cloud Build, and Secret Manager API。

    启用 API

  5. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  6. 确保您的 Google Cloud 项目已启用结算功能

  7. 启用 Cloud Run, Cloud Build, and Secret Manager API。

    启用 API

所需的角色

如需获得完成本教程所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

检索代码示例

为便于本教程使用,您将创建一个新的 GitHub 代码库,其中包含基于模板的 Hello World 应用副本。然后,您将使用自定义 Cloud Build 配置将新文件添加到此代码库中。

  1. 登录 GitHub 并导航到模板代码库
  2. 点击“使用此模板”,以使用此模板创建新的代码库。
    1. 将您的代码库命名为 helloworld-python
    2. 为代码库选择“公开”或“专用”。
    3. 点击基于模板创建代码库
  3. 在您的代码库中创建新的 Cloud Build 配置文件(完整说明):

    1. 在代码库页面上,依次点击添加文件 > 新建文件
    2. 将新文件命名为 cloudbuild.yaml
    3. 将以下代码复制到 cloudbuild.yaml

      steps:
        - id: "build image"
          name: "gcr.io/cloud-builders/docker"
          args:
            [
              "build",
              "-t",
              "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
              ".",
            ]
      
        - id: "push image"
          name: "gcr.io/cloud-builders/docker"
          args:
            [
              "push",
              "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
            ]
      
        - id: "deploy prod service"
          name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
          entrypoint: "gcloud"
          args:
            [
              "run",
              "deploy",
              "${_SERVICE_NAME}",
              "--platform",
              "managed",
              "--region",
              "${_REGION}",
              "--allow-unauthenticated",
              "--image",
              "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
            ]
      
        # Force the new revision to serve 100% of traffic.
        - id: "ensure prod service live"
          name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
          entrypoint: "gcloud"
          args:
            [
              "run",
              "services",
              "update-traffic",
              "${_SERVICE_NAME}",
              "--to-latest",
              "--platform",
              "managed",
              "--region",
              "${_REGION}",
            ]
      
      substitutions:
        _SERVICE_NAME: myservice
        _REGION: us-central1
      
      options:
        logging: CLOUD_LOGGING_ONLY
    4. 保留默认的“直接提交到 main 分支中”选项。

    5. 点击提交新文件 (Commit new file)。

使用构建触发器部署服务

本教程介绍了如何设置构建触发器,以在您每次更新代码库的主分支时自动启动构建。此外,您还可以在每次部署更改时通过调用 Cloud Build 来手动部署您的服务。

在本教程中,使用 cloudbuild.yaml 文件部署名为 myservice 的示例服务。

  1. 向 Cloud Build 服务账号授予 Cloud Run Admin 和 Service Account User 角色(完整说明):

    1. 在 Google Cloud 控制台中,转到 Cloud Build 账号设置页面。

      转到“Cloud Build 账号设置”页面

    2. 启用 Cloud Run Admin 角色。

    3. 在确认对话框中,点击授予对所有服务账号的访问权限

  2. 将您的 GitHub 账号连接到 Cloud Build(完整说明):

    1. 在 Google Cloud 控制台中,转到 Cloud Build 触发器页面。

      转到 Cloud Build 触发器页面

    2. 点击关联代码库

    3. 选择 GitHub(Cloud Build GitHub 应用)作为来源,然后逐步完成身份验证和授权对话框。

    4. 选择“GITHUB_USER_NAME/helloworld-python”代码库。

    5. 点击连接代码库

    6. 在“创建触发器(可选)”中,点击创建触发器

  3. 创建 Cloud Build 触发器(完整说明):

    1. 在“Cloud Build 触发器”页面中,点击创建触发器
    2. 输入以下详细信息:
      • 名称:prod-deploy
      • 事件:推送至分支
      • 源代码库:“GITHUB_USER_NAME/helloworld-python”
      • 源分支:^main$
      • 构建配置:Cloud Build 配置文件(yaml 或 json)
      • Cloud Build 配置文件位置:cloudbuild.yaml
    3. 点击创建
  4. 手动运行新触发器:

    1. 在新触发器列表中,点击运行
    2. 在弹出式窗口中,确认分支名称 (main),然后点击运行触发器
    3. 转到 Cloud Build 历史记录以检查构建进度。
    4. 等待构建完成。
  5. 确认部署成功。

    1. 在 Google Cloud Console 中,转到 Cloud Run 页面。

      转到 Cloud Run 页面

    2. 确认服务是否具有绿色对勾标记,表示部署成功。

    3. 点击“修订版本”标签页,并确认服务具有 1 个修订版本,处理 100% 的流量,从“myservice-00001-”开始。

    4. 点击服务的网址,并确认服务显示“Hello World!”。

    Cloud Run 控制台的屏幕截图,其中包含一个修订版本,突出显示了服务网址。
    已部署的 Cloud Run 服务的屏幕截图,其中显示“Hello World!”。

创建令牌和配置

在上一部分中创建的 prod-deploy 触发器会在推送到主分支时部署服务。现在,您将创建第二个触发器,每次在您的代码库中创建或更新拉取请求时都会运行该触发器。

设置新的触发器后,系统将部署预览,但在拉取请求中不会提供链接到预览的信息。如需设置此功能,您需要完成以下额外的配置步骤:

  • 创建 GitHub 令牌
  • 将此令牌存储在 Secret Manager 中
  • 创建自定义映像,用作 Cloud Build 中的一个步骤。

创建和存储 GitHub 令牌

  1. 创建 GitHub 令牌以允许回写到拉取请求(完整说明):
    1. 转到 GitHub 个人访问令牌设置页面。
    2. 点击生成新令牌
    3. 输入以下详细信息:
      • 注意preview-deploy
      • 有效期:30 天
      • 范围
        • 对于公共代码库:repo:status(“访问提交状态”)
        • 对于私有代码库:repo(“完全控制私有代码库”)
    4. 点击 生成令牌
    5. 复制生成的令牌的值。
  2. 将 GitHub 令牌存储在 Secret Manager 中:

    1. 在 Google Cloud 控制台中,转到 Secret Manager 页面。

      转到 Secret Manager 页面

    2. 点击创建 Secret

    3. 输入以下详细信息:

      1. 名称:github_token
      2. Secret 值:粘贴您从 GitHub 复制的令牌值。
    4. 点击创建 Secret

  3. 允许 Cloud Build 访问此 Secret:

    1. 在新的浏览器标签页中,转到 Google Cloud 控制台中的 Cloud Build 设置页面。

      转到 Cloud Build 设置页面

    2. 复制“服务账号电子邮件”的值。

      • 电子邮件为 PROJECT_NUM@cloudbuild.gserviceaccount.com
    3. 返回 Secret Manager,然后点击权限标签页,然后点击 添加

      • 新的主账号:PROJECT_NUM@cloudbuild.gserviceaccount.com
      • 角色:Secret Manager Secret Accessor
    4. 点击保存

GitHub 建议为个人访问令牌设置有效期,并在令牌设置为失效时发送提醒电子邮件。如果您继续使用部署预览,请在重新生成令牌时创建新版本的 github_token。下一步中的构建器会检索令牌的最新版本,因此预览将继续有效。

为 Cloud Build 创建新映像

将“Deployment Preview”通知写入拉取请求的脚本位于 Python 文档示例中。除了选择将此脚本添加到源代码中之外,您还可以选择将此脚本构建到项目内的容器中,并在 Cloud Build 配置中作为一个步骤运行该容器。

您可以使用 Cloud Shell 或本地机器(如果您安装和配置了 git 和 Google Cloud CLI)按照以下说明操作。以下说明介绍了两种方法。

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  2. 配置 Google Cloud CLI 以使用您的项目,注意将 PROJECT_ID 替换为您的项目 ID:
    export PROJECT_ID=PROJECT_ID
    gcloud config set project $PROJECT_ID
    
    如果使用 Cloud Shell,您可能需要授权 Google Cloud CLI 进行 Google Cloud API 调用。点击授权以允许此操作继续进行。
  3. 创建一个新的容器映像:
    git clone https://github.com/GoogleCloudPlatform/python-docs-samples
    cd python-docs-samples/
    gcloud builds submit --tag gcr.io/$PROJECT_ID/deployment-previews run/deployment-previews
    
  4. 确认该容器已创建:
    gcloud container images list
    
  5. 移除克隆的代码库:
    cd ..
    rm -rf python-docs-samples
    

添加新的 Cloud Build 配置

您的代码库已有在主分支上使用的 cloudbuild.yaml 文件。现在,您将为这个新的触发器创建一个新配置。

  1. 在 GitHub 代码库页面上,依次点击添加文件 > 新建文件

    1. 将新文件命名为 cloudbuild-preview.yaml
    2. 复制下面的代码并粘贴到新文件中:
    steps:
      - id: "build image"
        name: "gcr.io/cloud-builders/docker"
        args:
          [
            "build",
            "-t",
            "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
            ".",
          ]
    
      - id: "push image"
        name: "gcr.io/cloud-builders/docker"
        args:
          [
            "push",
            "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
          ]
    
      - id: "deploy revision with tag"
        name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
        entrypoint: "gcloud"
        args:
          [
            "run",
            "deploy",
            "${_SERVICE_NAME}",
            "--platform",
            "managed",
            "--region",
            "${_REGION}",
            "--image",
            "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
            "--tag",
            "pr-${_PR_NUMBER}",
            "--no-traffic",
          ]
    
      - id: "link revision on pull request"
        name: "us-central1-docker.pkg.dev/$PROJECT_ID/containers/deployment-previews" # our custom builder
        secretEnv: ["GITHUB_TOKEN"]
        args:
          [
            "set",
            "--project-id",
            "${PROJECT_ID}",
            "--region",
            "${_REGION}",
            "--service",
            "${_SERVICE_NAME}",
            "--pull-request",
            "${_PR_NUMBER}",
            "--repo-name",
            "${REPO_FULL_NAME}",
            "--commit-sha",
            "${SHORT_SHA}",
          ]
    
    substitutions:
      _SERVICE_NAME: myservice
      _REGION: us-central1
    
    options:
      dynamicSubstitutions: true
      logging: CLOUD_LOGGING_ONLY
    
    availableSecrets:
      secretManager:
        - versionName: projects/$PROJECT_ID/secrets/github_token/versions/latest
          env: "GITHUB_TOKEN"
  2. 提交对代码库的主分支的更改。

创建辅助触发器

现在,所有基础工作都已就绪,请创建新的触发器。

  1. 创建新的 Cloud Build 触发器(完整说明):

    1. 在 Google Cloud 控制台中,转到 Cloud Build 触发器页面。

      转到 Cloud Build 触发器页面

    2. 点击创建触发器

    3. 输入以下详细信息:

      • 名称:preview-deploy
      • 事件:拉取请求
      • 源代码库:“GITHUB_USER_NAME/helloworld-python”
      • 基本分支:^main$
      • 评论控制:必需(所有者和协作者除外)
        • 作为代码库的所有者,您创建的拉取请求上会自动构建预览。
        • 如果要允许任何人预览其更改,请详细了解选择“不需要”的安全隐患
      • 配置:Cloud Build 配置文件
      • Cloud Build 配置文件位置:cloudbuild-preview.yaml
    4. 点击创建

检查操作是否成功

由于创建新的拉取请求时会触发这个新触发器,因此,为了测试新触发器,您需要创建新的拉取请求。

  1. 转到您的代码库,然后在新分支中对 app.py 进行可视化更改。
    1. 转到 app.py,然后点击铅笔图标 ()。
      用于在网站上修改文件的 GitHub 界面的屏幕截图。
    2. 进行更改;例如,将“Hello”更改为“Greetings”。
    3. 选择为此提交创建新分支并启动拉取请求 (Create a new branch for this commit and start a pull request),然后点击建议更改 (Propose change)。
  2. 使用此分支创建新的拉取请求

    如果触发器配置正确,则在您创建拉取请求后不久即会显示一项新检查:

    显示待处理检查的 GitHub 界面的屏幕截图。
  3. 检查的名称是触发器的名称和项目 ID。通过点击详细信息 > 查看有关 Google Cloud Build 的更多详情,查看构建进度。

    如果触发器失败,您需要重新提交构建,或者如果要对拉取请求进行其他更改,则需要将更改提交到同一分支。每次针对拉取请求提交的新内容都会触发新构建。

  4. 触发器完成后,系统会为拉取请求显示名为“部署预览”的新状态检查。显示的图标是您的头像,因为您的账号拥有所用令牌:

    显示已完成检查的 GitHub 界面的屏幕截图。
  5. 点击详细信息以导航至预览。显示的网址与原始服务网址相同,但以“PR-1---”为前缀。

    部署的 Cloud Run 服务的预览画面的屏幕截图,显示“Greetings World!”。

    请注意,如果您导航至原始服务网址,则系统会显示原始内容:

    最初部署的 Cloud Run 服务的屏幕截图,其中仍显示“Hello World!”。
  6. 查看服务的修订版本列表以检查 Cloud Run 中的服务状态:现在有两种修订版本可以处理流量:原始版本和预览版本:

    Cloud Run 控制台的屏幕截图,其中包含两个活动的修订版本。
  7. 通过将新提交添加到分支,继续对拉取请求进行更改。每次提交时,preview-deploy 触发器都会触发,同时创建一个新的服务修订版本,并且可在同一网址获取该修订版本:

    Cloud Run 控制台的屏幕截图,其中包含三个修订版本。
  8. 准备好合并更改后,点击合并拉取请求。原始的 prod-deploy 触发器会运行,并且拉取请求的更改会反映在原始网址中:

    新部署的 Cloud Run 服务的屏幕截图,其中显示“Greetings World!”。

    新修订版本会在主网址中处理 100% 的流量,但拉取请求的预览网址仍然附加到该拉取请求的最新提交中,因此链接将继续有效:

    Cloud Run 控制台的屏幕截图,其中包含四个修订版本。

限制

可以创建的修订版本网址数量存在限制。如果您预计您的代码库将有 1000 个以上的拉取请求,请考虑执行清理标记的过程,如 cloudbuild-cleanup.yaml 所示。

了解代码

cloudbuild.yaml

此代码基于 Cloud Build 提供的示例 cloudbuild.yaml,但带有一个著名的更新:用于运行 update-traffic 的第四步。

steps:
  - id: "build image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "build",
        "-t",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
        ".",
      ]

  - id: "push image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "push",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
      ]

  - id: "deploy prod service"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "deploy",
        "${_SERVICE_NAME}",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
        "--allow-unauthenticated",
        "--image",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
      ]

  # Force the new revision to serve 100% of traffic.
  - id: "ensure prod service live"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "services",
        "update-traffic",
        "${_SERVICE_NAME}",
        "--to-latest",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
      ]

substitutions:
  _SERVICE_NAME: myservice
  _REGION: us-central1

options:
  logging: CLOUD_LOGGING_ONLY

cloudbuild.yaml 中的配置可以更改流量拆分。--to-latest 参数提供的功能与 Cloud Run 页面中“立即提供此修订版本”复选框相同。它可确保服务的修订版本可立即处理所有流量。

cloudbuild-preview.yaml

steps:
  - id: "build image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "build",
        "-t",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
        ".",
      ]

  - id: "push image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "push",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
      ]

  - id: "deploy revision with tag"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "deploy",
        "${_SERVICE_NAME}",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
        "--image",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
        "--tag",
        "pr-${_PR_NUMBER}",
        "--no-traffic",
      ]

  - id: "link revision on pull request"
    name: "us-central1-docker.pkg.dev/$PROJECT_ID/containers/deployment-previews" # our custom builder
    secretEnv: ["GITHUB_TOKEN"]
    args:
      [
        "set",
        "--project-id",
        "${PROJECT_ID}",
        "--region",
        "${_REGION}",
        "--service",
        "${_SERVICE_NAME}",
        "--pull-request",
        "${_PR_NUMBER}",
        "--repo-name",
        "${REPO_FULL_NAME}",
        "--commit-sha",
        "${SHORT_SHA}",
      ]

substitutions:
  _SERVICE_NAME: myservice
  _REGION: us-central1

options:
  dynamicSubstitutions: true
  logging: CLOUD_LOGGING_ONLY

availableSecrets:
  secretManager:
    - versionName: projects/$PROJECT_ID/secrets/github_token/versions/latest
      env: "GITHUB_TOKEN"

此代码与 cloudbuild.yaml 类似,但前者增加了步骤:

  1. 构建和推送服务映像后,cloudbuild-preview.yaml 会使用 --no-traffic 标志部署该服务。这意味着,即使这是最新修订版本,它也不会用于处理流量。

  2. cloudbuild-preview.yaml 会根据拉取请求编号添加自定义标记。此例中,字符串的前缀为“pr-”并以拉取请求数结尾。

    此时,修订版本网址可以正常工作,但提交拉取请求的人员无法确定这一点,因为无法从 GitHub 查看 Cloud Build 日志:只能看到指向日志的链接。只有拥有足够权限、经过身份验证的 Cloud Build 项目用户才能查看日志。

  3. cloudbuild-preview.yaml 使用 Cloud Build 提供的内置替换参数运行 check_status.py 脚本。操作 GitHub 代码库时,您可以使用许多参数,例如拉取请求编号、代码库名称和提交 SHA。

如需重新运行此触发器,请在 GitHub 中提交另一个提交。此触发器无法从控制台中的 Cloud Build 页面重新运行。

cloudbuild-cleanup.yaml


steps:
  - id: "build image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "build",
        "-t",
        "us-central1-docker.pkg.dev/${PROJECT_ID}/containers/${_SERVICE_NAME}",
        ".",
      ]

  - id: "push image"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "push",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
      ]

  - id: "deploy prod service"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "deploy",
        "${_SERVICE_NAME}",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
        "--allow-unauthenticated",
        "--image",
        "us-central1-docker.pkg.dev/$PROJECT_ID/containers/${_SERVICE_NAME}",
      ]

  # Force the new revision to serve 100% of traffic.
  - id: "ensure prod service live"
    name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
    entrypoint: "gcloud"
    args:
      [
        "run",
        "services",
        "update-traffic",
        "${_SERVICE_NAME}",
        "--to-latest",
        "--platform",
        "managed",
        "--region",
        "${_REGION}",
      ]

  # Cleanup tags against closed pull requests
  - id: "clean up old tag"
    name: "us-central1-docker.pkg.dev/${PROJECT_ID}/containers/deployment-previews" # our custom builder
    secretEnv: ["GITHUB_TOKEN"]
    args:
      [
        "cleanup",
        "--project-id",
        "${PROJECT_ID}",
        "--region",
        "${_REGION}",
        "--service",
        "${_SERVICE_NAME}",
        "--repo-name",
        "${REPO_FULL_NAME}",
      ]

substitutions:
  _SERVICE_NAME: myservice
  _REGION: us-central1

options:
  dynamicSubstitutions: true
  logging: CLOUD_LOGGING_ONLY

availableSecrets:
  secretManager:
    - versionName: projects/$PROJECT_ID/secrets/github_token/versions/latest
      env: "GITHUB_TOKEN"

此代码可以替代 cloudbuild.yaml,前者增加了清理功能。初始步骤执行部署,然后功能会按以下所述扩展:

  1. 使用 Discovery API 和 GitHub API,确定服务的哪些标记用于已关闭的拉取请求。至少会有一个拉取请求已合并,从而触发此触发器。

  2. 删除已标识的标记。

check_status.py

def set(
    dry_run: str,
    project_id: str,
    region: str,
    service: str,
    repo_name: str,
    commit_sha: str,
    pull_request: str,
) -> None:
    """Set a status on a GitHub commit to a specific revision URL"""
    service_obj = get_service(project_id, region, service)
    revision_url = get_revision_url(service_obj, tag=make_tag(pull_request))

    ghtoken = os.environ.get("GITHUB_TOKEN", None)

    if not ghtoken:
        raise ValueError("GITHUB_TOKEN not defined.")

    try:
        repo = github.Github(ghtoken).get_repo(repo_name)
    except GithubException as e:
        error(
            e.data["message"],
            context=f"finding repo {repo_name}. Is it a private repo, and does your token have the correct permissions?",
        )

    try:
        commit = repo.get_commit(sha=commit_sha)
    except GithubException as e:
        error(e.data["message"], context=f"finding commit {commit_sha}")

    # ...

    commit.create_status(
        state="success",
        target_url=revision_url,
        context=f"Deployment Preview for {service}",
        description="Your preview is now available.",
    )
    click.secho("Success: ", fg="green", bold=True, nl=False)
    click.echo(
        f"Status created on {repo_name}, commit {commit.sha[:7]}, "
        f"linking to {revision_url} on service {service_obj['metadata']['name']}"
    )

check_status.py 脚本会提取有关 Cloud Run 服务、GitHub 代码库和提交的信息,然后执行以下操作:

  • 使用 Google API Python 客户端检索服务名称、标记和修订版本网址。
  • 从 Secret Manager 提供的环境变量中检索 GitHub 令牌。
  • 使用 Python 版 GitHub Client API,为给定提交创建状态,并链接到检索到的修订版本网址。

清除数据

如果您为本教程创建了一个新项目,请删除项目。 如果您使用的是现有项目,希望保留此项目且不保留本教程中添加的任何更改,请删除为教程创建的资源。 此外,您还需要删除为教程创建的 GitHub 配置

删除项目

为了避免产生费用,最简单的方法是删除您为本教程创建的项目。

如需删除项目,请执行以下操作:

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除教程资源

  1. 删除您在本教程中部署的 Cloud Run 服务:

    1. 导航到 Cloud Run 控制台
    2. 选择“myservice”列表,然后点击删除
    3. 在确认对话框中点击删除
  2. 删除在本教程中创建的其他 Google Cloud 资源:

删除教程配置

如需清理 GitHub 中的配置,您需要从 GitHub 中移除 Google Cloud Build 应用:

  1. 导航到 GitHub 应用设置
  2. Google Cloud Build 列表中,点击配置
  3. 危险地区部分,点击卸载
  4. 在确认对话框中点击确定

您还需要删除创建的 GitHub 令牌:

  1. 导航到 GitHub 个人访问令牌页面。
  2. preview-deploy 列表中,点击 Delete
  3. 在确认对话框中,点击我了解,删除此令牌

您还需要删除 GitHub 代码库:

  1. 导航至您创建的 GitHub 代码库,然后点击“设置”标签页。
  2. 危险地区部分中,点击删除此代码库
  3. 在确认对话框中,输入代码库的全名,然后点击我了解后果,删除此代码库

后续步骤