使用政策限制部署行为

本文档介绍了如何使用部署政策来限制手动或自动化交付流水线操作。

部署政策是一种 Cloud Deploy 资源,可用于限制针对所选交付流水线或目标(或所有流水线或目标)执行的手动或自动操作。

可以限制哪些行为?

您可以创建部署政策,以限制或阻止 Cloud Deploy 对发布执行某些操作。例如,某项政策可以禁止在指定时间段内为给定的交付流水线创建发布。例如,您可以使用此属性来设置季节性限制。

政策的评估和执行方式

对于任何手动或自动操作,Cloud Deploy 都会执行以下操作:

  1. 检查 Identity and Access Management 权限。

    如果用户账号或服务账号没有足够的 IAM 权限,则不会执行相应操作,也无需评估部署政策。

  2. 检查目标或投放流水线是否存在适用政策,如果存在,则评估该政策。

    • Cloud Deploy 会评估所采取的操作,以确定此规则是否适用。

      也就是说,操作类型和调用方是否与政策匹配?

    • Cloud Deploy 会检查为政策定义的日期和时间范围,以确定该政策在请求时是否有效。

    • 如果相应政策有效,并且相应规则适用于交付流水线或目标和操作,则系统会强制执行该规则并阻止相应操作。

要求和限制

  • 每项政策都必须至少包含一个选择器。

  • 每项政策都必须至少包含一条规则。

    所有规则 ID 在部署政策中都必须是唯一的。

  • 每条规则都必须至少包含一个 timeWindows,并且在该 timeWindows 中必须包含 oneTimeWindowsweeklyWindows

    如需详细了解如何使用时间块,请参阅日期和时间

  • 每个项目/位置最多只能有 1000 个部署政策。

所需的 Identity and Access Management 角色和权限

除了运行任何 Cloud Deploy 交付流水线以及执行受政策限制的任务所需的权限之外,您还需要以下几项权限才能对政策资源执行某些操作:

  • clouddeploy.deployPolicies.create
  • clouddeploy.deployPolicies.delete
  • clouddeploy.deployPolicies.get
  • clouddeploy.deployPolicies.list
  • clouddeploy.deployPolicies.update
  • clouddeploy.deployPolicies.override

这些权限包含在 roles/clouddeploy.policyAdmin 角色中。此外,roles/clouddeploy.policyOverrider 角色还包含 .override 权限。

创建部署政策

创建 deploy-policy 资源包括以下步骤:

  1. 创建包含部署政策配置的 YAML 文件。

    配置包含一个标头,用于将资源标识为部署政策。name 是必需的。

     apiVersion: deploy.cloud.google.com/v1
     kind: DeployPolicy
     metadata:
       name: 
     description: 
    
  2. 添加对政策适用的交付流水线和目标(即 selectors)的引用。

    如需详细了解政策选择器以及如何配置政策选择器,请参阅部署政策选择器配置架构参考文档

  3. 添加一项或多项政策 rules

    每条规则都描述了一项限制以及强制执行该限制的情况。如需详细了解政策规则以及如何配置这些规则,请参阅部署政策规则配置架构参考文档

  4. 应用该文件以创建政策:

    gcloud deploy apply --file=FILENAME \
                         --region=REGION \
                         --project=PROJECT_ID
    

    其中,FILENAME 是包含 DeployPolicy 定义的 YAML 文件的名称,REGION 是您要创建部署政策资源的区域,PROJECT_ID 是您要创建资源的项目。

现在,系统会根据 deploy-policy 资源中的规则来限制所引用的交付流水线或目标。

部署政策选择器

部署政策配置中定义的 selector 用于确定指定规则会影响哪些交付流水线和目标。

选择器在部署政策配置的 selectors 段落中定义为顶级属性:

selectors:
- deliveryPipeline:
    id:
    labels:
  target:
    id:
    labels:

在此配置 YAML 中,deliveryPipeline.id 采用交付流水线的名称,target.id 采用目标的名称(在这两种情况下均为 metadata.name)。

