第50章|Tekton 实战:workspaces、results、cache 与制品传递

上一章搭好了 Task / Pipeline 的骨架;本章解决K8s 上 CI 的“接力与储物”Workspace流水线共用的工作台抽屉——检出、构建、测试在同一块卷上接力; Results贴在抽屉外的便签,适合传递短字符串元数据; 大制品则要出站到镜像仓、对象存储。再补上 cache 策略,避免每次构建都从公网重新拉一遍依赖。

Workspace

Shared volume

  • PVC / emptyDir
  • task binding
  • RWO vs RWX
Results

Small outputs

  • task results
  • size limits
  • pipeline results
Ship

Artifacts

  • registry / S3
  • cache PVC
  • idempotent push

1. Workspace:Task 之间的“同一张桌子”

单个 Task 里的多个 step 共享同一 Pod 的文件系统(含 emptyDir);但跨 Task 默认是不同 Pod——要用 Workspace 把卷挂进每个 Task。Pipeline 层声明 workspaces:,再在 tasks[].workspaces 里把同名 workspace 绑到具体 Task。 来源可以是 emptyDir、已有 PersistentVolumeClaimvolumeClaimTemplate 动态申请、configMap/secret 等(以版本文档为准)。

One workspace volume · many tasks (sequential typical) PVC / emptyDir workspace: source /workspace/source Task: clone writes repo files Task: build reads + writes dist/ ReadWriteOnce PVC: often only one node at a time — parallel Tasks on same PVC need RWX or redesign
图 1:Workspace 把“检出目录”变成跨 Task 的共享状态——调度顺序与存储访问模式要一起设计。
# 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
存储类陷阱:ReadWriteOnce 卷常被调度器绑定到单节点;并行 Task 若都要挂载同一 PVC,可能 Pending 或需 ReadWriteMany(依赖集群存储实现)。大团队要把“缓存卷”和“源码 workspace”分层设计。

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)"
Results: small facts, not tarballs Task result digest · tag · commit PipelineRun status aggregated results Downstream CD GitOps / triggers
图 2:Results 适合“指针型信息”;大文件请走 workspace 出站或对象存储。

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、对象存储前缀、或远程缓存代理。

Split: source workspace vs cache volume Ephemeral / per-run workspace git checkout · build output clean boundary each PipelineRun Shared cache PVC (optional) warm m2/npm layers · watch contention second workspace mount · readOnly where possible
图 3:缓存与源码分离——既提速又降低“脏缓存污染构建”的概率。

5. 与 GitLab / Jenkins 制品心智的对照

话题 Tekton 常见做法
跨 stage 文件 Workspace 卷 + 出站上传
小元数据 Task / Pipeline Results
平台托管下载 通常由外部制品库承担,而非 Tekton 本体
workspace push artifact result URI / digest
图 4:数据流像六边形网格上的列车——workspace 载货,results 带路牌。

6. 本章清单

  1. 为 Pipeline 增加共享 workspace,跑通 clone → build 两 Task,确认文件在卷上连续可见。
  2. 实现一个 Task result,并在 PipelineRun status 中读到聚合值。
  3. 将构建产物推送到 registry 或对象存储,用 result 返回 digest 或 URL。
  4. 评估缓存 PVC 的访问模式(RWO/RWX)与并行 Run 的冲突风险。
  5. 预告下一章:离开 Tekton 细节,进入 CD 环境策略与治理
← 上一章:Tekton 入门 下一章:CD 环境策略 →