Git, CI/CD & GitOpsCXII · Container Delivery PipelinePipelineShape
The container delivery pipeline — end-to-end view
What you'll learn
- Trace a commit through test, build, scan, sign, push, and deploy as a single pipeline
- Identify the artefacts each stage produces and the artefacts each stage consumes
- Recognise where the chain of trust begins (the source commit) and where it ends (the deployed digest)
- Name the failure modes that occur when any single stage is skipped
Prerequisites
Verified against Git 2.55.x teaching target; 2.40+ minimum · GitHub Actions continuous service; Aug 2026 documentation baseline · Argo CD v3.5.x teaching target; v3.0+ minimum · Flux v2.9.x · Sigstore Cosign v3.1.x · SLSA v1.2 · OCI Distribution Specification v1.1 · Git LFS v3.7.1 · Kubernetes (cross-course target) 1.36.x
Container delivery is one pipeline, not six independent jobs. The source commit is the input; the deployed, signed, attested image digest is the output. Every stage in between consumes the artefact the previous stage produced and emits the artefact the next stage expects. When a stage is skipped, the artefact that should bind two stages together is missing, and the chain of trust breaks at that link.
The pipeline as a chain
flowchart LR
A["Source commit"] --> B["Test (lint, unit, integration)"]
B --> C["Build (BuildKit)"]
C --> D["SBOM (syft)"]
C --> E["Vuln scan (trivy)"]
D --> F["Sign (cosign)"]
E --> F
F --> G["Registry (digest)"]
G --> H["Deploy (GitOps)"]
Six stages, eight arrows, two scan branches that converge at
signing. The chain is linear except for the SBOM and vulnerability
branches that both feed the signature. The output of every stage
keys off a single identifier: the source commit SHA, propagated as
${COMMIT_SHA} through the pipeline.
The chain produces four durable artefacts that outlive the CI run:
- The image digest - the content-addressed blob in the registry.
- The signature - a signed claim over the digest.
- The SBOM attestation - the inventory of what is in the image.
- The vulnerability report - the snapshot of known CVEs at build time.
The four are stored together at the same digest and consumed together by the admission controller and the GitOps controller.
What each stage consumes and produces
| Stage | Consumes | Produces |
|---|---|---|
| Test | Source tree at ${COMMIT_SHA} | Green or red status |
| Build | Green source, Dockerfile | Image digest |
| SBOM | Image digest | SPDX or CycloneDX JSON |
| Vuln scan | Image digest | Trivy report |
| Sign | Image digest, SBOM, vuln report | Signature + attestations |
| Push | Signed image | Registry entry |
| Deploy | Registry digest | Running pods |
A stage that does not consume the previous stage’s output is a
stage that is silently disconnected. A docker build step that
runs even when tests are red is a step that has lost the chain. A
cosign sign step that runs even when the vuln scan finds a
critical CVE is a step that has lost the chain.
Where the chain of trust begins and ends
The chain begins at the source commit. The commit SHA is the provenance root: every later artefact can be traced back to it through the registry entry, the signature, and the attestations. The chain ends at the cluster, when the kubelet pulls the digest and the admission controller has verified the signature. Two endpoints, one chain.
flowchart LR
A["Commit 8a3f9d2 (provenance root)"] --> B["Image sha256:8a3f..."]
B --> C["Signature"]
B --> D["SBOM"]
B --> E["Vuln report"]
C --> F["Admission controller verify"]
D --> F
E --> F
F --> G["Pod runs (chain end)"]
A break at any link collapses the chain. A signature that cannot be verified against the OIDC subject collapses at the admission controller. An SBOM that does not match the digest collapses at the audit step. A vuln report that has been silently skipped collapses at the next CVE publication.
Failure modes when stages are skipped
The four most common failures, by stage:
- Skip test. A green build of red code. The image compiles, the pods start, the regression surfaces in production.
- Skip scan. A green image with a known critical CVE. The CVE is published after the build; without a scan, the image has no record of what was known at build time.
- Skip sign. A green image with no chain to anything. A developer can later re-tag it; nothing prevents substitution.
- Skip pin by digest. A green image that is referenced by tag. The tag moves; the next render pulls a different blob.
Production discipline
- Propagate
${COMMIT_SHA}through every stage. A stage that cannot name its inputs cannot be reproduced. - Fail the pipeline on any missing attestation. A green image with no signature is a failed image, not a passing one.
- Treat the registry as the chain endpoint, not the cluster. What reaches the registry is what can be audited; what reaches the cluster is one sync later.
- Re-run on signature failure, not on signature success. A signature that succeeded but did not include the SBOM is partial.
Cross-course references
- Containers for Production Sysadmins - Parts XI-XIV cover image supply chain mechanics; this part is the pipeline that drives them.
- Sigstore project - the broader Sigstore documentation covers Fulcio, Rekor, and cosign in detail.
- This course, Part LIII (ContainerSupplyChain) - lessons
git-cicd-gitops-liii-01throughgit-cicd-gitops-liii-06cover the individual stages; this part wires them into one pipeline.
Quiz
Knowledge check · 4 questions
Q1. An engineer pushes a container image directly from a laptop, bypassing CI. The image is healthy and runs in production. What has been lost?
Q2. In a container delivery pipeline, the SBOM and the vulnerability scan are both produced from the same image digest and both feed the signing step.
Q3. Name the four durable artefacts a container delivery pipeline produces, and the single identifier they all key off.
Q4. Diagnose a pipeline where the build, push, and deploy all succeeded, but the audit a year later finds no chain of trust.
A team runs a container delivery pipeline: tests run green, BuildKit builds the image, syft generates an SBOM, trivy scans for CVEs, cosign signs the digest, the registry accepts the push, Argo CD syncs to the cluster. The pipeline passes. A year later, an auditor asks which source commit produced the digest currently running in production. The team pulls the source repo at the deploy commit and the registry's manifest for the image, but there is no signature tied to a CI workflow identity, no SBOM attestation, and no record of which CI run produced the digest. The team concludes the chain was never recorded.
Passing score: 75%. Answers are checked in this browser.