2. Tekton Task参数化
任务目标
为 Tekton Task 添加输入参数,使其能够接收外部传入的构建配置(如镜像名称、版本号),并通过 Pipeline 将不同参数传递给同一个 Task,实现多次参数化运行。
环境依赖
需要可用的 Kubernetes 集群(v1.21+)并已安装 Tekton Pipelines(v0.40+)。安装命令:
kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
核心实现
以下 YAML 定义了一个参数化 Task(build-image),包含两个参数:image-name(默认值 myapp)和 version(无默认值,必填)。Task 将参数拼接为完整的镜像标签并打印。随后定义 Pipeline(multi-build),通过 params 字段在两次 PipelineRun 中传入不同参数值。
---
apiVersion: tekton.dev/v1
kind: Task
metadata:
name: build-image
spec:
params:
- name: image-name
type: string
default: "myapp"
- name: version
type: string
steps:
- name: echo-params
image: alpine:3.19
script: |
echo "Building image: $(params.image-name):$(params.version)"
---
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
name: multi-build
spec:
params:
- name: image-name
type: string
- name: version
type: string
tasks:
- name: build
taskRef:
name: build-image
params:
- name: image-name
value: $(params.image-name)
- name: version
value: $(params.version)
---
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
name: build-run-v1
spec:
pipelineRef:
name: multi-build
params:
- name: image-name
value: "nginx"
- name: version
value: "1.25.3"
---
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
name: build-run-v2
spec:
pipelineRef:
name: multi-build
params:
- name: image-name
value: "redis"
- name: version
value: "7.2.4"
运行与验证
将上述 YAML 保存为 param-task.yaml,执行:
kubectl apply -f param-task.yaml
等待 PipelineRun 完成(约 30 秒内):
kubectl get pipelinerun
查看两个 PipelineRun 的日志:
kubectl logs $(kubectl get pod -l tekton.dev/pipelineRun=build-run-v1 -o jsonpath='{.items[0].metadata.name}') -c step-echo-params
kubectl logs $(kubectl get pod -l tekton.dev/pipelineRun=build-run-v2 -o jsonpath='{.items[0].metadata.name}') -c step-echo-params
通过条件:
kubectl get pipelinerun显示两个 PipelineRun 均为Succeeded。- 第一个日志输出
Building image: nginx:1.25.3。 - 第二个日志输出
Building image: redis:7.2.4。
关键说明
- Task 参数通过
$(params.参数名)在 step 的 script 中引用,Tekton 会在执行前完成替换。 - Pipeline 参数需显式传递给 Task,否则 Task 使用其默认值(若已设置)。
- 若 Task 参数无默认值且 Pipeline 未传值,PipelineRun 会报错并停止。