3. Tekton Workspace共享
任务目标
在 Tekton Pipeline 中定义 Workspace,并让多个 Task 通过该 Workspace 共享数据。本案例实现一个最小闭环:第一个 Task 将源码写入共享目录,第二个 Task 读取该目录并生成构建产物,最终验证产物文件存在且内容正确。
环境依赖
- Kubernetes 集群(v1.21+)
- Tekton Pipelines(v0.45+)已安装
- 已配置默认 StorageClass(用于 PVC 动态供给)
完整实现
以下 YAML 定义了一个 Pipeline,包含两个 Task 和一个共享 Workspace。Task 1 将源码文件写入 Workspace,Task 2 读取该文件并生成构建产物。
```yaml apiVersion: tekton.dev/v1 kind: Task metadata: name: task-write-source spec: workspaces: - name: shared-data steps: - name: write-source image: alpine:3.18 script: | #!/bin/sh set -e echo "print('hello from tekton')" > $(workspaces.shared-data.path)/main.py echo "源码已写入: $(workspaces.shared-data.path)/main.py" --- apiVersion: tekton.dev/v1 kind: Task metadata: name: task-build-artifact spec: workspaces: - name: shared-data steps: - name: build-output image: alpine:3.18 script: | #!/bin/sh set -e SOURCE_FILE=$(workspaces.shared-data.path)/main.py if [ ! -f "$SOURCE_FILE" ]; then echo "错误: 未找到源码文件 $SOURCE_FILE" exit 1 fi # 模拟构建过程:将源码内容复制为构建产物 cp "$SOURCE_FILE" $(workspaces.shared-data.path)/artifact.txt echo "构建产物已生成: $(workspaces.shared-data.path)/artifact.txt" echo "--- 产物内容 ---" cat $(workspaces.shared-data.path)/artifact.txt --- apiVersion: tekton.dev/v1 kind: Pipeline metadata: name: workspace-share-pipeline spec: workspaces: - name: pipeline-storage tasks: - name: write-source taskRef: name: task-write-source workspaces: - name: shared-data workspace: pipeline-storage - name: build-artifact taskRef: name: task-build-artifact runAfter: [write-source] workspaces: - name: shared-data workspace: pipeline-storage --- apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: workspace-share-run spec: pipelineRef: name: workspace-share-pipeline workspaces: - name: pipeline-storage volumeClaimTemplate: spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 100Mi ```部署与运行
- 将上述 YAML 保存为
workspace-share.yaml,执行:
- 启动 PipelineRun:
- 等待运行完成并查看状态:
验证方法
满足以下条件即判定通过:
tkn pipelinerun describe workspace-share-run显示SUCCEEDED。- 日志中 Task 1 输出“源码已写入”,Task 2 输出“构建产物已生成”且随后打印的产物内容为
print('hello from tekton')。 - 若需进一步确认,可进入 PVC 对应 Pod 查看文件,或执行以下命令检查产物内容:
预期输出为 print('hello from tekton'),与 Task 1 写入的源码内容一致,证明数据已通过 Workspace 在 Task 间正确传递。
关键说明
- 两个 Task 通过
workspaces字段声明挂载同一 PVC,路径为/workspace/shared-data,实现数据共享。 - Pipeline 中的
volumeClaimTemplate动态创建 PVC,生命周期与 PipelineRun 绑定,Run 结束后 PVC 会被回收。 - 若集群默认 StorageClass 未配置,需提前创建 PVC 并替换
volumeClaimTemplate为persistentVolumeClaimName。