tekton 不是集成到 go 微服务中的库,而是以独立 kubernetes crd 形式运行于集群中,go 服务仅作为流水线的构建、测试与部署目标;其 cli 工具 tkn 与控制器解耦,需单独下载二进制安装,并严格匹配版本兼容性。

直接结论:Tekton 不是“配置”进 Go 微服务里的,而是以独立 Kubernetes CRD 的形式运行在集群中,Go 服务只作为构建/测试/部署的目标产物参与流水线。强行把 Tekton 当成 Go 库或中间件集成,会踩坑。
tkn 命令找不到,不是 PATH 没配,是根本没装客户端
Tekton 的 tkn 是纯本地 CLI 工具,和 tekton-pipelines 控制器完全解耦。kubectl 能看到 Pod,不代表 tkn 就存在。
- 别用
go install装旧版(如 v0.2x),v0.30+ 才支持PipelineRun日志流式输出 - 去 GitHub Releases 下载对应架构的二进制(如
tkn_0.32.0_linux_amd64.tar.gz),chmod +x后放进$PATH - 验证:
tkn version输出中Client version和Pipeline version小版本差 ≤1 才算基本兼容
Task 中 go test 总失败,但本地能过,问题出在 workingDir 和环境变量
Go 测试依赖 go.mod 位置、GOPATH、go.sum 校验三者一致。Tekton 默认工作目录是 /workspace,而 go test 不会自动向上找 module root。
- 必须显式设置
workingDir: /workspace/source(假设 git clone 到source目录) - 加
env: [{name: GOPATH, value: "/workspace"}],否则go test可能静默跳过 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 把所有输入输出默认走 /workspace,但 Go 编译器不会报错——它只是在空目录里执行 go build,找不到 go.mod,然后一直等超时。
- 检查
kubectl describe pipelinerun的 Events,重点看CouldNotResolveWorkspace类提示 - Task 必须显式声明
workspaces字段,并在每个 step 的volumeMounts中挂载到/workspace - 别用
scratch镜像:它没sh,entrypoint 启动失败且无日志;推荐golang:1.22-alpine - Git 凭据不能靠
~/.gitconfig:容器没 home 目录,git config --global无效;要用 Secret 挂 volume +GIT_AUTH_TOKEN环境变量透传
GITHUB_TOKEN 明文写进 PipelineRun YAML 就等于泄露
硬编码 Token 不仅违反最小权限原则,还可能被 tkn pipelinerun logs 或 dashboard 日志意外打印出来。
- 创建
Secret类型为kubernetes.io/basic-auth或kubernetes.io/ssh-auth - 在 PipelineRun 中通过
workspaces把 Secret 挂成 volume,再在 Task step 里用env注入GIT_AUTH_TOKEN - 避免在
script字段里拼接curl -H "Authorization: token $TOKEN"—— 这类字符串会被 shell 展开后进日志 - 如果用 ko 构建,它默认生成 distroless 镜像且不依赖 docker daemon,更适合 Tekton 场景
最常被忽略的点:Go 构建缓存($GOCACHE)默认在 ~/.cache/go-build,而 Tekton 的 emptyDir volume 生命周期只覆盖单次 PipelineRun;想复用缓存,得用 PersistentVolumeClaim 显式挂载,且注意多个 PipelineRun 并发写同一 cache 目录可能冲突。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











