自动执行构建以响应网络钩子事件

通过 Cloud Build,您可以定义 Webhook 触发器,这些触发器可以 对传入的 Webhook 事件进行身份验证并接受这些事件。将这些事件发送到自定义网址后,您可以通过 Webhook 事件将外部系统和外部源代码管理系统(如 Bitbucket.com、Bitbucket Server 或 GitLab)直接连接到 Cloud Build。

使用 Webhook 触发器,您可以在创建触发器时定义内嵌 build 配置 文件,而不是指定源代码。通过内嵌 build 配置,您可以控制 Git 操作并定义构建的其余部分。

本页面概述了如何创建 Webhook 触发器,以自动执行构建来响应 Webhook 事件。

准备工作

  • 启用 Cloud Build 和 Secret Manager API。

    启用 API 所需的角色

    如需启用 API,您需要拥有 Service Usage Admin IAM 角色 (roles/serviceusage.serviceUsageAdmin),该角色包含 serviceusage.services.enable 权限。了解如何授予 角色

    启用 API

  • 如需使用此页面上的 gcloud 命令,请安装 Google Cloud CLI

  • 如果您的 Webhook 触发器使用 Cloud Build 代码库作为来源, 请确保您熟悉 Cloud Build 代码库

创建 Webhook 触发器

控制台

如需使用 Google Cloud 控制台创建 Webhook 触发器,请执行以下操作:

  1. 打开触发器 页面:

    打开“构建触发器”页面

  2. 从页面顶部选择您的项目,然后点击打开

  3. 点击创建触发器

  4. 输入以下触发器设置:

    • 名称:触发器的名称。
    • 区域:为触发器选择区域

      • 如果与触发器关联的构建配置文件指定了 专用池,则 Cloud Build 会使用专用池来运行构建。在这种情况下,您在触发器中指定的区域必须与您创建专用池的区域一致。
      • 如果与触发器关联的构建配置文件 指定专用池,则 Cloud Build 会使用默认 池在与触发器相同的区域中运行构建。
    • 说明 (可选):触发器的说明。

    • 事件:选择 Webhook 事件 以设置触发器启动 构建来响应传入的 webhook 事件。

    • 网络钩子网址:使用网络钩子网址对传入的 网络钩子事件进行身份验证。您需要使用 Secret 对传入的 Webhook 事件进行身份验证。您可以创建新的 Secret,也可以使用现有 Secret。此 Secret 与关联到 SSH 密钥的 Secret 不同。

      如需创建 Secret,请执行以下操作:

      1. 选择使用由 Cloud Build 生成的新密钥
      2. 点击创建密钥

        您将看到创建 Webhook Secret 对话框。

      3. Secret 名称 字段中,输入 Secret 名称。

      4. 点击创建 Secret 以保存您的 Secret,系统将自动在 Secret Manager 中创建并存储该 Secret。

      如需使用现有 Secret,请执行以下操作:

      1. 选择使用现有的密钥或创建自己的密钥
      2. Secret 字段中,从下拉菜单选择要使用的 Secret 的名称,或者按照说明通过资源 ID 添加 Secret。
      3. Secret 版本字段中,从下拉菜单选择您的 Secret 版本。

        如果您使用现有 Secret,则可能需要手动向您的 Cloud Build 服务帐号 service-${PROJECT_NUMBER}@gcp-sa-cloudbuild.iam.gserviceaccount.com 授予 Secret Manager Secret Accessor 角色。如需了解详情,请参阅 向您的服务账号授予 Secret Manager 角色

        创建或选择 Secret 后,您将看到 网络钩子网址预览 。您的网址将包含由 Cloud Build 生成的 API 密钥和您的密钥。如果 Cloud Build 无法检索 API 密钥,您可以手动将 API 密钥 添加到网址,或者了解如何 获取 API 密钥(如果没有)。

        借助网址,您可以使用 POST 方法发出 HTTP 请求来调用网络钩子事件

        完成这些步骤后,系统会自动向您的 Cloud Build 服务代理 service-${PROJECT_NUMBER}@gcp-sa-cloudbuild.iam.gserviceaccount.com 授予 Secret Manager Secret Accessor 角色。 如果您未看到此角色 自动添加到您的服务代理,请完成 向您的服务账号授予 Secret Manager 角色 中所述的步骤

    • 来源 (可选):如果您要指定内嵌构建配置,则无需指定来源。否则,请执行以下操作:

      • 代码库世代:选择 第 2 代

      • 代码库:从可用代码库列表中,选择要从中构建的 代码库。代码库的区域必须与触发器的区域一致。

      • 分支标记:指定要匹配分支或 标记值的正则表达式。如需了解可接受的正则表达式语法, 请参阅 RE2 语法

      • 评论控制:如果您选择了拉取请求 作为您的事件,请选择以下选项之一来 控制触发器是否会自动调用构建:

        • 必需(所有者和协作者除外):代码库所有者或协作者创建或更新拉取 请求后,系统会自动运行 构建。如果外部贡献者发起操作,则只有在所有者或协作者对拉取请求中的 /gcbrun 添加注释之后,系统才会运行构建。

        • 必需:任何 贡献者创建或更新拉取请求后,只有在所有者或 协作者对拉取请求中的 /gcbrun 添加注释之后,系统才会运行构建。每次对拉取请求进行更改时,系统都会运行构建。

        • 不需要:任何 贡献者创建或更新拉取请求后,系统会自动运行构建。

    • 配置:选择位于 远程代码库中的构建配置文件,或创建要用于构建的内嵌构建配置文件。如果您未指定源代码库,则必须选择内嵌 构建配置文件作为配置选项:

      • 类型:选择要用于构建的配置类型。

        • Cloud Build 配置文件(yaml 或 json):为您的配置使用构建配置文件。
        • Dockerfile:为您的配置使用 Dockerfile
        • Buildpack:为您的配置使用 buildpack
      • 位置:为您的配置指定位置。

        • 代码库:如果您的配置文件位于 远程代码库中,请提供 构建配置文件的位置、Dockerfile 目录或 buildpack 目录。如果您的构建配置类型是 Dockerfile 或 buildpack,则需要为生成的映像提供名称,还需要视情况提供构建的超时时间。提供了 Dockerfile 或 buildpack 映像名称后,您会看到您的构建将运行的 docker buildpack 命令的预览。
        • Buildpack 环境变量 (可选):如果您选择了 buildpacks 作为配置类型,请点击添加软件包环境变量 以指定 buildpack 环境变量和值。如需详细了解 buildpack 环境变量,请参阅环境变量
        • 内嵌:如果您选择了 Cloud Build 配置文件(yaml 或 json)作为 配置选项,则可以指定内嵌构建配置。点击打开编辑器 ,使用 YAML 或 JSON 语法在 Google Cloud 控制台中编写您的构建配置文件。点击完成 以保存您的构建配置。

      在以下示例中,内嵌构建配置文件记录了回显“hello world”:

       steps:
       - name: 'ubuntu'
         args: ['echo', 'hello world']
      
    • 替代变量(可选):如果您选择了构建配置文件作为构建配置选项或创建了内嵌构建配置文件,则可以使用此字段选择定义特定于触发器的替代变量。您还可以在定义 替代变量值时使用载荷绑定来获取数据。

    • 过滤条件 (可选):您可以在触发器中创建一项规则,用于确定触发器是否会根据替代变量运行构建。

  5. 点击创建 以创建构建触发器。

