Skip to content

Commit dafc274

Browse files
committed
fix: make SBOM generation work in a multi-step build
Also make CLI sample automatically find SBOM step as well. Fix Pkgfile path in the comments. Signed-off-by: Dmitrii Sharshakov <[email protected]>
1 parent 38d5691 commit dafc274

File tree

4 files changed

+17
-11
lines changed

4 files changed

+17
-11
lines changed

cmd/bldr/cmd/sbom.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,16 @@ and outputs a Software Bill of Materials (SBOM) for it in SPDX format.
4141

4242
pkg := graph.Root.Pkg
4343

44-
sbomDoc, err := sbom.CreatePackageSBOM(pkg)
44+
sbomMetadata := pkg.Steps[0].SBOM
45+
for _, step := range pkg.Steps {
46+
if step.SBOM.OutputPath != "" {
47+
sbomMetadata = step.SBOM
48+
49+
break
50+
}
51+
}
52+
53+
sbomDoc, err := sbom.CreatePackageSBOM(pkg, sbomMetadata)
4554
if err != nil {
4655
log.Fatalf("failed to create SBOM for package %q: %v", pkg.Name, err)
4756
}

internal/pkg/convert/node.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ func (node *NodeLLB) stepSBOM(root llb.State, step v1alpha2.Step) llb.State {
344344
return root
345345
}
346346

347-
sbomDoc, err := sbom.CreatePackageSBOM(node.Pkg)
347+
sbomDoc, err := sbom.CreatePackageSBOM(node.Pkg, step.SBOM)
348348
if err != nil {
349349
return root
350350
}

internal/pkg/integration/testdata/sbom/final/ref.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"dataLicense": "CC0-1.0",
44
"SPDXID": "SPDXRef-DOCUMENT",
55
"name": "sidero-pkgs-pkg",
6-
"documentNamespace": "https://anchore.com/bldr/dir/sidero-pkgs-pkg-a8cdf0e2-4206-53f6-8d4e-0aa423d0c72c",
6+
"documentNamespace": "https://anchore.com/bldr/dir/sidero-pkgs-pkg-fc5b1a23-fa78-5de5-ba21-bb3ed393d708",
77
"creationInfo": {
88
"licenseListVersion": "3.25",
99
"creators": [
@@ -15,12 +15,12 @@
1515
"packages": [
1616
{
1717
"name": "pkg",
18-
"SPDXID": "SPDXRef-Package-bldr-package-pkg-aa88761304262ca3",
18+
"SPDXID": "SPDXRef-Package-bldr-package-pkg-b34b3a9a3be1820f",
1919
"versionInfo": "2.1.2",
2020
"supplier": "NOASSERTION",
2121
"downloadLocation": "NOASSERTION",
2222
"filesAnalyzed": false,
23-
"sourceInfo": "acquired package info from the following paths: //pkg/Pkgfile",
23+
"sourceInfo": "acquired package info from the following paths: /Pkgfile",
2424
"licenseConcluded": "NOASSERTION",
2525
"licenseDeclared": "Apache-2.0",
2626
"copyrightText": "NOASSERTION",
@@ -53,7 +53,7 @@
5353
"relationships": [
5454
{
5555
"spdxElementId": "SPDXRef-DocumentRoot-Directory-sidero-pkgs-pkg",
56-
"relatedSpdxElement": "SPDXRef-Package-bldr-package-pkg-aa88761304262ca3",
56+
"relatedSpdxElement": "SPDXRef-Package-bldr-package-pkg-b34b3a9a3be1820f",
5757
"relationshipType": "CONTAINS"
5858
},
5959
{

internal/pkg/sbom/sbom.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,7 @@ func addPkgSources(sbomDoc *sbom.SBOM, bldrPkg *v1alpha2.Pkg, syftPkg pkg.Packag
6565
}
6666

6767
// CreatePackageSBOM populates an SBOM document with data from the provided package.
68-
func CreatePackageSBOM(bldrPkg *v1alpha2.Pkg) (*sbom.SBOM, error) {
69-
// Sample. Actually we would get metadata when instructed to generate SBOM
70-
sbomMetadata := bldrPkg.Steps[0].SBOM
71-
68+
func CreatePackageSBOM(bldrPkg *v1alpha2.Pkg, sbomMetadata v1alpha2.SBOMStep) (*sbom.SBOM, error) {
7269
cpes, err := parseCPEs(sbomMetadata.CPEs)
7370
if err != nil {
7471
return nil, err
@@ -99,7 +96,7 @@ func CreatePackageSBOM(bldrPkg *v1alpha2.Pkg) (*sbom.SBOM, error) {
9996
Type: pkg.Type("bldr-package"),
10097
FoundBy: "bldr",
10198
Locations: file.NewLocationSet(
102-
file.NewLocation("/" + bldrPkg.BaseDir + "/Pkgfile"),
99+
file.NewLocation("/Pkgfile"),
103100
),
104101
CPEs: cpes,
105102
Licenses: pkg.NewLicenseSet(pkg.NewLicensesFromValues(sbomMetadata.Licenses...)...),

0 commit comments

Comments
 (0)