Skip to content

Commit 4bd6aff

Browse files
committed
fix: #23915 podman build is not parsing sbom command line arguments
Signed-off-by: Alex Guidi <[email protected]> add sbom flags on server side for podman-remote Signed-off-by: Alex Guidi <[email protected]>
1 parent a118fdf commit 4bd6aff

File tree

4 files changed

+121
-0
lines changed

4 files changed

+121
-0
lines changed

cmd/podman/common/build.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"maps"
88
"os"
99
"path/filepath"
10+
"slices"
1011
"strconv"
1112
"strings"
1213
"syscall"
@@ -515,6 +516,24 @@ func buildFlagsWrapperToOptions(c *cobra.Command, contextDir string, flags *Buil
515516
}
516517
}
517518

519+
var sbomScanOptions []buildahDefine.SBOMScanOptions
520+
if c.Flag("sbom").Changed || c.Flag("sbom-scanner-command").Changed || c.Flag("sbom-scanner-image").Changed || c.Flag("sbom-image-output").Changed || c.Flag("sbom-merge-strategy").Changed || c.Flag("sbom-output").Changed || c.Flag("sbom-image-output").Changed || c.Flag("sbom-purl-output").Changed || c.Flag("sbom-image-purl-output").Changed {
521+
sbomScanOption, err := parse.SBOMScanOptions(c)
522+
if err != nil {
523+
return nil, err
524+
}
525+
if !slices.Contains(sbomScanOption.ContextDir, contextDir) {
526+
sbomScanOption.ContextDir = append(sbomScanOption.ContextDir, contextDir)
527+
}
528+
for _, abc := range additionalBuildContext {
529+
if !abc.IsURL && !abc.IsImage {
530+
sbomScanOption.ContextDir = append(sbomScanOption.ContextDir, abc.Value)
531+
}
532+
}
533+
sbomScanOption.PullPolicy = pullPolicy
534+
sbomScanOptions = append(sbomScanOptions, *sbomScanOption)
535+
}
536+
518537
opts := buildahDefine.BuildOptions{
519538
AddCapabilities: flags.CapAdd,
520539
AdditionalTags: tags,
@@ -571,6 +590,7 @@ func buildFlagsWrapperToOptions(c *cobra.Command, contextDir string, flags *Buil
571590
Runtime: podmanConfig.RuntimePath,
572591
RuntimeArgs: runtimeFlags,
573592
RusageLogFile: flags.RusageLogFile,
593+
SBOMScanOptions: sbomScanOptions,
574594
SignBy: flags.SignBy,
575595
SignaturePolicyPath: flags.SignaturePolicy,
576596
Squash: flags.Squash,

pkg/api/handlers/compat/images_build.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"net/url"
1414
"os"
1515
"path/filepath"
16+
"slices"
1617
"strconv"
1718
"strings"
1819
"syscall"
@@ -125,6 +126,13 @@ type BuildQuery struct {
125126
UnsetLabels []string `schema:"unsetlabel"`
126127
UnsetAnnotations []string `schema:"unsetannotation"`
127128
Volumes []string `schema:"volume"`
129+
SBOMOutput string `schema:"sbom-output"`
130+
SBOMPURLOutput string `schema:"sbom-purl-output"`
131+
ImageSBOMOutput string `schema:"sbom-image-output"`
132+
ImageSBOMPURLOutput string `schema:"sbom-image-purl-output"`
133+
ImageSBOM string `schema:"sbom-scanner-image"`
134+
SBOMCommands string `schema:"sbom-scanner-command"`
135+
SBOMMergeStrategy string `schema:"sbom-merge-strategy"`
128136
}
129137

130138
// BuildContext represents processed build context and metadata for container image builds.
@@ -619,6 +627,44 @@ func createBuildOptions(query *BuildQuery, buildCtx *BuildContext, queryValues u
619627
return nil, cleanup, utils.GetBadRequestError("retry-delay", query.RetryDelay, err)
620628
}
621629
}
630+
var sbomScanOptions []buildahDefine.SBOMScanOptions
631+
if query.ImageSBOM != "" ||
632+
query.SBOMOutput != "" ||
633+
query.ImageSBOMOutput != "" ||
634+
query.SBOMPURLOutput != "" ||
635+
query.ImageSBOMPURLOutput != "" ||
636+
query.SBOMCommands != "" ||
637+
query.SBOMMergeStrategy != "" {
638+
sbomScanOption := &buildahDefine.SBOMScanOptions{
639+
SBOMOutput: query.SBOMOutput,
640+
PURLOutput: query.SBOMPURLOutput,
641+
ImageSBOMOutput: query.ImageSBOMOutput,
642+
ImagePURLOutput: query.ImageSBOMPURLOutput,
643+
Image: query.ImageSBOM,
644+
MergeStrategy: buildahDefine.SBOMMergeStrategy(query.SBOMMergeStrategy),
645+
PullPolicy: pullPolicy,
646+
}
647+
648+
if _, found := r.URL.Query()["sbom-scanner-command"]; found {
649+
var m = []string{}
650+
if err := json.Unmarshal([]byte(query.SBOMCommands), &m); err != nil {
651+
return nil, cleanup, utils.GetBadRequestError("sbom-scanner-command", query.SBOMCommands, err)
652+
}
653+
sbomScanOption.Commands = m
654+
}
655+
656+
if !slices.Contains(sbomScanOption.ContextDir, buildCtx.ContextDirectory) {
657+
sbomScanOption.ContextDir = append(sbomScanOption.ContextDir, buildCtx.ContextDirectory)
658+
}
659+
660+
for _, abc := range buildCtx.AdditionalBuildContexts {
661+
if !abc.IsURL && !abc.IsImage {
662+
sbomScanOption.ContextDir = append(sbomScanOption.ContextDir, abc.Value)
663+
}
664+
}
665+
666+
sbomScanOptions = append(sbomScanOptions, *sbomScanOption)
667+
}
622668

623669
// Create build options
624670
buildOptions := &buildahDefine.BuildOptions{
@@ -702,6 +748,7 @@ func createBuildOptions(query *BuildQuery, buildCtx *BuildContext, queryValues u
702748
UnsetEnvs: query.UnsetEnvs,
703749
UnsetLabels: query.UnsetLabels,
704750
UnsetAnnotations: query.UnsetAnnotations,
751+
SBOMScanOptions: sbomScanOptions,
705752
}
706753

707754
// Process platforms

pkg/bindings/images/build.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -670,6 +670,42 @@ func prepareRequestBody(ctx context.Context, requestParts *RequestParts, buildFi
670670
return nil, err
671671
}
672672

673+
if len(options.SBOMScanOptions) > 0 {
674+
for _, sbomScanOpts := range options.SBOMScanOptions {
675+
if sbomScanOpts.SBOMOutput != "" {
676+
requestParts.Params.Set("sbom-output", sbomScanOpts.SBOMOutput)
677+
}
678+
679+
if sbomScanOpts.PURLOutput != "" {
680+
requestParts.Params.Set("sbom-purl-output", sbomScanOpts.PURLOutput)
681+
}
682+
683+
if sbomScanOpts.ImageSBOMOutput != "" {
684+
requestParts.Params.Set("sbom-image-output", sbomScanOpts.ImageSBOMOutput)
685+
}
686+
687+
if sbomScanOpts.ImagePURLOutput != "" {
688+
requestParts.Params.Set("sbom-image-purl-output", sbomScanOpts.ImagePURLOutput)
689+
}
690+
691+
if sbomScanOpts.Image != "" {
692+
requestParts.Params.Set("sbom-scanner-image", sbomScanOpts.Image)
693+
}
694+
695+
if commands := sbomScanOpts.Commands; len(commands) > 0 {
696+
c, err := jsoniter.MarshalToString(commands)
697+
if err != nil {
698+
return nil, err
699+
}
700+
requestParts.Params.Add("sbom-scanner-command", c)
701+
}
702+
703+
if sbomScanOpts.MergeStrategy != "" {
704+
requestParts.Params.Set("sbom-merge-strategy", string(sbomScanOpts.MergeStrategy))
705+
}
706+
}
707+
}
708+
673709
if len(options.AdditionalBuildContexts) == 0 {
674710
requestParts.Body = tarfile
675711
logrus.Debugf("Using main build context: %q", options.ContextDirectory)

test/e2e/build_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -973,6 +973,24 @@ RUN ls /dev/test1`, CITEST_IMAGE)
973973
Expect(session).Should(ExitWithError(1, `building at STEP "RUN --mount=type=cache,target=/test,z cat /test/world": while running runtime: exit status 1`))
974974
})
975975

976+
It("podman build with sbom flags", func() {
977+
podmanTest.AddImageToRWStore(ALPINE)
978+
979+
localsbomFile := filepath.Join(podmanTest.TempDir, "localsbom.txt")
980+
localPurlFile := filepath.Join(podmanTest.TempDir, "localpurl.txt")
981+
982+
podmanTest.PodmanExitCleanly("build", "-t", "sbom-img", "--sbom-output="+localsbomFile, "--sbom-purl-output="+localPurlFile, "--sbom-image-output=/tmp/sbom.txt", "--sbom-image-purl-output=/tmp/purl.txt",
983+
"--sbom-scanner-image=alpine", "--sbom-scanner-command=/bin/sh -c 'echo SCANNED ROOT {ROOTFS} > {OUTPUT}'", "--sbom-scanner-command=/bin/sh -c 'echo SCANNED BUILD CONTEXT {CONTEXT} > {OUTPUT}'",
984+
"--sbom-merge-strategy=cat", "build/basicalpine")
985+
986+
Expect(localsbomFile).To(BeARegularFile())
987+
Expect(localPurlFile).To(BeARegularFile())
988+
989+
session := podmanTest.PodmanExitCleanly("run", "--rm", "sbom-img", "ls", "/tmp")
990+
Expect(session.OutputToString()).To(ContainSubstring("purl.txt"))
991+
Expect(session.OutputToString()).To(ContainSubstring("sbom.txt"))
992+
})
993+
976994
It("podman build --build-context: local source", func() {
977995
podmanTest.RestartRemoteService()
978996

0 commit comments

Comments
 (0)