gcloud

如需创建 Webhook 触发器,请执行以下操作:

gcloud builds triggers create webhook \
  --trigger-config=TRIGGER_CONFIG_PATH \
  --name=TRIGGER_NAME \
  --description=DESCRIPTION \
  --region=REGION \
  --secret=projects/PROJECT_ID/secrets/SECRET_NAME/versions/SECRET_VERSION \
  --service-account=SERVICE_ACCOUNT \ 
  --repository=projects/PROJECT_ID/locations/REGION/connections/CONNECTION_NAME/repositories/REPO_NAME \ 
  --build-config=PATH_TO_BUILD_CONFIG \
  --inline-config=PATH_TO_INLINE_BUILD_CONFIG \
  --dockerfile=DOCKERFILE \
  --dockerfile-dir=DOCKERFILE_DIR \
  --dockerfile-image=DOCKERFILE_IMAGE \
  --tag=TAG_NAME \
  --branch=BRANCH_NAME \
  --substitutions=_SUB_ONE=SUBSTITUTION \
  --subscription-filter=FILTER \
  --require-approval

其中:

  • TRIGGER_CONFIG_PATH 是触发器配置文件的路径。如果您使用触发器配置文件,则 namedescriptionregionsecretservice-accountsubscription-filtersubstitution 字段必须保持未定义状态。 如需了解详情,请参阅 Cloud Build 参考文档中的 BuildTrigger
  • TRIGGER_NAME 是触发器的名称。
  • DESCRIPTION (可选)是触发器的说明。
  • REGION 是触发器的 区域,用于 您的触发器。此值必须是“global”以外的区域。
  • SECRET_NAME 是存储在 Secret Manager 中的 Secret 的名称。
  • SECRET_VERSION 是与存储在 Secret Manager 中的 Secret 关联的版本。
  • SERVICE_ACCOUNT 是用于运行与构建触发器相关的所有用户控制操作的服务帐号。 如果您未定义服务帐号,Cloud Build 会使用默认的 Cloud Build 服务账号。
  • PROJECT_ID 是您的 Google Cloud 项目 ID。
  • CONNECTION_NAME 是主机连接的名称。
  • REPO_NAME 是代码库的名称。
  • PATH_TO_BUILD_CONFIG 是构建配置文件的路径。如果触发器引用 Cloud Build 代码库中的构建配置文件,请使用此参数。如果您设置了此参数,则无法定义 inline-config 或使用 Dockerfile 的参数。
  • PATH_TO_INLINE_BUILD_CONFIG 是内嵌构建配置的路径。如果触发器引用本地构建配置文件,请使用此参数。如果您设置了此参数,则无法定义 build-config 或使用 Dockerfile 的参数。
  • DOCKERFILE 是 Dockerfile 的路径。如果触发器引用 Dockerfile,请使用此参数。如果您设置了 Dockerfile 参数,则无法定义 build-configinline-config
  • DOCKERFILE_DIR 是 Dockerfile 的目录。
  • DOCKERFILE_IMAGE 是 Cloud Build 构建的 Docker 映像的名称。
  • 如果您想要将触发器设置为基于分支构建,则 BRANCH_NAME 是您的分支的名称。如果您设置了此参数,则无法定义 tag
  • 如果您想要将触发器设置为基于标记构建,则 TAG_NAME 是您的标记的名称。如果您设置了此参数,则无法定义 branch
  • SUBSTITUTION (可选)是要在构建规范中替换的参数。例如, _SUB_ONE='$(body.message.test)',_SUB_TWO='$(body.message.output)'
  • FILTER(可选)是触发器的 CEL 过滤表达式,例如 '_SUB_ONE == "prod"'
  • (可选)如果命令中存在 --require-approval,则 Cloud Build 需要手动批准触发的构建。

