From 444a1597ff223880baa28bd91e25ecf581b3e178 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Gronowski?= Date: Thu, 20 Mar 2025 19:24:41 +0100 Subject: [PATCH] c8d/builder: Fix missing `image tag` event with BuildKit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The builder `Named` callback was not called with the containerd image store integration enabled and BuildKit due to wrong imageexporter output key being used. We have a test `TestBuildEmitsEvents` that should have detected the bug, but it wasn't actually working because the CLI version used in the `integration-cli` didn't support BuildKit yet. Signed-off-by: Paweł Gronowski --- builder/builder-next/exporter/wrapper.go | 40 +++++++++++++++--------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/builder/builder-next/exporter/wrapper.go b/builder/builder-next/exporter/wrapper.go index c78e261af6..31a79a02d5 100644 --- a/builder/builder-next/exporter/wrapper.go +++ b/builder/builder-next/exporter/wrapper.go @@ -82,21 +82,33 @@ func (i *imageExporterInstanceWrapper) Export(ctx context.Context, src *exporter } if i.callbacks.Named != nil { - for _, name := range strings.Split(out[string(exptypes.OptKeyName)], ",") { - ref, err := reference.ParseNormalizedNamed(name) - if err != nil { - // Shouldn't happen, but log if it does and continue. - log.G(ctx).WithFields(log.Fields{ - "name": name, - "error": err, - }).Warn("image named with invalid reference produced by buildkit") - continue - } - - namedTagged := reference.TagNameOnly(ref).(reference.NamedTagged) - i.callbacks.Named(ctx, namedTagged, desc) - } + i.processNamedCallback(ctx, out, desc) } return out, ref, nil } + +func (i *imageExporterInstanceWrapper) processNamedCallback(ctx context.Context, out map[string]string, desc ocispec.Descriptor) { + // TODO(vvoland): Change to exptypes.ExporterImageNameKey when BuildKit v0.21 is vendored. + imageName := out["image.name"] + if imageName == "" { + log.G(ctx).Warn("image named with empty image.name produced by buildkit") + return + } + + for _, name := range strings.Split(imageName, ",") { + ref, err := reference.ParseNormalizedNamed(name) + if err != nil { + // Shouldn't happen, but log if it does and continue. + log.G(ctx).WithFields(log.Fields{ + "name": name, + "error": err, + }).Warn("image named with invalid reference produced by buildkit") + continue + } + + if namedTagged, ok := reference.TagNameOnly(ref).(reference.NamedTagged); ok { + i.callbacks.Named(ctx, namedTagged, desc) + } + } +}