使用自定义限制条件管理 Cloud Build 资源

借助组织政策服务,您可以通过集中式、程序化 组织资源的控制作为组织政策管理员,您可以定义组织政策,这是一组称为限制条件的限制,会应用于 Google Cloud 资源层次结构中的 Cloud Build 资源及其后代。您可以在组织、文件夹或项目级强制执行组织政策。

组织政策服务为各种 Cloud Build 服务提供预定义限制条件。但是,如果您想要更精细地控制和自定义组织政策中受限的特定字段,还可以创建自定义组织政策。

优势

您可以使用自定义组织政策来允许或拒绝特定的 Cloud Build 资源。例如,如果 创建或更新构建触发器的请求无法满足 自定义限制条件验证 请求将失败,并向调用方返回错误。

政策继承

如果您对资源强制执行政策,默认情况下,该资源的后代会继承组织政策。例如,如果您强制执行政策 那么 Cloud Build 会对该文件夹中的所有项目强制执行该政策 文件夹中。如需详细了解此行为及其更改方式,请参阅层次结构评估规则

价格

组织政策服务(包括预定义组织政策和自定义组织政策)可免费使用。

准备工作

  1. 设置项目
    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 Build API.

      Enable the API

    5. Install the Google Cloud CLI.
    6. To initialize the gcloud CLI, run the following command:

      gcloud init
    7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

      Go to project selector

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

    9. Enable the Cloud Build API.

      Enable the API

    10. Install the Google Cloud CLI.
    11. To initialize the gcloud CLI, run the following command:

      gcloud init
    12. 确保您知道自己的 组织 ID

所需的角色

如需获取管理组织政策所需的权限, 请让管理员授予您 组织资源的 Organization Policy Administrator (roles/orgpolicy.policyAdmin) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

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

您还需要在您的用户账号中添加创建 Cloud Build 所需的角色。请参阅配置对 Cloud Build 资源的访问权限。如需详细了解与 Cloud Build 关联的 IAM 角色,请参阅 IAM 角色和权限

创建自定义限制条件

您可以使用 YAML 文件定义受限制条件约束的资源、方法、条件和操作,从而创建自定义限制条件。这些设置特定于您要强制执行组织政策的服务。自定义限制条件的条件必须使用通用表达式语言进行定义。请参阅 GitHub 页面,了解 通用表达式语言 (CEL)。如需详细了解如何使用 CEL 构建自定义限制条件中的条件,请参阅创建和管理自定义限制条件的 CEL 部分。

使用以下模板为自定义限制条件创建 YAML 文件:

name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resourceTypes:
- cloudbuild.googleapis.com/RESOURCE_NAME
methodTypes:
- CREATE
- UPDATE
condition: "CONDITION"
actionType: ACTION
displayName: DISPLAY_NAME
description: DESCRIPTION

替换以下内容:

  • ORGANIZATION_ID:您的组织 ID,例如 123456789

  • CONSTRAINT_NAME:新的自定义限制条件的名称。 自定义限制条件必须以 custom. 开头,只能包含大写字母、小写字母或数字,例如 custom.enableBuildTrigger。该字段的长度上限为 70 个字符,不计算前缀(例如 organizations/123456789/customConstraints/custom.allowConstraint)。

  • RESOURCE_NAME:包含要限制的对象和字段的 Cloud Build 资源的名称(而非 URI)。例如 BuildTrigger

  • CONDITION:针对受支持的服务资源的表示法编写的 CEL 条件。此字段的长度上限为 1,000 个字符。 如需详细了解可用于针对其编写条件的资源,请参阅支持的资源。 例如 "resource.github.name.contains('cloudbuild')"

  • ACTION:满足 condition 时要执行的操作。可以是 ALLOWDENY

  • DISPLAY_NAME:限制条件的直观易记名称。 此字段的最大长度为 200 个字符。

  • DESCRIPTION:直观易懂的限制条件说明,在违反政策时显示为错误消息。 此字段的长度上限为 2,000 个字符。

如需详细了解如何创建自定义限制条件,请参阅创建和管理自定义组织政策

设置自定义限制条件

