配置部署预览


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

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

目标

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

费用

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

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

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Run, Cloud Build, and Secret Manager APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Cloud Run, Cloud Build, and Secret Manager APIs.

    Enable the APIs

所需的角色

如需获得完成本教程所需的权限,请让您的管理员为您授予项目的以下 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. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

删除教程资源

  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. 在确认对话框中,输入代码库的全名,然后点击我了解后果,删除此代码库

后续步骤