Help us learn about your current experience with the documentation. Take the survey.

定时流水线执行策略

  • Tier: Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
  • Status: Experiment

此功能的可用性由功能标志控制。 有关更多信息,请查看历史记录。此功能可用于测试,但尚未准备好用于生产环境。

流水线执行策略会在项目的流水线中强制执行自定义 CI/CD 作业。通过定时流水线执行策略,您可以扩展这种强制执行,以固定节奏(每日、每周或每月)运行 CI/CD 作业,确保即使没有新的提交,合规脚本、安全扫描或其他自定义 CI/CD 作业也能被执行。

安排您的流水线执行策略

与在现有流水线中注入或覆盖作业的常规流水线执行策略不同,定时策略会创建新的流水线,这些流水线根据您定义的独立运行。

常见用例包括:

  • 定期执行安全扫描以满足合规要求。
  • 定期检查项目配置。
  • 对非活跃仓库运行依赖项扫描,以检测新发现的漏洞。
  • 按计划执行合规报告脚本。

启用定时流水线执行策略

定时流水线执行策略作为实验性功能提供。要在您的环境中启用此功能,请在安全策略配置中启用 pipeline_execution_schedule_policy 实验。.gitlab/security-policies/policy.yml YAML 配置文件存储在您的安全策略项目中:

experiments:
  pipeline_execution_schedule_policy:
    enabled: true

此功能是实验性的,未来版本可能会更改。您应该仅在非生产环境中对其进行彻底测试。由于此功能可能不稳定,您不应在生产环境中使用它。

配置定时流水线执行策略

要配置定时流水线执行策略,请在安全策略项目的 .gitlab/security-policies/policy.yml 文件的 pipeline_execution_schedule_policy 部分添加额外的配置字段:

pipeline_execution_schedule_policy:
- name: 定时流水线执行策略
  description: ''
  enabled: true
  content:
    include:
    - project: your-group/your-project
      file: security-scan.yml
  schedules:
  - type: daily
    start_time: '10:00'
    time_window:
      value: 600
      distribution: random

计划配置架构

schedules 部分允许您配置安全策略作业何时自动运行。您可以创建具有特定执行时间和分发窗口的每日、每周或每月计划。

计划配置选项

schedules 部分支持以下选项:

参数 描述
type 计划类型:dailyweeklymonthly
start_time 开始计划的 24 小时制时间(HH:MM)
time_window 分发流水线执行的时间窗口
time_window.value 持续时间(秒)(最小值:600,最大值:2629746)
time_window.distribution 分发方法(目前仅支持 random
timezone IANA 时区标识符(如果未指定,默认为 UTC)
branches 可选数组,包含要安排流水线的分支名称。如果指定了 branches,则流水线仅在指定的分支上运行,并且仅当这些分支存在于项目中时。如果未指定,则流水线仅在默认分支上运行。每个计划最多可提供五个唯一的分支名称。
days 仅与每周计划一起使用:计划运行的日期数组(例如 ["Monday", "Friday"]
days_of_month 仅与每月计划一起使用:计划运行的日期数组(例如 [1, 15],可以包含 1 到 31 的值)
snooze 可选配置,用于暂时暂停计划
snooze.until 休眠后计划恢复的 ISO8601 日期和时间(格式:2025-06-13T20:20:00+00:00
snooze.reason 可选文档,解释为何休眠该计划

计划示例

使用每日、每周或每月计划。

每日计划示例

schedules:
  - type: daily
    start_time: "01:00"
    time_window:
      value: 3600  # 1 小时窗口
      distribution: random
    timezone: "America/New_York"
    branches:
      - main
      - develop
      - staging

每周计划示例

schedules:
  - type: weekly
    days:
      - Monday
      - Wednesday
      - Friday
    start_time: "04:30"
    time_window:
      value: 7200  # 2 小时窗口
      distribution: random
    timezone: "Europe/Berlin"

每月计划示例

schedules:
  - type: monthly
    days_of_month:
      - 1
      - 15
    start_time: "02:15"
    time_window:
      value: 14400  # 4 小时窗口
      distribution: random
    timezone: "Asia/Tokyo"

时间窗口分发

为了在将策略应用于多个项目时避免压垮您的 CI/CD 基础设施,定时流水线执行策略通过一些通用规则,在时间窗口内分发流水线的创建:

  • 所有流水线都按 random 计划。流水线在指定的时间窗口内随机分布。
  • 最小时间窗口为 10 分钟(600 秒),最大约为 1 个月(2,629,746 秒)。
  • 对于每月计划,如果您指定了某些月份不存在的日期(如 2 月的 31 日),这些运行将被跳过。
  • 一个定时策略一次只能有一个计划配置。

休眠定时流水线执行策略

您可以使用休眠功能暂时暂停定时流水线执行策略。在维护窗口、假期期间,或者您需要阻止定时流水线在特定时间段运行时,请使用休眠功能。

休眠工作原理

当您休眠一个定时流水线执行策略时:

  • 在休眠期间不会创建新的定时流水线。
  • 在休眠之前创建的流水线会继续执行。
  • 策略保持启用状态,但处于休眠状态。
  • 休眠期结束后,定时流水线执行会自动恢复。

配置休眠

要休眠定时流水线执行策略,请在计划配置中添加一个 snooze 部分:

pipeline_execution_schedule_policy:
- name: 每周安全扫描
  description: '每周运行安全扫描'
  enabled: true
  content:
    include:
    - project: your-group/your-project
      file: security-scan.yml
  schedules:
  - type: weekly
    start_time: '02:00'
    time_window:
      value: 3600
      distribution: random
    timezone: UTC
    days:
      - Monday
    snooze:
      until: "2025-06-26T16:27:00+00:00"  # ISO8601 格式
      reason: "关键生产环境部署"

until 参数使用 ISO8601 格式指定休眠期何时结束:YYYY-MM-DDThh:mm:ss+00:00,其中:

  • YYYY-MM-DD:年、月、日
  • T:日期和时间之间的分隔符
  • hh:mm:ss:24 小时制的小时、分钟和秒
  • +00:00:与 UTC 的时区偏移(UTC 用 Z 表示)

例如,2025-06-26T16:27:00+00:00 表示 2025 年 6 月 26 日下午 4:27 UTC。

移除休眠

要在到期时间之前移除休眠,请从策略配置中移除 snooze 部分,或将 until 值设置为过去的日期。

为特定分支安排流水线

默认情况下,计划仅在默认分支上运行。定时流水线执行策略支持分支过滤,这允许您为其他分支安排流水线。使用 branches 属性对项目中的其他重要分支执行定期扫描或检查。

当您在计划中配置 branches 属性时:

  • 如果您没有指定任何分支,则定时流水线仅在默认分支上运行。
  • 如果您指定了分支,则策略会为项目中实际存在的每个指定分支安排流水线。
  • 每个计划最多可指定五个唯一的分支名称。
  • 您必须完整指定每个分支名称。不支持通配符匹配。

分支过滤示例

pipeline_execution_schedule_policy:
- name: 扫描多个分支
  description: '在 main、staging 和 develop 分支上运行安全扫描'
  enabled: true
  content:
    include:
    - project: your-group/your-project
      file: security-scan.yml
  schedules:
  - type: weekly
    days:
      - Monday
    start_time: '02:00'
    time_window:
      value: 3600
      distribution: random
    branches:
      - main
      - staging
      - develop
      - feature/new-authentication

在此示例中,如果所有指定的分支都存在于项目中,则策略会创建四个独立的流水线(每个分支一个)。

要求

要使用定时流水线执行策略:

  1. 将您的 CI/CD 配置存储在您的安全策略项目中。
  2. 在您的安全策略项目的 设置 > 常规 > 可见性、项目功能、权限 部分,启用 授予安全策略项目访问 CI/CD 配置 的设置。
  3. 确保您的 CI/CD 配置包含适用于定时流水线的工作流规则。

安全策略机器人是 GitLab 自动创建的系统账户,用于处理安全策略的执行。当您启用适当的设置时,该机器人会获得访问 CI/CD 配置和运行定时流水线的必要权限。仅当 CI/CD 配置不在公共项目中时,这些权限才是必需的。

注意以下限制:

  • 如果未指定分支,定时流水线执行策略仅在默认分支上运行。
  • 您可以在 branches 数组中指定最多五个唯一的分支名称。
  • 时间窗口必须至少为 10 分钟(600 秒),以确保流水线正确分发。
  • 每个安全策略项目的定时流水线执行策略数量限制为 1 个策略和 1 个计划。
  • 此功能是实验性的,未来版本可能会更改。
  • 如果可用的 runner 不足,定时流水线可能会延迟。
  • 计划的最大频率为每日。

故障排除

如果您的定时流水线未按预期运行,请按照以下故障排除步骤操作:

  1. 验证实验标志:确保您的 policy.yml 文件的 experiments 部分设置了 pipeline_execution_schedule_policy: enabled: true 标志。
  2. 检查策略访问权限:验证您的安全策略项目是否有权访问 CI/CD 配置:
    • 转到安全策略项目的 设置 > 常规 > 可见性、项目功能、权限,并确保启用了"流水线执行策略"设置。
  3. 验证 CI 配置
    • 检查 CI/CD 配置文件是否存在于指定路径。
    • 通过运行手动流水线验证配置是否有效。
    • 确保配置包含适用于定时流水线的工作流规则。
  4. 验证策略配置
    • 确保策略已启用(enabled: true)。
    • 验证计划配置具有正确的格式和有效值。
    • 如果您指定了分支,请验证这些分支是否存在于项目中。
    • 验证时区设置是否正确(如果已指定)。
  5. 检查日志和活动
    • 检查安全策略项目的 CI/CD 流水线日志是否有任何错误。
  6. 检查 runner 可用性
    • 确保 runner 可用且配置正确。
    • 验证 runner 是否有容量处理计划的任务。