使用 ScheduledTrigger 运行 Pipelines

TIP

有关 ScheduledTrigger 的架构、动机和设计背景,请参阅 ScheduledTrigger Concepts 页面。

概述

ScheduledTrigger 允许您以类 cron 的节奏执行 TriggerTemplate,而无需依赖入站 webhook。计划的每一次触发都会渲染模板,注入任何静态或基于时间的参数,并创建您定义的 Tekton 资源(例如 PipelineRuns)。本操作指南将引导您完成准备前提条件、编写清单以及端到端验证自动化的过程。

支持的资源类型

ScheduledTrigger 当前支持 TriggerTemplate 中以下 Tekton Pipelines 资源:

建议:对以下资源使用 tekton.dev/v1tekton.dev/v1beta1 仍被接受,但已弃用,未来版本将移除。

资源类型描述
PipelineRunPipeline 运行实例
TaskRunTask 运行实例

典型工作流程

  1. 确认您想要定期运行的 TriggerTemplate(可复用引用或内联规范)。
  2. 决定自动化所需的节奏、时区及任何上下文参数。
  3. 创建一个将模板绑定到计划的 ScheduledTrigger 清单。
  4. 应用清单并监控资源状态/事件,确保执行发生。

基本清单结构

apiVersion: tekton.alaudadevops.io/v1alpha1
kind: ScheduledTrigger
metadata:
  name: nightly-security-scan
spec:
  schedule: "0 2 * * *"                # Cron 表达式
  timeZone: "Asia/Shanghai"            # 可选,默认为控制器时间
  params:                               # 可选的静态/上下文参数
    - name: scan_date
      value: "$(context.date)"
    - name: severity
      value: "high"
  triggerTemplate:
    ref: security-scan-template         # 引用已有的 TriggerTemplate

逐步配置

1. 选择节奏和时区

  • 使用标准 cron 语法(分钟 小时 月中日 月 星期)。示例:15 1 * * 1-5 表示周一至周五的 01:15 运行。
  • spec.timeZone 设置为 Olson 时区字符串(例如 Europe/Paris)。如果省略,控制器使用自身时区。
  • 当业务时间与集群默认时区不同或需考虑夏令时变化时,建议显式指定时区。

2. 指向 TriggerTemplate

您可以通过 spec.triggerTemplate.ref 引用可复用模板,或在 spec.triggerTemplate.spec 内联完整模板。引用有助于多个 ScheduledTrigger 保持同步,内联规范则使每个清单自包含。

3. 传递参数

  • 使用 spec.params 向模板传入静态值($(tt.params.<name>))。上下文占位符(如 $(context.date)$(context.datetime))仅在此处有效。
  • 将这些占位符与自定义参数结合,生成确定性的运行名称、标签或报告分区,然后在模板内引用为 $(tt.params.<name>)
  • 由于 Tekton Trigger 参数为字符串,传递复杂对象(如 JSON)前需序列化。

4. 应用清单

# 替换为您的命名空间和包含 ScheduledTrigger 清单的文件名
kubectl -n <namespace> apply -f <scheduled-trigger-file>

目标命名空间应为 TriggerTemplate 所在位置。Kubernetes RBAC 必须允许控制器解析并执行该模板。

5. 验证资源

# 替换为您的 ScheduledTrigger 名称和命名空间
kubectl get scheduledtrigger <scheduled-trigger-name> -n <namespace>
# NAME                    AGE
# nightly-security-scan   10s

# 替换为您的 ScheduledTrigger 名称和命名空间
kubectl describe scheduledtrigger <scheduled-trigger-name> -n <namespace>
# Status:
#   Last Schedule Time:  2025-11-25T07:42:00Z
# Events:
#   Type    Reason     Age      From               Message
#   ----    ------     ----     ----               -------
#   Normal  Scheduled  5s       scheduled-trigger  Scheduled security-scan-template for 2025-11-25T07:42:00Z

检查 LAST SCHEDULETIME 列(或 .status.lastScheduleTime 字段)以确认控制器正在触发。通过 kubectl describe 显示的 Kubernetes 事件将指示成功运行或调度错误(例如无效的 cron 表达式或缺失模板)。

如果执行仍未按预期启动,请查看 ScheduledTrigger 故障排查指南 以获取详细调查步骤。

ScheduledTrigger 的长期管理

  • 更新节奏:编辑资源(kubectl edit 或应用新清单)以更改 spec.schedulespec.timeZone。下一次触发将自动重新计算。
  • 轮换参数:修改 spec.params 以更新静态值,如环境名称、功能标志或接收者。
  • 切换模板:将 spec.triggerTemplate.ref 指向新模板,或更新内联规范。后续执行将立即使用新逻辑。
  • 暂停或删除:删除 ScheduledTrigger 以停止未来运行。若需恢复节奏,可稍后使用相同名称重新创建。

内联模板示例

apiVersion: tekton.alaudadevops.io/v1alpha1
kind: ScheduledTrigger
metadata:
  name: refresh-demo-data
spec:
  schedule: "0 */6 * * *"
  params:
    - name: run_timestamp
      value: "$(context.datetime)"
  triggerTemplate:
    spec:
      params:
        - name: target_cluster
          default: "demo"
        - name: run_timestamp
          description: Timestamp passed from ScheduledTrigger
      resourcetemplates:
        - apiVersion: tekton.dev/v1
          kind: PipelineRun
          metadata:
            generateName: refresh-demo-
          spec:
            pipelineRef:
              name: refresh-pipeline
            params:
              - name: cluster
                value: "$(tt.params.target_cluster)"
              - name: timestamp
                value: "$(tt.params.run_timestamp)"

支持时区的每周示例

apiVersion: tekton.alaudadevops.io/v1alpha1
kind: ScheduledTrigger
metadata:
  name: monday-report
spec:
  schedule: "0 9 * * 1"
  timeZone: "America/New_York"
  params:
    - name: report_date
      value: "$(context.date)"
  triggerTemplate:
    ref: weekly-report-template

参考链接