调用 Webhook 事件

使用以下命令调用 Webhook 事件:

curl -X POST -H "Content-type: application/json" "https://cloudbuild.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/triggers/${TRIGGER_NAME}:webhook?key=${API_KEY}&secret=${SECRET_VALUE}&trigger=${TRIGGER_NAME}&projectId=${PROJECT_ID}" -d "{}"

(可选)向您的服务帐号授予 Secret Manager 角色

在创建 Webhook 触发器期间配置 Secret 时,在大多数情况下,Cloud Build 会自动向需要该角色的服务账号授予 Secret Manager Secret Accessor 角色。但是,如果您使用现有 Secret,则可能还需要手动向您的 Cloud Build 服务帐号授予 Secret Manager Secret Accessor 角色:

  1. 在 Google Cloud 控制台中打开 IAM 页面:

    打开 IAM 页面

  2. 可选:如需查看 Google 提供的账号,请选中包括 Google 提供的角色授予 复选框。

  3. 记下您要向其授予该角色的构建服务帐号。

  4. 在 Google Cloud 控制台中打开 Secret Manager 页面:

    打开 Secret Manager 页面

  5. 点击您的 Secret 名称。

    您会看到 Secret 详情 页面。

    1. 点击权限 标签页。

    2. 点击授予访问权限

      您将看到授予访问权限 面板。

    3. 添加主账号 部分中,添加与构建服务帐号关联的电子邮件。

    4. 分配角色 部分中,选择 Secret Manager > Secret Manager Secret Accessor

    5. 点击保存

(可选)获取 API 密钥

如需对传入的 Webhook 事件进行身份验证,您需要使用 API 密钥。此 API 密钥是您在配置 Webhook 触发器时选择的 Secret 的一部分。 如果您还没有 API 密钥,或者 Cloud Build 在 控制台中 Google Cloud 配置 Secret 时无法检索到 API 密钥, 则可以手动创建 API 密钥:

要获取 API 密钥,请执行以下操作:

  1. 在 Google Cloud 控制台中打开凭据 页面:

    打开“凭据”页面

  2. 点击创建凭据

  3. 点击 API 密钥

    您会看到一个对话框,其中含有已创建的 API 密钥。记下您的 API 密钥。

  4. 如果您要对产品应用的密钥进行限制,请点击限制密钥,以完成保护密钥的其他步骤。否则,请点击关闭

    如需了解如何限制密钥,请参阅应用 API 密钥限制

后续步骤