StepActions

StepAction 是 Tekton Pipelines 中由 Step 执行的可复用、可编写脚本的工作单元。StepAction 允许你定义容器化操作,并在不同的 Task 之间引用和复用这些操作。

为什么需要 StepAction

传统 Task 面临的挑战

在 StepAction 出现之前,Task 存在一些限制:

  • 可复用性:Task 中定义的 Step 难以轻松提取和复用
  • 可维护性:不同 Task 之间必须重复常见的 Step 逻辑
  • 版本控制:难以将单个 Step 与 Task 分开进行版本控制
  • 一致性:难以确保常见操作的实现保持一致

Tekton 的解决方案

StepAction 通过以下方式应对这些挑战:

  • Step 级别的可复用性:将常见操作封装为可复用组件
  • 声明式定义:将 StepAction 定义为 Kubernetes Custom Resource
  • 参数化:接受参数以自定义行为
  • 结果生成:生成可供其他 Step 使用的结果
  • 资源控制:独立于 Task 定义资源需求

优势

  • 模块化:将复杂操作拆分为可复用组件
  • 一致性:确保不同 Task 中常见操作的实现完全一致
  • 可维护性:只需更新一次 StepAction,所有引用它的 Task 都能受益
  • 清晰性:将执行内容的定义(StepAction)与执行时机(Step)分离
  • 版本控制:独立于 Task 对 StepAction 进行版本控制

场景

StepAction 适用于各种场景,包括:

  • 常见操作:Git clone、镜像构建、安全扫描
  • 标准化工具:Lint 工具、格式化工具、测试运行器
  • 组织特定逻辑:自定义部署流程、审批工作流
  • 共享实用工具:版本生成、配置验证
  • 集成组件:服务交互、API 操作

约束和限制

  • StepAction 只能在 Step 中使用
  • 无法在 Step 之间传递 Step Result
  • 参数不能直接在脚本中使用(必须使用环境变量)
  • StepAction 不能独立运行(不同于 TaskRuns 或 PipelineRuns)
  • 需要将 enable-step-actions feature flag 设置为 "true"

原则

StepAction 执行模型

当 Step 引用 StepAction 时:

  1. Step 提供必要的上下文和参数
  2. StepAction 定义容器镜像和执行逻辑
  3. Step 可以覆盖资源和超时等特定配置
  4. 被引用的 StepAction 执行其定义的命令或脚本
  5. 后续步骤可以使用 StepAction 生成的 Results

引用模型

StepAction 不是 Step 的组成部分,而是:

  • Step 是可以引用 StepAction 的可执行组件
  • Step 提供编排和上下文
  • StepAction 提供可复用逻辑
  • Step 可以引用本地或远程 StepAction

配置示例

基本 StepAction 示例

apiVersion: tekton.dev/v1beta1
kind: StepAction
metadata:
  name: git-clone
spec:
  params:
    - name: url
      type: string
    - name: revision
      type: string
      default: "main"
    - name: depth
      type: string
      default: "1"
  results:
    - name: commit
      description: The commit SHA that was checked out
  image: alpine/git
  script: |
    git clone --depth $(params.depth) --branch $(params.revision) $(params.url) /workspace
    cd /workspace
    echo -n $(git rev-parse HEAD) > $(results.commit.path)

在 Task 中引用 StepAction

apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: build-with-git
spec:
  workspaces:
    - name: source
  params:
    - name: repo-url
      type: string
  steps:
    - name: clone
      ref:
        name: git-clone
      params:
        - name: url
          value: $(params.repo-url)
        - name: revision
          value: main
      workingDir: $(workspaces.source.path)
    - name: build
      image: golang
      workingDir: $(workspaces.source.path)
      script: |
        go build -o app .

重要参数

Parameters

当 Step 引用 StepAction 时,可以使用 Parameters 对 StepAction 进行自定义。

使用场景

  • 配置连接详细信息
  • 指定目标或目的地
  • 设置操作标志
  • 定义版本信息
  • 控制行为

