Tekton Pipelines — Dependencies#
Module info#
- Module:
github.com/tektoncd/pipeline - Go version: go 1.25.7
- Direct dependencies: 47 (non-indirect entries across all require blocks)
- Indirect dependencies: ~167 (marked
// indirectin go.mod); go.sum has 1,747 lines (~873 module/version pairs total)
Dependency categories#
Core infrastructure / Kubernetes#
The largest and most foundational category — everything here is either a hard Kubernetes requirement or the Knative reconciler framework that drives the controllers.
| Dependency | Why used |
|---|---|
k8s.io/api | Core Kubernetes API types (Pod, ConfigMap, etc.) |
k8s.io/apimachinery | Kubernetes API machinery (ObjectMeta, runtime.Object, scheme) |
k8s.io/client-go | Kubernetes client, informers, listers, workqueue |
k8s.io/apiextensions-apiserver | CRD management (installing/validating Tekton CRDs) |
k8s.io/code-generator | Generate typed listers/informers for custom types |
k8s.io/kube-openapi | OpenAPI schema generation for CRD validation |
k8s.io/utils | Kubernetes utility functions |
k8s.io/klog | Kubernetes legacy logger (v1, present alongside klog/v2 indirect) |
knative.dev/pkg | The core dependency: reconciler framework, leader election, webhook infrastructure, Zap logging setup, Prometheus metrics wiring, and structured controllers |
sigs.k8s.io/yaml | YAML ↔ JSON conversion for Kubernetes manifests |
gomodules.xyz/jsonpatch/v2 | JSON patch operations (admission webhook mutations) |
github.com/tektoncd/plumbing | Tekton-ecosystem shared CI/CD tooling (used in tests/tooling) |
knative.dev/pkg is not a simple utility — it is the architectural skeleton. The reconciler loop, leader election, webhook registration, log configuration, and controller wiring all come from this dependency. Removing it would require rewriting the entire operator framework.
Observability#
go.uber.org/zap v1.27.1— structured, leveled logging; bootstrapped through knative.dev/pkg’s log setupgo.opentelemetry.io/otel+otel/sdk+otel/trace+otel/metric+otel/sdk/metric+otel/exporters/otlp/otlptrace/otlptracehttp— full OpenTelemetry distributed tracing and metrics stack with OTLP HTTP export; an unusually comprehensive OTel commitment for an operatorgithub.com/prometheus/common— Prometheus metric utilities (used alongside OTel’s Prometheus exporter)
Supply chain security (Sigstore + SPIFFE/SPIRE)#
This is the category most distinctive to Tekton relative to other operators in the analysis set.
| Dependency | Purpose |
|---|---|
github.com/sigstore/sigstore | Core Sigstore library for artifact signing/verification |
github.com/sigstore/sigstore/pkg/signature/kms/aws | AWS KMS backend for signing keys |
github.com/sigstore/sigstore/pkg/signature/kms/azure | Azure Key Vault backend for signing keys |
github.com/sigstore/sigstore/pkg/signature/kms/gcp | Google Cloud KMS backend for signing keys |
github.com/sigstore/sigstore/pkg/signature/kms/hashivault | HashiCorp Vault backend for signing keys |
github.com/spiffe/go-spiffe/v2 | SPIFFE workload identity library (X.509 SVID fetching) |
github.com/spiffe/spire-api-sdk | SPIRE gRPC API (workload attestation) |
github.com/go-jose/go-jose/v3 | JOSE/JWS/JWT processing for token-based auth |
golang.org/x/crypto | Low-level cryptographic primitives |
All four major cloud KMS backends are direct deps, reflecting Tekton’s policy of supporting multi-cloud artifact signing without making any single cloud mandatory. The SPIFFE/SPIRE integration provides pod-level workload identity without Kubernetes service account tokens — an uncommon, advanced security posture.
Runtime / Expression engine#
github.com/google/cel-go v0.27.0— Google Common Expression Language; used for evaluating conditions in Pipelines (whenexpressions, result propagation conditions) and parameter value expressions at runtime. CEL provides safe, sandboxed evaluation without requiring a scripting runtime.github.com/cloudevents/sdk-go/v2 v2.16.2— CloudEvents SDK; Tekton emits CloudEvents for pipeline/task run lifecycle events, enabling integration with event-driven platforms (Knative Eventing, Triggermesh, etc.)
Container registry#
github.com/google/go-containerregistry v0.21.3— OCI registry client used to resolve image digests, push/pull Tekton artifacts (bundles), and interact with OCI-stored pipeline definitionsgithub.com/google/go-containerregistry/pkg/authn/k8schain— Kubernetes-aware auth chain (reads imagePullSecrets) for registry accessgithub.com/goccy/kpoward v0.1.0— Kubernetes port-forwarding client; used for accessing internal registry endpoints (e.g., in-cluster registry) during resolution
SCM / Source control management#
github.com/jenkins-x/go-scm v1.15.17— generic SCM abstraction layer supporting GitHub, GitLab, Bitbucket, Gitea; used by the Git resolver to fetch pipeline definitions from source repositoriescode.gitea.io/sdk/gitea v0.21.0— Gitea-specific client (direct dep because go-scm’s Gitea support requires it explicitly)
Networking / gRPC#
google.golang.org/grpc v1.79.3— gRPC; used for SPIFFE/SPIRE workload attestation calls and OpenTelemetry OTLP gRPC exportgoogle.golang.org/protobuf v1.36.11— protobuf serialization; used with SPIRE API SDK and OTel proto formats
Utility#
| Dependency | Purpose |
|---|---|
github.com/google/go-cmp v0.7.0 | Deep equality comparison; primarily for tests |
github.com/google/uuid v1.6.0 | UUID generation for run identifiers |
github.com/hashicorp/golang-lru v1.0.2 | LRU cache for resolved pipeline/task definitions |
github.com/hashicorp/go-version v1.8.0 | Semver parsing for API version comparisons |
github.com/pkg/errors v0.9.1 | Legacy error wrapping (predates fmt.Errorf %w) |
golang.org/x/sync v0.20.0 | errgroup, semaphore for bounded concurrency |
Testing#
github.com/google/go-cmp— primary comparison library for test assertions (testify is only an indirect dep, suggesting it comes transitively through knative or other deps rather than being used directly in Tekton’s own tests)- No gomock or ginkgo as direct deps; testing appears to rely on stdlib + go-cmp
Stdlib reliance#
Tekton makes heavy use of the standard library. The reconciler files sampled show consistent use of:
context— ubiquitous; every reconcile function receives a contextfmt,errors— error construction and wrappingtime— timeout and duration trackingstrings— string manipulationencoding/json— JSON marshaling/unmarshaling of Kubernetes objects and pipeline resultssort— deterministic ordering (important for test reproducibility)sync— mutex and WaitGroup for concurrent state (though often replaced bygolang.org/x/sync/errgroup)
The project is not stdlib-first in the way a small utility library might be. The Kubernetes and Knative layers pull in large dependency trees. Within those constraints, individual packages are reasonably lean and rely on stdlib for logic-level work.
Shared dependencies#
Dependencies shared with many other projects in the analysis set (creates connection points for cross-project chapters):
k8s.io/client-go— shared with all Kubernetes controllers/operators in the setgo.uber.org/zap— shared with Knative-based and many cloud-native Go projectsgoogle.golang.org/grpc— shared with etcd, Prometheus, and any project using gRPCgoogle.golang.org/protobuf— shared broadly wherever gRPC or proto is usedgithub.com/google/go-cmp— nearly universal in modern Go test codegithub.com/prometheus/common— shared with Prometheus-adjacent projectsgolang.org/x/sync— shared almost universallygolang.org/x/crypto— common wherever TLS or key material is handledgithub.com/sigstore/sigstore— emerging shared dep in supply-chain-aware projects (connects to sigstore ecosystem analysis)
Vendoring#
Yes, vendor directory is present. This is consistent with Tekton’s Kubernetes heritage — k8s.io/* projects vendor dependencies to ensure reproducible builds in CI environments, avoid network dependencies during compilation, and enable easier auditing of transitive code. The vendor directory is populated via go mod vendor and committed to the repository.
Notable dependency decisions#
Knative as the operator skeleton, not controller-runtime. Most Kubernetes operators in 2024 choose
sigs.k8s.io/controller-runtime. Tekton choseknative.dev/pkgbecause it was originally part of Knative and the migration cost has never justified switching. This makes Tekton structurally divergent from most modern operators — Knative’s reconciler pattern, webhook wiring, and logging conventions permeate the codebase.Four KMS backends as direct deps. Rather than making cloud-provider KMS support optional (via build tags or plugin interfaces), all four backends (AWS, Azure, GCP, HashiCorp Vault) are direct dependencies. This means every build of Tekton carries the full AWS SDK, Azure SDK, and GCP SDK even if only one KMS is configured. The tradeoff favors operational simplicity (single binary) over binary size.
CEL for expression evaluation over Go templates or scripting. The use of
cel-goforwhenconditions and parameter expressions is a principled choice: CEL is safe (no side effects, deterministic, no I/O), fast, and auditable — important properties for a CI/CD system that executes user-supplied expressions in a privileged cluster context.Legacy
pkg/errorsretained alongside stdliberrors. The presence ofgithub.com/pkg/errorsas a direct dep (rather than indirect) suggests some code paths still useerrors.Wrap/errors.Cause. This is a minor tech-debt signal — the Go ecosystem moved tofmt.Errorf %wanderrors.Is/Asin Go 1.13, andpkg/errorsis now largely superseded.SPIFFE/SPIRE as direct deps (not optional). Workload identity via SPIFFE is compiled into the main binary, not an optional plugin. This reflects Tekton’s commitment to supply chain security (SLSA compliance) as a core feature, not an afterthought — unusual for operator-style projects where security is often delegated to infrastructure.