您可以使用 id: * 选择所有交付流水线或所有目标。请注意,* 是一个特殊字段值,用于选择所有内容,不支持任意通配符。您还可以使用标签来匹配交付流水线或目标,或者同时匹配两者。

在给定的选择器中,各项之间通过 AND 组合。多个选择器之间采用 OR 关系。 也就是说,如果某项政策要限制某个给定请求,则该政策必须至少适用于一个选择器。但在该选择器中,请求必须与所有项匹配。

部署政策规则

每项部署政策都包含一项或多项政策规则,用于定义在所选交付流水线或目标中限制哪些操作。该规则还定义了在何种情况下应用该规则。

您可以使用以下规则:

  • rolloutRestriction

rolloutRestriction 规则可防止对所选交付流水线使用的所选目标执行指定的发布操作。此规则使用一个时间窗口来定义何时无法为所选交付流水线和目标创建发布。如需了解如何在部署政策规则中指定日期和时间,请参阅日期和时间

在规则生效期间,可以限制以下操作:

  • ADVANCE

    发布阶段无法推进

  • APPROVE

    无法批准发布促销活动

  • CANCEL

    发布作业无法取消

  • CREATE

    无法创建发布作业。如果某项政策阻止了此操作,您可以创建版本,但该版本不会启动发布。

  • IGNORE_JOB

    作业无法忽略

  • RETRY_JOB

    作业无法重试

  • ROLLBACK

    发布无法回滚

  • TERMINATE_JOBRUN

    作业运行无法终止

    如需了解此规则的 YAML 结构,请参阅配置架构参考

rolloutRestriction 规则中的日期和时间

您可以配置日期和时间块,以指定部署政策生效期间的重复和非重复时间窗口。

以下是表达日期和时间的要求:

  • 日期以 yyyy-mm-dd 格式表示。

  • 在表达一天中的时间时,一天的开始时间为 00:00,结束时间为 24:00

  • 对于 oneTimeWindows,日期必须包含时间。对于 weeklyWindows,您可以省略时间。但是,如果您添加 startTime,则必须添加 endTime,反之亦然。

    例如,仅在周日暂停的设置如下所示:

    - daysOfWeek: [SUNDAY]
      startTime: "00:00"
      endTime: "24:00"
    

    您还可以执行以下操作:

    - daysOfWeek: [SUNDAY]
    

    但不能是以下内容:

    - daysOfWeek: [SUNDAY]
      startTime: "00:00"
    
  • 您必须在 timeWindows stanza 中添加时区。

    例如:timeZone: America/New_York

非重复时间窗口

非重复时间窗口在特定日期和时间开始和结束。您可以使用此参数来限制任何时间段的发布。

使用 oneTimeWindows 节配置非重复时间窗口。

重复时间窗口

重复性时间窗口是指您希望限制发布的时间段,该时间段会重复出现。例如,您可以使用此功能来限制周末的发布。

重复时间窗口使用 weeklyWindows stanza 进行配置。

示例

本部分包含一些示例,说明如何使用日期和时间来配置部署政策的强制执行时间。

年度冻结

如果您希望在一年中的某个时间段内冻结发布,可以配置 oneTimeWindows 块来实现此目的。如果日期每年都一样,您仍然需要使用多个 oneTimeWindow 块。

以下 YAML 显示了一个一次性(非重复)时间窗口,用于强制执行年度冻结的部署政策:

timeWindows:
  timeZone: "America/New_York"
  oneTimeWindows:
  - start: "2024-12-22 17:00"
    end: "2025-01-02 09:00"

此 YAML 描述的时间窗口从 2024 年 12 月 22 日下午 5 点开始,到 2025 年 1 月 2 日上午 9 点结束。

周末重复冻结

以下 YAML 显示了一个重复的时间窗口,用于强制执行一项部署政策,该政策限制在周末(从周五下午 5 点到周一上午 9 点)进行发布:

