An SBOM is useful only when it can be connected to the code, artifact, container image, and deployment that produced it. This SBOM implementation guide provides a repeatable checklist for generating, validating, storing, and using software bills of materials throughout a CI/CD pipeline.
Overview
A software bill of materials (SBOM) is a machine-readable inventory of the components in a software product. Depending on how it is generated, it may describe direct and transitive open-source dependencies, operating-system packages, language modules, build metadata, licenses, and relationships between components.
The goal is not to create a document that is filed and forgotten. A useful SBOM helps a team answer practical questions:
- Which version of a vulnerable component is present in a released artifact?
- Which application images or environments are affected?
- Was the component introduced directly, through a transitive dependency, or by the base image?
- Which source commit, build, and deployment produced the affected artifact?
- Can the team demonstrate what was known and checked at release time?
Start by defining the inventory boundary. Decide whether your SBOM covers source dependencies, build tools, generated artifacts, container image packages, or all of these. For containerized applications, an effective model connects the source dependency graph to the built artifact, the container image, and the deployment record. Without those relationships, vulnerability findings are difficult to prioritize and audit evidence is incomplete.
Two commonly used SBOM formats are CycloneDX and SPDX. Both support structured component inventories and relationships, but their schemas, fields, tooling, and organizational conventions differ. Choose one format for the primary workflow unless you have a clear interoperability requirement. Record the format and version with each SBOM rather than assuming consumers will infer it.
Checklist by scenario
For a source repository
- Identify every supported package ecosystem, such as npm, Maven, PyPI, Go modules, NuGet, or operating-system packages.
- Generate an SBOM from the lockfile and resolved dependency graph where possible, not only from manually maintained manifest files.
- Include the repository, commit identifier, branch or release reference, build timestamp, and generator information as metadata.
- Keep development-only dependencies distinguishable from production dependencies when the selected format and tooling support that distinction.
- Validate that the SBOM is parseable and contains component names, versions, and package identifiers appropriate for downstream matching.
For a build artifact
- Assign a stable artifact name and immutable version or digest.
- Generate the SBOM as part of the build that produces the artifact, so the inventory describes the actual output.
- Store the SBOM beside the artifact or attach it through the artifact repository’s supported metadata mechanism.
- Record the source revision, build workflow, builder identity, and dependency-resolution inputs.
- Prevent an SBOM from being overwritten when an artifact is rebuilt with the same human-readable version.
For a container image
- Scan both application dependencies and packages inherited from the base image.
- Use the image digest as the primary relationship key; tags can move and should not be the only identifier.
- Record the base image reference and digest when available, along with the image creation or build metadata.
- Generate the SBOM after the image contents are assembled, then validate that the report represents the final image rather than only the source repository.
- Retain the image, SBOM, scan result, and release decision according to the same retention policy.
For a Kubernetes deployment
- Map the deployed workload to the exact image digest, namespace, cluster or environment, and deployment revision.
- Keep deployment metadata separate from the component inventory, but link the records through stable artifact and image identifiers.
- Define what happens when a newly disclosed vulnerability affects an image already running in an environment.
- Give responders a way to find affected workloads without manually searching every deployment manifest.
- Review image provenance and admission controls alongside the SBOM process; an inventory does not by itself prove that an artifact is trustworthy.
For wider deployment controls, compare the SBOM workflow with your existing Kubernetes deployment best practices. Teams using GitOps should also decide whether SBOM validation belongs in the build pipeline, the promotion workflow, the deployment controller, or more than one stage. The distinction is complementary to the broader GitOps versus CI/CD decision.
Tool comparison checklist
Tools change capabilities over time, so evaluate them against your workflow rather than treating a single product as universally best.
| Tool category | Useful for | Questions to verify |
|---|---|---|
| Build-integrated SBOM generator | Creating inventories from source dependencies or build outputs | Which ecosystems, lockfiles, formats, and metadata fields are supported? |
| Container scanner | Inspecting image layers, OS packages, and application libraries | Can it scan by digest and export CycloneDX or SPDX? |
| Vulnerability scanner | Matching components to vulnerability data and producing findings | Can it show affected paths, fixed versions, severity context, and scan timestamps? |
| Artifact repository | Storing artifacts and associated SBOMs | Can records be immutable, searchable, access-controlled, and retained together? |
| Policy or admission tool | Enforcing release and deployment requirements | Can it require an SBOM, reject malformed metadata, or block defined risk conditions? |
| Inventory or security platform | Correlating components with applications and environments | Can it trace a component from build to deployed workload? |
Example CI/CD workflow
- Resolve: install dependencies from pinned or lockfile-controlled inputs.
- Build: compile or package the application using a recorded source revision.
- Generate: create a CycloneDX or SPDX SBOM for the build output.
- Validate: check syntax, required metadata, component versions, and the expected format version.
- Scan: evaluate the SBOM and, for containers, scan the final image by digest.
- Decide: apply documented thresholds and route exceptions to an accountable owner.
- Publish: store the artifact, image, SBOM, scan result, and provenance references together.
- Promote: carry the immutable identifiers into staging and production deployment records.
What to double-check
Before relying on an SBOM during an incident or audit, verify the details that are easiest to overlook:
- Completeness: compare the SBOM against lockfiles, image layers, package-manager output, and the final artifact.
- Identity: prefer package URLs, checksums, image digests, and other stable identifiers over display names alone.
- Relationships: confirm that dependency-of, contains, generated-from, and deployed-as relationships are represented or stored in a linked system.
- Freshness: distinguish the time an SBOM was generated from the time a vulnerability database or scanner last evaluated it.
- False positives: require evidence before upgrading, suppressing, or accepting a finding. A matching name is not always proof of an affected component.
- Severity context: consider reachability, runtime exposure, exploitability, compensating controls, and whether a fix is available.
- Exceptions: document the owner, reason, scope, expiration or review date, and compensating action.
- Access: protect private repository details and internal deployment metadata while making operational records available to responders.
A practical vulnerability triage sequence is to confirm the component identity, locate the affected artifact and deployed image, determine exposure, check for a fixed or mitigated version, assign an owner, and record the decision. Use an SRE runbook to make the response repeatable when a critical finding requires coordinated action.
Retention should match the useful life of the artifact and the organization’s audit and incident-response needs. Keep the SBOM with the immutable release record, preserve superseded versions when releases remain deployed or supportable, and define deletion rules for expired artifacts. Do not rely on a rolling “latest” report as the historical record.
Common mistakes
- Generating only from source manifests: this can miss transitive resolutions, build output changes, and packages added by a container base image.
- Creating one report outside the pipeline: a later scan may not describe the exact artifact that was released.
- Treating the SBOM as a security verdict: it is an inventory. Risk assessment still requires vulnerability matching, context, and ownership.
- Using mutable tags as relationships: connect records to immutable digests and release identifiers.
- Blocking every finding: noisy gates encourage bypasses. Define actionable policies and a controlled exception path.
- Ignoring the format contract: consumers may depend on specific fields, identifiers, and schema versions. Validate before publishing.
- Storing reports without provenance: an SBOM without source, build, artifact, and generator metadata is difficult to trust or investigate.
- Leaving ownership unclear: platform, security, and application teams should agree who maintains generation, triage, exceptions, and retention.
For platform teams, SBOM generation can become a paved-road capability in an internal developer platform. Document the supported build templates, required metadata, failure behavior, and onboarding path in the same way you would document other developer tooling. A Backstage-based internal developer portal, for example, can expose ownership and release links, provided its records remain connected to authoritative build and deployment systems.
When to revisit
Review this SBOM implementation before seasonal planning cycles, release-audit periods, major build-system migrations, and changes to container or deployment architecture. Also revisit it whenever a critical vulnerability review reveals missing relationships or when teams adopt a new package ecosystem.
Use this audit-ready checklist:
- ☐ The organization has selected supported SBOM formats and documented format versions.
- ☐ CI generates an SBOM from the relevant build output, not only from a source manifest.
- ☐ The SBOM is validated before publication.
- ☐ Artifact names, image digests, source commits, and deployment records are linked.
- ☐ Scan results include timestamps, tool details, and an understandable decision status.
- ☐ Vulnerability triage has owners, thresholds, exception rules, and review dates.
- ☐ Retention and access controls cover both active and historical releases.
- ☐ A responder can identify affected deployed workloads from a component or vulnerability.
- ☐ Tool support, schema versions, CI integrations, and organizational requirements have been rechecked after major changes.
Start with one production service and trace it end to end: source commit, dependency resolution, artifact, container image, SBOM, scan, and deployed workload. Fix the gaps you find, then turn the working path into a reusable CI/CD template. That approach produces a smaller but trustworthy inventory before expanding coverage across the organization.