π¦ OCI Artifact Publishing for CWL Workflows with Embedded SBOMs
Overview
The CI step, publish-oci-artifact
, publishes a Common Workflow Language (CWL) document as an OCI artifact to GitHub Container Registry (ghcr.io
) and attaches Software Bill of Materials (SBOMs) for each container image referenced in the workflow.
This makes the CWL workflow self-describing, portable, and security-awareβwithout requiring direct access to the containers it uses at runtime.
Why OCI Artifacts for CWL?
OCI artifacts are a standardized way to publish non-container objects like Helm charts, WASM modules, or in this case, CWL documents. This lets you:
- Version and tag workflows just like Docker images
- Push to and pull from OCI-compatible registries
- Attach related metadata, such as SBOMs, licenses, or provenance attestations
- Distribute CWL workflows securely and reproducibly
Why Attach SBOMs?
Most CWL workflows depend on container images declared via:
hints:
DockerRequirement:
dockerPull: ghcr.io/your-org/tool:1.2.3
However, CWL alone doesnβt embed what is inside those containers. By generating and attaching SBOMs (via syft), we enrich the CWL artifact with security and supply chain transparency:
-
Security Scanning: SBOMs allow for vulnerability scans of container contents without downloading or executing the containers.
-
Compliance Auditing: Includes details on licenses, libraries, and binaries used.
-
Reproducibility: Makes the full dependency stack explicit.
-
Offline Analysis: Consumers can retrieve and inspect the SBOM from the CWL OCI artifact.
What Does the CI Step Do?
Install oras and syft for pushing OCI artifacts and generating SBOMs.
-
Login to ghcr.io using the GITHUB_TOKEN.
-
For each CWL file:
-
Publish the CWL as an OCI artifact:
oras push ghcr.io/your-org/your-repo/your-workflow:1.2.3 \
--artifact-type application/cwl \
app-workflow.cwl:application/cwl
-
Extract all container image references (dockerPull) from the CWL.
-
For each image:
-
Generate an SBOM using syft.
-
Attach the SBOM to the CWL artifact:
oras attach ghcr.io/.../workflow:1.2.3 \
--artifact-type application/spdx+json \
sbom.spdx.json
Benefits at a Glance
Feature | Benefit |
---|---|
OCI artifact | CWL workflows are versioned, taggable, and registrable |
SBOM attachment | Transparent container dependencies |
No need for image access | SBOMs are stored externally, no image pull required |
Reproducibility & auditing | Enables end-to-end provenance and security introspection |
CWL+OCI integration | Treats workflows as first-class, shareable build artifacts |
Example Artifact Tree:
ghcr.io/org/repo/app-water-bodies-cloud-native:1.1.0
βββ manifest: application/cwl
βββ layer: app-water-bodies-cloud-native.cwl
βββ attached:
β βββ type: application/spdx+json
β βββ name: ghcr.io/org/tool-a@sha256:...sbom.spdx.json
β βββ ...
Scanning the OCI artifacts for vulnerabilities
Use task scan
to inspect the Application Package OCI artifact and scan the container vulnerabilitie:
This prints:
π Discovering SBOM digests for ghcr.io/eoap/advanced-tooling/app-water-body-cloud-native:0.1.0...
π₯ Pulling sha256:e01b2de4387d7b20e83c13126738ab044a556497105c79b3809c388dd0d519a1 β attached-sboms/sha256:e01b2de4387d7b20e83c13126738ab044a556497105c79b3809c388dd0d519a1
β Pulled sboms/ghcr.io_eoap_advanced-tooling_crop_sha256_25aa81b7a9ea49ed94a8a6f070d84039d9e5071f4bc78061f52146c7d37705a8.sbom.spdx.j. 2.74/2.74 MB 100.00% 2s
ββ sha256:a6800275c9ccbbca4ea7b935f78605a1e74c5946ab668951bfd2338315161f65
β Pulled application/vnd.oci.image.manifest.v1+json 860/860 B 100.00% 0s
ββ sha256:e01b2de4387d7b20e83c13126738ab044a556497105c79b3809c388dd0d519a1
Pulled [registry] ghcr.io/eoap/advanced-tooling/app-water-body-cloud-native:0.1.0@sha256:e01b2de4387d7b20e83c13126738ab044a556497105c79b3809c388dd0d519a1
Digest: sha256:e01b2de4387d7b20e83c13126738ab044a556497105c79b3809c388dd0d519a1
π§ͺ Scanning SBOM: attached-sboms/sha256:e01b2de4387d7b20e83c13126738ab044a556497105c79b3809c388dd0d519a1/sboms/ghcr.io_eoap_advanced-tooling_crop_sha256_25aa81b7a9ea49ed94a8a6f070d84039d9e5071f4bc78061f52146c7d37705a8.sbom.spdx.json
2025-06-20T07:48:17+02:00 INFO Vulnerability scanning is enabled
2025-06-20T07:48:17+02:00 INFO Detected SBOM format format="spdx-json"
2025-06-20T07:48:17+02:00 WARN Ignore the OS package as no OS is detected.
2025-06-20T07:48:17+02:00 INFO Number of language-specific files num=1
2025-06-20T07:48:17+02:00 INFO [python-pkg] Detecting vulnerabilities...
Python (python-pkg)
Total: 3 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 2, CRITICAL: 0)
...
Related Tools
oras β OCI Registry As Storage CLI
syft β SBOM generation CLI
OCI Artifact Spec β open standard for publishing non-container objects