为新的自定义限制条件创建 YAML 文件后,您必须设置该文件 可用于贵组织的组织政策如需设置自定义限制条件,请使用 gcloud org-policies set-custom-constraint 命令:
gcloud org-policies set-custom-constraint CONSTRAINT_PATH
CONSTRAINT_PATH 替换为自定义限制条件文件的完整路径。例如 /home/user/customconstraint.yaml。完成后,您的自定义限制条件将作为组织政策提供 添加到 Google Cloud 组织政策列表中。 如需验证自定义限制条件是否存在,请使用 gcloud org-policies list-custom-constraints 命令:
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
ORGANIZATION_ID 替换为您的组织资源的 ID。 如需了解详情,请参阅查看组织政策

强制执行自定义组织政策

如需强制执行布尔值限制条件,您可以创建引用该限制条件的组织政策,然后将该组织政策应用于 Google Cloud 资源。

控制台

  1. 在 Google Cloud 控制台中,转到组织政策页面。

    转到“组织政策”

  2. 在项目选择器中,选择要设置组织政策的项目。
  3. 组织政策页面的列表中选择要查看的限制条件 该限制条件的政策详情页面。
  4. 如需为该资源配置组织政策,请点击管理政策
  5. 修改政策页面,选择覆盖父级政策
  6. 点击添加规则
  7. 强制执行部分中,选择是否要强制执行此组织政策 。
  8. (可选)如需使组织政策成为基于某个标记的条件性政策,请点击添加条件。请注意,如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅使用标记设置组织政策
  9. 如果是自定义限制条件,您可以点击测试更改来模拟此组织政策的效果。如需了解详情,请参阅使用 Policy Simulator 测试组织政策更改
  10. 若要完成并应用组织政策,请点击设置政策。该政策最多需要 15 分钟才能生效。

gcloud

如需创建强制执行布尔值限制条件的组织政策,请创建引用该限制条件的 YAML 政策文件:

      name: projects/PROJECT_ID/policies/CONSTRAINT_NAME
      spec:
        rules:
        - enforce: true
    

请替换以下内容:

  • PROJECT_ID:要对其实施限制条件的项目。
  • CONSTRAINT_NAME:您为自定义限制条件定义的名称。例如,custom.enableBuildTrigger

如需强制执行包含限制条件的组织政策,请运行以下命令:

    gcloud org-policies set-policy POLICY_PATH
    

POLICY_PATH 替换为组织政策 YAML 文件的完整路径。该政策最多需要 15 分钟才能生效。

测试自定义限制条件

如需测试自定义限制条件,请运行 gcloud 命令来尝试完成该限制条件所阻止的任务。

例如,假设一个约束条件要求 GitHub 触发器名称包含“cloudbuild”。您可以通过使用其他触发器名称运行 gcloud builds triggers create github 命令来测试此约束条件,如以下代码段所示:

gcloud builds triggers create github --name=github-trigger \
    --repo-owner=some-owner \
    --repo-name=some-repo \
    --branch-pattern=main \
    --build-config=cloudbuild.yaml \
    --project=my-project \

输出类似于以下内容:

Operation denied by custom org policies: ["customConstraints/custom.enableBuildTrigger": "GitHub trigger name must include "cloudbuild"."]

Cloud Build 支持的资源和操作

以下 Cloud Build 自定义限制条件字段 创建或更新 Cloud Build 资源时可用的模板。

