步骤操作

StepAction 是在 Tekton Pipelines 中由步骤执行的可重用和可编程的工作单元。步骤操作允许您定义可容器化的操作,可以在不同的任务中引用和重用。

为什么需要步骤操作

传统任务挑战

在使用步骤操作之前,任务面临几个限制:

  • 可重用性:任务中定义的步骤无法轻松提取和重用
  • 可维护性:必须在不同的任务中重复常见的步骤逻辑
  • 版本控制:很难将单独的步骤与任务分开进行版本控制
  • 一致性:很难确保常见操作的一致实现

Tekton 的解决方案

步骤操作通过以下方式解决了这些挑战:

  • 步骤级可重用性:将常见操作封装为可重用的组件
  • 声明性定义:将步骤操作定义为 Kubernetes 自定义资源
  • 参数化:接受参数以自定义行为
  • 结果输出:产生可被其他步骤使用的结果
  • 资源控制:将资源需求与任务分开定义

优势

  • 模块化:将复杂操作拆分为可重用的组件
  • 一致性:确保在任务间对常见操作的一致实现
  • 可维护性:更新一次步骤操作,所有引用的任务均受益
  • 清晰性:将执行内容的定义(步骤操作)与执行时机(步骤)分开
  • 版本控制:独立于任务对步骤操作进行版本控制

场景

步骤操作在各种场景中非常有用,包括:

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

约束和限制

  • 步骤操作只能在步骤内使用
  • 不能在步骤之间传递步骤结果
  • 参数不能直接在脚本中使用(必须使用环境变量)
  • 步骤操作不能独立运行(与 TaskRuns 或 PipelineRuns 不同)
  • 需要将 enable-step-actions 特性标志设置为 "true"

原则

步骤操作执行模型

当步骤操作被步骤引用时:

  1. 步骤提供必要的上下文和参数
  2. 步骤操作定义容器镜像和执行逻辑
  3. 步骤可以覆盖某些方面,如资源和超时
  4. 被引用的步骤操作执行其定义的命令或脚本
  5. 步骤操作的结果可以被后续步骤使用

引用模型

步骤操作不是步骤的组成部分,而是:

  • 步骤是一个可执行组件,可以引用步骤操作
  • 步骤提供调度和上下文
  • 步骤操作提供可重用的逻辑
  • 步骤可以引用本地或远程的步骤操作

配置示例

基本步骤操作示例

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: 检出的提交 SHA
  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)

在任务中引用步骤操作

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 .

重要参数

参数

参数允许在步骤引用步骤操作时自定义步骤操作。

用例

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

原则

步骤操作中的参数:

  • 在步骤操作规范中声明
  • 可以具有默认值
  • 从引用的步骤传递
  • 支持字符串、数组和对象类型
  • 不能直接在脚本中使用(应通过环境变量使用)

配置示例

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: docker
  env:
    - name: IMAGE_NAME
      value: $(params.image.name)
    - name: IMAGE_TAG
      value: $(params.image.tag)
  script: |
    docker build -t $IMAGE_NAME:$IMAGE_TAG $(params.context)

结果

结果允许步骤操作输出可以被其他步骤或任务使用的值。

用例

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

原则

结果是:

  • 在步骤操作规范中声明
  • 由步骤操作写入特定文件路径
  • 供后续步骤或任务使用

配置示例

apiVersion: tekton.dev/v1beta1
kind: StepAction
metadata:
  name: version-generator
spec:
  results:
    - name: version
      description: 生成的语义版本
    - name: build-id
      description: 唯一构建标识符
  image: alpine
  script: |
    VERSION="1.0.$(date +%s)"
    echo -n $VERSION > $(results.version.path)
    echo -n "build-$RANDOM-$RANDOM" > $(results.build-id.path)

工作目录

工作目录允许为步骤操作指定工作目录。

用例

  • 为操作设置正确的上下文
  • 确保命令在正确的位置运行
  • 在步骤操作使用中提供一致性

配置示例

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

安全上下文

安全上下文允许为步骤操作配置安全设置。

用例

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

配置示例

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

卷挂载

卷挂载允许步骤操作访问外部存储。

用例

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

配置示例

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 表达式

When 表达式允许控制引用步骤操作的步骤是否应执行。

用例

  • 基于参数的条件执行
  • 根据工作区可用性跳过步骤
  • 控制基于之前步骤结果的工作流

配置示例

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"]

远程步骤操作

步骤操作可以从远程位置(例如 git 仓库)引用。

用例

  • 集中管理步骤操作
  • 对步骤操作进行版本控制
  • 在组织之间共享步骤操作

配置示例

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

参考