From 5b350b9a3fec8e11d16bc6a76da87b306d3a1c71 Mon Sep 17 00:00:00 2001 From: Daniel J Walsh Date: Fri, 5 Feb 2021 10:20:18 -0500 Subject: [PATCH] Finish plumbing for buildah bud --manifest Buildah bud --manifest XYZ was not working. The manifest was never created. This PR Finishes the plumbing and allows users to create a manifest while building an image in one single command. Signed-off-by: Daniel J Walsh --- commit.go | 20 +++++++------- imagebuildah/executor.go | 2 ++ imagebuildah/stage_executor.go | 1 + tests/bud.bats | 50 ++++++++++++++++++++++++++++++++-- 4 files changed, 60 insertions(+), 13 deletions(-) diff --git a/commit.go b/commit.go index 9c6831601..de64b1b71 100644 --- a/commit.go +++ b/commit.go @@ -224,7 +224,7 @@ func checkRegistrySourcesAllows(forWhat string, dest types.ImageReference) (inse return false, nil } -func (b *Builder) addManifest(ctx context.Context, manifestName string, imageSpec string) error { +func (b *Builder) addManifest(ctx context.Context, manifestName string, imageSpec string) (string, error) { var create bool systemContext := &types.SystemContext{} var list manifests.List @@ -235,13 +235,13 @@ func (b *Builder) addManifest(ctx context.Context, manifestName string, imageSpe } else { _, list, err = manifests.LoadFromImage(b.store, listImage.ID) if err != nil { - return err + return "", err } } names, err := util.ExpandNames([]string{manifestName}, "", systemContext, b.store) if err != nil { - return errors.Wrapf(err, "error encountered while expanding image name %q", manifestName) + return "", errors.Wrapf(err, "error encountered while expanding image name %q", manifestName) } ref, err := alltransports.ParseImageName(imageSpec) @@ -249,13 +249,13 @@ func (b *Builder) addManifest(ctx context.Context, manifestName string, imageSpe if ref, err = alltransports.ParseImageName(util.DefaultTransport + imageSpec); err != nil { // check if the local image exists if ref, _, err = util.FindImage(b.store, "", systemContext, imageSpec); err != nil { - return err + return "", err } } } if _, err = list.Add(ctx, systemContext, ref, true); err != nil { - return err + return "", err } var imageID string if create { @@ -263,10 +263,7 @@ func (b *Builder) addManifest(ctx context.Context, manifestName string, imageSpe } else { imageID, err = list.SaveToImage(b.store, listImage.ID, nil, "") } - if err == nil { - fmt.Printf("%s\n", imageID) - } - return err + return imageID, err } // Commit writes the contents of the container, along with its updated @@ -489,9 +486,12 @@ func (b *Builder) Commit(ctx context.Context, dest types.ImageReference, options } if options.Manifest != "" { - if err := b.addManifest(ctx, options.Manifest, imgID); err != nil { + manifestID, err := b.addManifest(ctx, options.Manifest, imgID) + if err != nil { return imgID, nil, "", err } + logrus.Debugf("added imgID %s to manifestID %s", imgID, manifestID) + } return imgID, ref, manifestDigest, nil } diff --git a/imagebuildah/executor.go b/imagebuildah/executor.go index a72e24eea..8b5004dda 100644 --- a/imagebuildah/executor.go +++ b/imagebuildah/executor.go @@ -115,6 +115,7 @@ type Executor struct { imageInfoLock sync.Mutex imageInfoCache map[string]imageTypeAndHistoryAndDiffIDs fromOverride string + manifest string } type imageTypeAndHistoryAndDiffIDs struct { @@ -231,6 +232,7 @@ func NewExecutor(store storage.Store, options BuildOptions, mainNode *parser.Nod logRusage: options.LogRusage, imageInfoCache: make(map[string]imageTypeAndHistoryAndDiffIDs), fromOverride: options.From, + manifest: options.Manifest, } if exec.err == nil { exec.err = os.Stderr diff --git a/imagebuildah/stage_executor.go b/imagebuildah/stage_executor.go index e195a7978..13631108e 100644 --- a/imagebuildah/stage_executor.go +++ b/imagebuildah/stage_executor.go @@ -1276,6 +1276,7 @@ func (s *StageExecutor) commit(ctx context.Context, createdBy string, emptyLayer MaxRetries: s.executor.maxPullPushRetries, RetryDelay: s.executor.retryPullPushDelay, HistoryTimestamp: s.executor.timestamp, + Manifest: s.executor.manifest, } imgID, _, manifestDigest, err := s.builder.Commit(ctx, imageRef, options) if err != nil { diff --git a/tests/bud.bats b/tests/bud.bats index 4bd090ac3..403a0e4f5 100644 --- a/tests/bud.bats +++ b/tests/bud.bats @@ -566,9 +566,9 @@ function _test_http() { starthttpd "${TESTSDIR}/bud/$testdir" target=scratch-image run_buildah bud --signature-policy ${TESTSDIR}/policy.json \ - -t ${target} \ - "$@" \ - http://0.0.0.0:${HTTP_SERVER_PORT}/$urlpath + -t ${target} \ + "$@" \ + http://0.0.0.0:${HTTP_SERVER_PORT}/$urlpath stophttpd run_buildah from ${target} } @@ -2509,3 +2509,47 @@ _EOF # run_buildah run $cid arch # expect_output --substring "aarch64" } + +@test "bud with --manifest flag new manifest" { + _prefetch alpine + mytmpdir=${TESTDIR}/my-dir + mkdir -p ${mytmpdir} +cat > $mytmpdir/Containerfile << _EOF +from alpine +run echo hello +_EOF + + run_buildah bud -q --manifest=testlist -t arch-test --signature-policy ${TESTSDIR}/policy.json ${mytmpdir} <<< input + cid=$output + run_buildah images + expect_output --substring testlist + + run_buildah inspect --format '{{ .FromImageDigest }}' $cid + digest=$output + + run_buildah manifest inspect testlist + expect_output --substring $digest +} + +@test "bud with --manifest flag existing manifest" { + _prefetch alpine + mytmpdir=${TESTDIR}/my-dir + mkdir -p ${mytmpdir} +cat > $mytmpdir/Containerfile << _EOF +from alpine +run echo hello +_EOF + + run_buildah manifest create testlist + + run_buildah bud -q --manifest=testlist -t arch-test --signature-policy ${TESTSDIR}/policy.json ${mytmpdir} <<< input + cid=$output + run_buildah images + expect_output --substring testlist + + run_buildah inspect --format '{{ .FromImageDigest }}' $cid + digest=$output + + run_buildah manifest inspect testlist + expect_output --substring $digest +}