CRA Desk

Generating an SBOM for your stack

The CRA Desk scan reads a software bill of materials (SBOM); it never generates one. Your build produces the inventory, the scan turns it into a Cyber Resilience Act (CRA) readiness report. Each ecosystem we watch has its own page with the generate step, the traps and the whole CI job - the scan step after it is the same everywhere.

CRA Desk reads CycloneDX 1.5, 1.6 and 1.7 and SPDX 2.3, JSON only. XML and SPDX tag-value are detected and explained rather than mis-parsed, so a file in the wrong format is reported, never silently treated as an empty inventory.

One generate step per ecosystem

Any stack (cdxgen)

Generator:
cdxgen
Produces:
sbom.json

JavaScript / TypeScript (npm)

Generator:
npm sbom
Produces:
sbom.json

Java / Kotlin (Maven)

Generator:
cyclonedx-maven-plugin
Produces:
target/bom.json

Java / Kotlin (Gradle)

Generator:
cyclonedx-gradle-plugin
Produces:
build/reports/bom.json

Python (pip / Poetry)

Generator:
cyclonedx-py
Produces:
sbom.json

Go

Generator:
cyclonedx-gomod
Produces:
sbom.json

Rust (Cargo)

Generator:
cargo-cyclonedx
Produces:
bom.json

C# / .NET (NuGet)

Generator:
cyclonedx-dotnet
Produces:
sbom.json

Ruby (Bundler)

Generator:
cdxgen
Produces:
sbom.json

PHP (Composer)

Generator:
cyclonedx-php-composer
Produces:
sbom.json

Elixir / Erlang (Mix)

Generator:
mix sbom.cyclonedx
Produces:
sbom.json

Container image (Alpine / apk)

Generator:
syft
Produces:
sbom.json

Traps worth knowing before your first run

  • sbom-path takes a comma-separated list and one * in the final segment (build/*.cdx.json). It reads the first match and never merges several files, so a build writing one SBOM per module needs an aggregating command rather than a wildcard.
  • Several generators emit XML by default, or XML alongside JSON. The scan refuses XML deliberately, so point sbom-path at the .json file and pass the format flag where the tool has one.
  • SPDX has to be JSON (--output spdx-json in syft). SPDX tag-value files are detected and explained rather than read.
  • On GitLab, Dependency Scanning already produces CycloneDX: point sbom_path at gl-sbom-*.cdx.json instead of adding a generator of your own.

A generator that runs is not the same as coverage. Components with no purl, no version, or from an ecosystem outside the ones we watch are counted as gaps in every report rather than reported as clean.