使用政策限制部署行为

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

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

哪些行为可以受到限制?

您可以创建部署政策,以限制或禁止 Cloud Deploy 对发布版本执行特定操作。例如,政策可以阻止在指定时间段内为给定交付流水线创建发布。例如,您可以将其用于季节性限制。

如何评估和强制执行政策

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

  1. 检查 Identity and Access Management 权限。

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

  2. 检查是否有适用于目标或提交流水线的政策,如果有,则对该政策进行评估。

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

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

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

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

要求和限制

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

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

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

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

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

  • 每个项目/位置的部署政策不得超过 1,000 个。

所需的 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 --filename= 创建资源,然后应用该文件。

现在,系统会根据部署政策资源中的规则限制所引用的交付流水线或目标。

部署政策选择器

选择器在部署政策配置中定义,用于确定给定规则会影响哪些交付流水线和目标。

选择器在部署政策配置的 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 诗节中添加时区。

    例如:timeZone: America/New_York

非重复时间窗口

非重复时间范围的开始和结束日期/时间是固定的。您可以将此时间范围用于任何您想要限制发布时间的范围。

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

重复时间范围

重复性时间段用于描述您希望限制发布时间的重复性时间块。例如,您可以使用此功能限制周末的发布。

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

示例

本部分包含一些使用日期和时间来配置部署政策生效时间的示例。

年度冻结

如果您想在一年中的某个时间冻结发布,可以配置 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 --filename= 应用该文件。

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

由于系统会在尝试执行受限操作时评估部署政策,因此对所有 Cloud Deploy 资源执行的所有此类操作都受更新后的政策约束。也就是说,之前的限制不会保留。例如,如果您在整个 12 月都设置了 restrictRollouts 屏蔽,并在 12 月 14 日更新了政策,使限制在 12 月 15 日结束,那么在 12 月 15 日之后,系统将不再屏蔽发布。

覆盖部署政策

如有必要,您可以替换部署政策。例如,如果生产环境中的部署出现问题,您需要回滚该部署,但有部署政策阻止任何部署,您可以替换该政策,以回滚有问题的部署。

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

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

控制台

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

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

  2. 在提供的文本字段中,输入相应政策的名称,然后点击尝试替换政策

    如果您有权替换该政策,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 通知失败。

后续步骤