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 会报错并停止。
PipelineRun v1 nginx / 1.25.3 PipelineRun v2 redis / 7.2.4 Pipeline multi-build Task: build-image params: image-name, version Step 输出 Building image: 参数值 参数传递路径: PipelineRun 定义 params → Pipeline 接收并映射 → Task 通过 $(params.xxx) 引用 → Step 脚本中使用