timeWindows:
  timeZone: "America/New_York"
  weeklyWindows:
  - daysOfWeek: [FRIDAY]
    startTime: "17:00"
    endTime: "24:00"
  - daysOfWeek: [SATURDAY, SUNDAY]
    startTime: "00:00"
    endTime: "24:00"
  - daysOfWeek: [MONDAY]
    startTime: "00:00"
    endTime: "09:00"

更新部署政策

更新部署政策包括以下步骤:

  1. 修改政策配置 YAML。

    如果您使用 Google Cloud 控制台创建了政策,则可以在部署政策详情页面上选择 YAML 标签页来获取 YAML 配置。然后,您可以将该文本复制到本地文件并进行修改。

  2. 应用该文件以更新政策:

    gcloud deploy apply --file=FILENAME \
                         --region=REGION \
                         --project=PROJECT_ID
    

    这会使用新配置更新部署政策资源。

由于部署政策会在尝试执行受限操作时进行评估,因此针对所有 Cloud Deploy 资源的所有此类操作都将受更新后的政策约束。也就是说,之前限制的任何残留部分都不存在。 例如,如果您在 12 月整月都设置了 restrictRollouts 限制,然后在 12 月 14 日更新了政策,将限制结束日期改为 12 月 15 日,那么在 12 月 15 日之后,发布将不再受限。

覆盖部署政策

如有必要,您可以替换部署政策。例如,如果生产环境中的部署存在问题,您需要将其回滚,但部署政策禁止任何发布,您可以替换该政策,以便回滚不良发布。

如需替换部署政策,您必须拥有 clouddeploy.deployPolicies.override IAM 权限。

您可以通过 gcloud CLI 或使用Google Cloud 控制台替换政策:

控制台

  1. 在 Google Cloud 控制台中,尝试执行受政策阻止的操作。

    系统会显示一个对话框,指明相应操作已被部署政策阻止。此对话框包含指向阻止此操作的具体政策的链接。

  2. 在提供的文本字段中,输入政策的名称,然后点击 Attempt to override policies

    如果您有权限覆盖政策,Cloud Deploy 现在会执行相应操作。

gcloud CLI

如需使用 gcloud CLI 替换部署政策,请向命令添加 --override-deploy-policies,以针对该政策会阻止的任何操作执行命令。例如,以下命令会提升版本,并替换原本会阻止提升的特定部署政策:

 gcloud deploy releases promote --release=my-release-001 \
   --project=my-policy-testing-project \
   --region=us-central1 \
   --delivery-pipeline=my-pipeline \
   --to-target=prod-target \
   --override-deploy-policies=my-deploy-policy

删除部署政策

如需删除部署政策,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,前往 Cloud Deploy 部署政策页面。

    打开“部署政策”页面

    此页面会列出当前项目中的可用部署政策(如有)。

  2. 选择要删除的政策对应的 操作按钮,然后点击删除部署政策

  3. 输入部署政策名称以确认删除,然后点击确认

    相应政策现已删除,您现在可以执行该政策限制的任何操作。

gcloud CLI

如需使用 gcloud CLI 删除部署政策,请运行以下命令:

 gcloud deploy deploy-policies delete \
    --project=[PROJECT] \
    --region=[REGION] \
    [POLICY_NAME]

替换以下内容:

  • [POLICY_NAME]

    政策的名称,如政策配置文件中所定义。

  • [PROJECT]

    您在其中创建部署政策的 Google Cloud 项目的项目 ID。

  • [REGION]

    您创建部署政策的区域。

删除部署政策资源后,受影响的交付流水线和目标将不再受该政策的约束,除非受到其他部署政策的影响,否则不会受到限制。

部署政策的日志记录

评估部署政策时,系统会针对以下操作创建平台日志条目:

  • 政策评估

    当请求在评估时违反政策时,系统会写入平台日志。如果请求违反了政策,但因政策被暂停或被替换而获准,系统也会写入日志。当请求获得授权时,系统不会写入任何日志,因为未违反任何政策。

  • 在部署政策资源发生更改时,Pub/Sub 通知失败。

后续步骤