请注意,系统不会对由触发器触发的 build 强制执行对 build 的限制。

  • Cloud Build BitbucketServerConfig
    • resource.name
    • resource.hostUrl
    • resource.secrets.adminAccessTokenVersionName
    • resource.secrets.readAccessTokenVersionName
    • resource.secrets.webhookSecretVersionName
    • resource.username
    • resource.apiKey
    • resource.peeredNetwork
    • resource.sslCa
    • resource.peeredNetworkIpRange
  • Cloud Build WorkerPool 配置
    • resource.displayName
    • resource.annotations
    • resource.privatePoolV1Config.workerConfig.machineType
    • resource.privatePoolV1Config.workerConfig.diskSizeGb
    • resource.privatePoolV1Config.networkConfig.peeredNetwork
    • resource.privatePoolV1Config.networkConfig.egressOpetion
    • resource.privatePoolV1Config.networkConfig.peeredNetworkIpRange
  • Cloud Build BuildTrigger 配置
    • resource.tags
    • resource.resourceName
    • resource.description
    • resource.name
    • resource.tags
    • resource.triggerTemplate.projectId
    • resource.triggerTemplate.repoName
    • resource.triggerTemplate.branchName
    • resource.triggerTemplate.tagName
    • resource.triggerTemplate.commitSha
    • resource.triggerTemplate.dir
    • resource.triggerTemplate.invertRegex
    • resource.triggerTemplate.substitutions
    • resource.github.owner
    • resource.github.name
    • resource.github.enterpriseConfigResourceName
    • resource.pubsubConfig.topic
    • resource.pubsubConfig.serviceAccountEmail
    • resource.webhookConfig.secret
    • resource.bitbucketServerTriggerConfig.repoSlug
    • resource.bitbucketServerTriggerConfig.projectKey
    • resource.bitbucketServerTriggerConfig.pullRequest.branch
    • resource.bitbucketServerTriggerConfig.pullRequest.commentControl
    • resource.bitbucketServerTriggerConfig.pullRequest.invertRegex
    • resource.bitbucketServerTriggerConfig.push.branch
    • resource.bitbucketServerTriggerConfig.push.tag
    • resource.bitbucketServerTriggerConfig.push.invertRegex
    • resource.gitlabEnterpriseEventsConfig.projectNamespace
    • resource.gitlabEnterpriseEventsConfig.pullRequest.branch
    • resource.gitlabEnterpriseEventsConfig.pullRequest.commentControl
    • resource.gitlabEnterpriseEventsConfig.pullRequest.invertRegex
    • resource.gitlabEnterpriseEventsConfig.push.branch
    • resource.gitlabEnterpriseEventsConfig.push.tag
    • resource.gitlabEnterpriseEventsConfig.push.invertRegex
    • resource.gitlabEnterpriseEventsConfig.gitlabConfigResource
    • resource.disabled
    • resource.substitutions
    • resource.ignoredFiles
    • resource.includedFiles
    • resource.sourceToBuild.uri
    • resource.sourceToBuild.repository
    • resource.sourceToBuild.ref
    • resource.sourceToBuild.repoType
    • resource.sourceToBuild.githubEnterpriseConfig
    • resource.approvalConfig.approvalRequired
    • resource.filter
    • resource.serviceAccount
    • resource.eventType
    • resource.includeBuildLogs
    • resource.repositoryEventConfig.repository
    • resource.repositoryEventConfig.pullRequest.branch
    • resource.repositoryEventConfig.pullRequest.commentControl
    • resource.repositoryEventConfig.pullRequest.invertRegex
    • resource.repositoryEventConfig.push.branch
    • resource.repositoryEventConfig.push.tag
    • resource.repositoryEventConfig.push.invertRegex
  • Cloud Build GitHubEnterpriseConfig 配置
    • resource.name
    • resource.hostUrl
    • resource.appId
    • resource.name
    • resource.webhookKey
    • resource.peeredNetwork
    • resource.secrets.privateKeyVersionName
    • resource.secrets.webhookSecretVersionName
    • resource.secrets.oauthSecretVersionName
    • resource.secrets.oauthClientIdVersionName
    • resource.displayName
    • resource.sslCa

常见使用场景的自定义组织政策示例

下表提供了部分自定义组织政策的语法 可能对您有所帮助:

说明 限制条件语法
仅允许创建监听包含“cloud-builds”的主题的 Pub/Sub 触发器
    name: organizations/ORGANIZATION_ID/customConstraints/custom.enableCloudBuildPubsubTrigger
    resourceTypes:
    - cloudbuild.googleapis.com/BuildTrigger
    methodTypes:
    - CREATE
    condition: "resource.pubsubConfig != null && resource.pubsubConfig.topic.contains('cloud-builds')"
    actionType: ALLOW
    displayName: Enable creating Pub/Sub trigger that listens on topics that contain "cloud-builds".
    description: Only allow creating Pub/Sub trigger that listens on topics that contain "cloud-builds".
  • ORGANIZATION_ID:您的组织 ID,例如 123456789

后续步骤