Tekton是Kubernetes原生CI/CD框架,与Go应用代码零耦合,仅通过Pipeline编排拉代码、测试、构建镜像、部署YAML;其核心组件为Task、Pipeline、TaskRun、PipelineRun,依赖workspaces正确挂载和版本兼容的tkn CLI。

Tekton 不是“配进” Go 应用里的东西,它压根不和你的 main.go 打交道;它是跑在 Kubernetes 集群里的独立控制器,只负责拉代码、跑 go test、构建镜像、推到仓库、再调 kubectl apply —— Go 应用只是它流水线末端要部署的一个 YAML 文件+一个二进制。
tkn 命令不存在?不是 PATH 问题,是根本没装客户端
Tekton 的 tkn 是纯本地 CLI,和集群里运行的 tekton-pipelines-controller 完全解耦。你 kubectl get pods -n tekton-pipelines 看到一堆 Running,不代表 tkn version 就能执行。
- 别用
go install github.com/tektoncd/cli/cmd/tkn@v0.28.0—— v0.2x 已废弃,不支持tkn pipelinerun logs流式输出 - 去 GitHub Releases 下对应架构的二进制(比如
tkn_0.32.0_linux_amd64.tar.gz),tar -xzf后chmod +x tkn && sudo mv tkn /usr/local/bin - 验证兼容性:
tkn version输出中Client version和Pipeline version小版本差必须 ≤1(例如 client v0.32.0 + pipeline v0.31.x 可行,v0.30.x 就不行)
Task 里 go test 报错找不到 module?多半是 workingDir 没设对
Tekton 默认把所有输入挂到 /workspace,但 go test 不会自动往上翻找 go.mod。它就在空目录里静默失败,日志只显示 no Go files in current directory。
- 显式指定
workingDir: /workspace/source(假设你用git-cloneTask,且 clone 到source目录) - 加环境变量:
env: [{name: GOPATH, value: "/workspace"}],否则go.sum校验可能跳过 vendor 或缓存失效 - 私有模块?默认
golang:1.21镜像不含git,得换golang:1.21-git或自己apk add --no-cache git - 含 cgo 的测试(比如
net/httpDNS 解析)必须设CGO_ENABLED=1,否则http.Get可能静默超时
PipelineRun 卡在 Pending?90% 是 workspaces 挂载漏了
Tekton 不报错,它只是默默等——因为 go build 在空 /workspace 下找不到 go.mod,整个 Pod 启动就卡住,状态停在 Pending。
立即学习“go语言免费学习笔记(深入)”;
- 检查
kubectl describe pipelinerun <name>的 Events,重点看有没有CouldNotResolveWorkspace提示 - 每个 Task 必须声明
workspaces字段,例如:workspaces: [{name: shared-workspace, volumeClaimTemplate: {...}}] - 每个 step 的
volumeMounts必须把 workspace 挂到/workspace(不是/workspace/source,那是 workingDir 的路径) - 别用
scratch镜像:它没/bin/sh,entrypoint 启动失败且无任何日志;推荐golang:1.22-alpine
Git 凭据失效?容器里没有 ~/.gitconfig
你在宿主机 git config --global 的配置,在容器里完全无效——Kubernetes Pod 没 home 目录,$HOME 是空的。
- 用
Secret挂载.gitconfig和.git-credentials到/root(或任意路径),再通过env设置GIT_CONFIG_GLOBAL=/root/.gitconfig - 或者更简单:用
basic-authworkspace,直接挂 Secret,Tekton 会自动复制文件到/root并设置环境 - Token 类凭据别硬编码进 YAML,用
$(inputs.params.git-token)+Secret参数化注入
最常被忽略的点:Tekton PipelineRun 不是“启动就完事”,它依赖每个 Task 正确声明 workspaces 和 steps 的挂载路径;而 Go 应用本身只需保证编译产物可执行、Dockerfile 多阶段构建干净、Kubernetes Deployment 能拉到镜像——其余全是 Tekton 自己的事,跟 Go 代码零耦合。


















