步骤操作
StepAction 是在 Tekton Pipelines 中由步骤执行的可重用和可编程的工作单元。步骤操作允许您定义可容器化的操作,可以在不同的任务中引用和重用。
为什么需要步骤操作
传统任务挑战
在使用步骤操作之前,任务面临几个限制:
- 可重用性:任务中定义的步骤无法轻松提取和重用
- 可维护性:必须在不同的任务中重复常见的步骤逻辑
- 版本控制:很难将单独的步骤与任务分开进行版本控制
- 一致性:很难确保常见操作的一致实现
Tekton 的解决方案
步骤操作通过以下方式解决了这些挑战:
- 步骤级可重用性:将常见操作封装为可重用的组件
- 声明性定义:将步骤操作定义为 Kubernetes 自定义资源
- 参数化:接受参数以自定义行为
- 结果输出:产生可被其他步骤使用的结果
- 资源控制:将资源需求与任务分开定义
优势
- 模块化:将复杂操作拆分为可重用的组件
- 一致性:确保在任务间对常见操作的一致实现
- 可维护性:更新一次步骤操作,所有引用的任务均受益
- 清晰性:将执行内容的定义(步骤操作)与执行时机(步骤)分开
- 版本控制:独立于任务对步骤操作进行版本控制
场景
步骤操作在各种场景中非常有用,包括:
- 常见操作:Git 克隆、镜像构建、安全扫描
- 标准化工具:代码检查工具、格式化工具、测试运行器
- 组织特定逻辑:自定义部署流程、审批工作流
- 共享实用工具:版本生成、配置验证
- 集成组件:服务交互、API 操作
约束和限制
- 步骤操作只能在步骤内使用
- 不能在步骤之间传递步骤结果
- 参数不能直接在脚本中使用(必须使用环境变量)
- 步骤操作不能独立运行(与 TaskRuns 或 PipelineRuns 不同)
- 需要将
enable-step-actions
特性标志设置为 "true"
原则
步骤操作执行模型
当步骤操作被步骤引用时:
- 步骤提供必要的上下文和参数
- 步骤操作定义容器镜像和执行逻辑
- 步骤可以覆盖某些方面,如资源和超时
- 被引用的步骤操作执行其定义的命令或脚本
- 步骤操作的结果可以被后续步骤使用
引用模型
步骤操作不是步骤的组成部分,而是:
- 步骤是一个可执行组件,可以引用步骤操作
- 步骤提供调度和上下文
- 步骤操作提供可重用的逻辑
- 步骤可以引用本地或远程的步骤操作
配置示例
基本步骤操作示例
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 {} \;
安全上下文
安全上下文允许为步骤操作配置安全设置。
用例
配置示例
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
参考