原则

StepAction 中的 Parameters:

  • 在 StepAction 规范中声明
  • 可以具有默认值
  • 从引用它的 Step 传入
  • 支持 string、array 和 object 类型
  • 不能直接在脚本中使用(应通过环境变量使用)

配置示例

apiVersion: tekton.dev/v1beta1
kind: StepAction
metadata:
  name: image-builder
spec:
  params:
    - name: image
      type: object
      properties:
        name:
          type: string
        tag:
          type: string
    - name: context
      type: string
      default: "."
  image: podman
  env:
    - name: IMAGE_NAME
      value: $(params.image.name)
    - name: IMAGE_TAG
      value: $(params.image.tag)
  script: |
    podman build -t $IMAGE_NAME:$IMAGE_TAG $(params.context)

Results

Results 允许 StepAction 输出值,供其他 Step 或 Task 使用。

使用场景

  • 共享构建信息
  • 传递生成的标识符
  • 传递状态信息
  • 提供构件位置

原则

Results:

  • 在 StepAction 规范中声明
  • 由 StepAction 写入特定文件路径
  • 对后续 Step 或 Task 可用

配置示例

apiVersion: tekton.dev/v1beta1
kind: StepAction
metadata:
  name: version-generator
spec:
  results:
    - name: version
      description: The generated semantic version
    - name: build-id
      description: The unique build identifier
  image: alpine
  script: |
    VERSION="1.0.$(date +%s)"
    echo -n $VERSION > $(results.version.path)
    echo -n "build-$RANDOM-$RANDOM" > $(results.build-id.path)

WorkingDir

WorkingDir 用于指定 StepAction 的工作目录。

使用场景

  • 为操作设置正确的上下文
  • 确保命令在正确的位置运行
  • 确保 StepAction 使用方式的一致性

配置示例

apiVersion: tekton.dev/v1beta1
kind: StepAction
metadata:
  name: file-processor
spec:
  workingDir: /workspace
  image: ubuntu
  script: |
    ls -la
    find . -name "*.txt" -exec cat {} \;

SecurityContext

SecurityContext 用于配置 StepAction 的安全设置。

使用场景

  • 设置容器权限
  • 配置用户和组 ID
  • 管理安全约束

配置示例

apiVersion: tekton.dev/v1beta1
kind: StepAction
metadata:
  name: secure-operation
spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
    allowPrivilegeEscalation: false
  image: ubuntu
  script: |
    echo "Running as $(id -u)"

VolumeMounts

VolumeMounts 允许 StepAction 访问外部存储。

使用场景

  • 访问配置文件
  • 存储持久化数据
  • 在步骤之间共享信息

配置示例

apiVersion: tekton.dev/v1beta1
kind: StepAction
metadata:
  name: config-reader
spec:
  volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  image: ubuntu
  script: |
    cat /etc/config/settings.json

When Expressions

When Expressions 允许控制引用 StepAction 的 Step 是否执行。

使用场景

  • 根据参数有条件地执行
  • 根据 workspace 的可用性跳过步骤
  • 根据前一步骤的结果控制工作流

配置示例

apiVersion: tekton.dev/v1
kind: Task
metadata:
  name: conditional-task
spec:
  params:
    - name: run-tests
      type: string
      default: "true"
  steps:
    - name: test-runner
      ref:
        name: run-tests
      when:
        - input: "$(params.run-tests)"
          operator: in
          values: ["true"]

远程 StepActions

可以从 git 仓库等远程位置引用 StepActions。

使用场景

  • 集中管理 StepAction
  • 对 StepAction 进行版本控制
  • 在组织之间共享 StepAction

配置示例

apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
  name: remote-stepaction-run
spec:
  taskSpec:
    steps:
      - name: remote-action
        ref:
          resolver: git
          params:
            - name: url
              value: https://github.com/organization/stepactions.git
            - name: revision
              value: main
            - name: pathInRepo
              value: actions/my-action.yaml

参考