1. Workspace:Task 之间的“同一张桌子”
单个 Task 里的多个 step 共享同一 Pod 的文件系统(含 emptyDir);但跨 Task 默认是不同 Pod——要用 Workspace 把卷挂进每个 Task。Pipeline 层声明 workspaces:,再在 tasks[].workspaces 里把同名 workspace 绑到具体 Task。 来源可以是 emptyDir、已有 PersistentVolumeClaim、volumeClaimTemplate 动态申请、configMap/secret 等(以版本文档为准)。
# Pipeline fragment: declare workspace, bind in tasks (illustrative)
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
name: build-app
spec:
workspaces:
- name: source
tasks:
- name: fetch
taskRef:
name: git-clone
workspaces:
- name: output
workspace: source
- name: compile
runAfter: ["fetch"]
taskRef:
name: maven-package
workspaces:
- name: src
workspace: source
2. Results:轻量元数据通道
Task Results 让步骤把短输出写入预定文件路径(由 Tekton 注入 $(results.NAME.path)),控制器汇总到 Run 的 status。 适合传递 commit SHA、镜像 digest、版本号等;有大小上限(以官方文档为准),不适合传 fat JAR。 Pipeline Results 可把下游 Task result 映射为整条流水线的对外输出。
# Task fragment: emit a string result (Tekton injects results.*.path)
spec:
results:
- name: image-digest
type: string
steps:
- name: record-digest
image: alpine:3.19
script: |
printf '%s' 'sha256:deadbeef' > "$(results.image-digest.path)"
3. 制品传递:Workspace 出站与外部系统
构建产物若留在 workspace 里,只能被后续 Task 消费;要交付给集群外用户,通常: 容器镜像推 Registry,通用制品推 S3 / MinIO / Artifactory,并返回 URI / digest 作为 Result 供 CD 使用。 这与 GitLab artifacts 的“平台托管下载”不同——Tekton 更偏云原生子系统各自负责存储。
4. Cache:给依赖一条“热近道”
常见模式:在 workspace 子目录放 .m2 / .npm 缓存,并挂载只读共享或读写 PVC(多 Run 复用)。 注意缓存一致性与并发写:并行 PipelineRun 争用同一目录时可能损坏缓存,可用 per-branch PVC、对象存储前缀、或远程缓存代理。
5. 与 GitLab / Jenkins 制品心智的对照
| 话题 | Tekton 常见做法 |
|---|---|
| 跨 stage 文件 | Workspace 卷 + 出站上传 |
| 小元数据 | Task / Pipeline Results |
| 平台托管下载 | 通常由外部制品库承担,而非 Tekton 本体 |
6. 本章清单
- 为 Pipeline 增加共享 workspace,跑通 clone → build 两 Task,确认文件在卷上连续可见。
- 实现一个 Task result,并在 PipelineRun status 中读到聚合值。
- 将构建产物推送到 registry 或对象存储,用 result 返回 digest 或 URL。
- 评估缓存 PVC 的访问模式(RWO/RWX)与并行 Run 的冲突风险。
- 预告下一章:离开 Tekton 细节,进入 CD 环境策略与治理。