Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package buildpacks-cli for openSUSE:Factory checked in at 2025-01-18 13:22:32 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/buildpacks-cli (Old) and /work/SRC/openSUSE:Factory/.buildpacks-cli.new.5589 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "buildpacks-cli" Sat Jan 18 13:22:32 2025 rev:7 rq:1238636 version:0.36.4 Changes: -------- --- /work/SRC/openSUSE:Factory/buildpacks-cli/buildpacks-cli.changes 2025-01-13 17:51:05.921030581 +0100 +++ /work/SRC/openSUSE:Factory/.buildpacks-cli.new.5589/buildpacks-cli.changes 2025-01-18 13:23:10.130028271 +0100 @@ -1,0 +2,13 @@ +Sat Jan 18 07:42:00 UTC 2025 - opensuse_buildserv...@ojkastl.de + +- Update to version 0.36.4: + * implementing logic for adding tag suffix + * fixing formatting issue + * WIP - adding a new flag --append-image-name-suffix to append + [os]-[arch]-[variant] to the image name when pushing a + multi-arch buildpack or builder + * removing additional string matching + * Updating hardcoded error message handling when an image was not + found in a registry by platform + +------------------------------------------------------------------- Old: ---- buildpacks-cli-0.36.3.obscpio New: ---- buildpacks-cli-0.36.4.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ buildpacks-cli.spec ++++++ --- /var/tmp/diff_new_pack.ymZ3J5/_old 2025-01-18 13:23:12.186112977 +0100 +++ /var/tmp/diff_new_pack.ymZ3J5/_new 2025-01-18 13:23:12.190113142 +0100 @@ -19,7 +19,7 @@ %define executable_name pack Name: buildpacks-cli -Version: 0.36.3 +Version: 0.36.4 Release: 0 Summary: CLI for building apps using Cloud Native Buildpacks License: Apache-2.0 @@ -32,6 +32,11 @@ BuildRequires: zsh Provides: pack = %{version} Conflicts: allegro44-tools +# +# vendor/github.com/gdamore/tcell/v2/attr.go:32:25: cannot use 1 << 31 (untyped +# int constant 2147483648) as AttrMask value in constant declaration +# (overflows) +ExcludeArch: %{ix86} armv7hl %description pack makes it easy for... ++++++ _service ++++++ --- /var/tmp/diff_new_pack.ymZ3J5/_old 2025-01-18 13:23:12.234114956 +0100 +++ /var/tmp/diff_new_pack.ymZ3J5/_new 2025-01-18 13:23:12.238115120 +0100 @@ -3,7 +3,7 @@ <param name="url">https://github.com/buildpacks/pack</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v0.36.3</param> + <param name="revision">v0.36.4</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.ymZ3J5/_old 2025-01-18 13:23:12.270116438 +0100 +++ /var/tmp/diff_new_pack.ymZ3J5/_new 2025-01-18 13:23:12.278116768 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/buildpacks/pack</param> - <param name="changesrevision">2f1af856afc54fa1220be8f0c7d31c481e258f13</param></service></servicedata> + <param name="changesrevision">c7f5b1cc88cae6599463a98dcd9fd35c0ca5d67c</param></service></servicedata> (No newline at EOF) ++++++ buildpacks-cli-0.36.3.obscpio -> buildpacks-cli-0.36.4.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/buildpacks-cli-0.36.3/internal/commands/builder_create.go new/buildpacks-cli-0.36.4/internal/commands/builder_create.go --- old/buildpacks-cli-0.36.3/internal/commands/builder_create.go 2025-01-10 21:22:52.000000000 +0100 +++ new/buildpacks-cli-0.36.4/internal/commands/builder_create.go 2025-01-17 15:15:15.000000000 +0100 @@ -18,13 +18,14 @@ // BuilderCreateFlags define flags provided to the CreateBuilder command type BuilderCreateFlags struct { - Publish bool - BuilderTomlPath string - Registry string - Policy string - Flatten []string - Targets []string - Label map[string]string + Publish bool + AppendImageNameSuffix bool + BuilderTomlPath string + Registry string + Policy string + Flatten []string + Targets []string + Label map[string]string } // CreateBuilder creates a builder image, based on a builder config @@ -97,18 +98,23 @@ logger.Infof("Pro tip: use --targets flag OR [[targets]] in builder.toml to specify the desired platform") } + if !flags.Publish && flags.AppendImageNameSuffix { + logger.Warnf("--append-image-name-suffix will be ignored, use combined with --publish") + } + imageName := args[0] if err := pack.CreateBuilder(cmd.Context(), client.CreateBuilderOptions{ - RelativeBaseDir: relativeBaseDir, - BuildConfigEnv: envMap, - BuilderName: imageName, - Config: builderConfig, - Publish: flags.Publish, - Registry: flags.Registry, - PullPolicy: pullPolicy, - Flatten: toFlatten, - Labels: flags.Label, - Targets: multiArchCfg.Targets(), + RelativeBaseDir: relativeBaseDir, + BuildConfigEnv: envMap, + BuilderName: imageName, + Config: builderConfig, + Publish: flags.Publish, + AppendImageNameSuffix: flags.AppendImageNameSuffix && flags.Publish, + Registry: flags.Registry, + PullPolicy: pullPolicy, + Flatten: toFlatten, + Labels: flags.Label, + Targets: multiArchCfg.Targets(), }); err != nil { return err } @@ -124,6 +130,7 @@ } cmd.Flags().StringVarP(&flags.BuilderTomlPath, "config", "c", "", "Path to builder TOML file (required)") cmd.Flags().BoolVar(&flags.Publish, "publish", false, "Publish the builder directly to the container registry specified in <image-name>, instead of the daemon.") + cmd.Flags().BoolVar(&flags.AppendImageNameSuffix, "append-image-name-suffix", false, "When publishing to a registry that doesn't allow overwrite existing tags use this flag to append a [os]-[arch] suffix to <image-name>") cmd.Flags().StringVar(&flags.Policy, "pull-policy", "", "Pull policy to use. Accepted values are always, never, and if-not-present. The default is always") cmd.Flags().StringArrayVar(&flags.Flatten, "flatten", nil, "List of buildpacks to flatten together into a single layer (format: '<buildpack-id>@<buildpack-version>,<buildpack-id>@<buildpack-version>'") cmd.Flags().StringToStringVarP(&flags.Label, "label", "l", nil, "Labels to add to the builder image, in the form of '<name>=<value>'") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/buildpacks-cli-0.36.3/internal/commands/buildpack_package.go new/buildpacks-cli-0.36.4/internal/commands/buildpack_package.go --- old/buildpacks-cli-0.36.3/internal/commands/buildpack_package.go 2025-01-10 21:22:52.000000000 +0100 +++ new/buildpacks-cli-0.36.4/internal/commands/buildpack_package.go 2025-01-17 15:15:15.000000000 +0100 @@ -20,16 +20,17 @@ // BuildpackPackageFlags define flags provided to the BuildpackPackage command type BuildpackPackageFlags struct { - PackageTomlPath string - Format string - Policy string - BuildpackRegistry string - Path string - FlattenExclude []string - Targets []string - Label map[string]string - Publish bool - Flatten bool + PackageTomlPath string + Format string + Policy string + BuildpackRegistry string + Path string + FlattenExclude []string + Targets []string + Label map[string]string + Publish bool + Flatten bool + AppendImageNameSuffix bool } // BuildpackPackager packages buildpacks @@ -130,18 +131,23 @@ defer clean(filesToClean) } + if !flags.Publish && flags.AppendImageNameSuffix { + logger.Warnf("--append-image-name-suffix will be ignored, use combined with --publish") + } + if err := packager.PackageBuildpack(cmd.Context(), client.PackageBuildpackOptions{ - RelativeBaseDir: relativeBaseDir, - Name: name, - Format: flags.Format, - Config: bpPackageCfg, - Publish: flags.Publish, - PullPolicy: pullPolicy, - Registry: flags.BuildpackRegistry, - Flatten: flags.Flatten, - FlattenExclude: flags.FlattenExclude, - Labels: flags.Label, - Targets: multiArchCfg.Targets(), + RelativeBaseDir: relativeBaseDir, + Name: name, + Format: flags.Format, + Config: bpPackageCfg, + Publish: flags.Publish, + AppendImageNameSuffix: flags.AppendImageNameSuffix && flags.Publish, + PullPolicy: pullPolicy, + Registry: flags.BuildpackRegistry, + Flatten: flags.Flatten, + FlattenExclude: flags.FlattenExclude, + Labels: flags.Label, + Targets: multiArchCfg.Targets(), }); err != nil { return err } @@ -163,6 +169,7 @@ cmd.Flags().StringVarP(&flags.PackageTomlPath, "config", "c", "", "Path to package TOML config") cmd.Flags().StringVarP(&flags.Format, "format", "f", "", `Format to save package as ("image" or "file")`) cmd.Flags().BoolVar(&flags.Publish, "publish", false, `Publish the buildpack directly to the container registry specified in <name>, instead of the daemon (applies to "--format=image" only).`) + cmd.Flags().BoolVar(&flags.AppendImageNameSuffix, "append-image-name-suffix", false, "When publishing to a registry that doesn't allow overwrite existing tags use this flag to append a [os]-[arch] suffix to package <name>") cmd.Flags().StringVar(&flags.Policy, "pull-policy", "", "Pull policy to use. Accepted values are always, never, and if-not-present. The default is always") cmd.Flags().StringVarP(&flags.Path, "path", "p", "", "Path to the Buildpack that needs to be packaged") cmd.Flags().StringVarP(&flags.BuildpackRegistry, "buildpack-registry", "r", "", "Buildpack Registry name") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/buildpacks-cli-0.36.3/internal/name/name.go new/buildpacks-cli-0.36.4/internal/name/name.go --- old/buildpacks-cli-0.36.3/internal/name/name.go 2025-01-10 21:22:52.000000000 +0100 +++ new/buildpacks-cli-0.36.4/internal/name/name.go 2025-01-17 15:15:15.000000000 +0100 @@ -4,6 +4,8 @@ "fmt" "strings" + "github.com/buildpacks/pack/pkg/dist" + gname "github.com/google/go-containerregistry/pkg/name" "github.com/buildpacks/pack/internal/style" @@ -49,6 +51,24 @@ return refName, nil } +func AppendSuffix(name string, target dist.Target) (string, error) { + reference, err := gname.ParseReference(name, gname.WeakValidation) + if err != nil { + return "", err + } + + suffixPlatformTag := targetToTag(target) + if suffixPlatformTag != "" { + if reference.Identifier() == "latest" { + return fmt.Sprintf("%s:%s", reference.Context(), suffixPlatformTag), nil + } + if !strings.Contains(reference.Identifier(), ":") { + return fmt.Sprintf("%s:%s-%s", reference.Context(), reference.Identifier(), suffixPlatformTag), nil + } + } + return name, nil +} + func getMirror(repo gname.Repository, registryMirrors map[string]string) (string, bool) { mirror, ok := registryMirrors["*"] if ok { @@ -58,3 +78,7 @@ mirror, ok = registryMirrors[repo.RegistryStr()] return mirror, ok } + +func targetToTag(target dist.Target) string { + return strings.Join(target.ValuesAsSlice(), "-") +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/buildpacks-cli-0.36.3/internal/name/name_test.go new/buildpacks-cli-0.36.4/internal/name/name_test.go --- old/buildpacks-cli-0.36.3/internal/name/name_test.go 2025-01-10 21:22:52.000000000 +0100 +++ new/buildpacks-cli-0.36.4/internal/name/name_test.go 2025-01-17 15:15:15.000000000 +0100 @@ -4,6 +4,8 @@ "io" "testing" + "github.com/buildpacks/pack/pkg/dist" + "github.com/sclevine/spec" "github.com/sclevine/spec/report" @@ -79,4 +81,111 @@ assert.Equal(output, expected) }) }) + + when("#AppendSuffix", func() { + when("[os] is provided", func() { + when("[arch]] is provided", func() { + when("[arch-variant] is provided", func() { + when("tag is provided", func() { + it("append [os]-[arch]-[arch-variant] to the given tag", func() { + input := "my.registry.com/my-repo/my-image:some-tag" + target := dist.Target{ + OS: "linux", + Arch: "amd64", + ArchVariant: "v6", + } + + result, err := name.AppendSuffix(input, target) + assert.Nil(err) + assert.Equal(result, "my.registry.com/my-repo/my-image:some-tag-linux-amd64-v6") + }) + }) + when("tag is not provided", func() { + it("add tag: [os]-[arch]-[arch-variant] to the given <image>", func() { + input := "my.registry.com/my-repo/my-image" + target := dist.Target{ + OS: "linux", + Arch: "amd64", + ArchVariant: "v6", + } + + result, err := name.AppendSuffix(input, target) + assert.Nil(err) + assert.Equal(result, "my.registry.com/my-repo/my-image:linux-amd64-v6") + }) + }) + }) + when("[arch-variant] is not provided", func() { + when("tag is provided", func() { + // my.registry.com/my-repo/my-image:some-tag + it("append [os]-[arch] to the given tag", func() { + input := "my.registry.com/my-repo/my-image:some-tag" + target := dist.Target{ + OS: "linux", + Arch: "amd64", + } + + result, err := name.AppendSuffix(input, target) + assert.Nil(err) + assert.Equal(result, "my.registry.com/my-repo/my-image:some-tag-linux-amd64") + }) + }) + when("tag is NOT provided", func() { + // my.registry.com/my-repo/my-image + it("add tag: [os]-[arch] to the given <image>", func() { + input := "my.registry.com/my-repo/my-image" + target := dist.Target{ + OS: "linux", + Arch: "amd64", + } + + result, err := name.AppendSuffix(input, target) + assert.Nil(err) + assert.Equal(result, "my.registry.com/my-repo/my-image:linux-amd64") + }) + }) + }) + }) + + when("[arch] is not provided", func() { + when("tag is provided", func() { + // my.registry.com/my-repo/my-image:some-tag + it("append [os] to the given tag", func() { + input := "my.registry.com/my-repo/my-image:some-tag" + target := dist.Target{ + OS: "linux", + } + + result, err := name.AppendSuffix(input, target) + assert.Nil(err) + assert.Equal(result, "my.registry.com/my-repo/my-image:some-tag-linux") + }) + }) + when("tag is not provided", func() { + // my.registry.com/my-repo/my-image + it("add tag: [os] to the given <image>", func() { + input := "my.registry.com/my-repo/my-image" + target := dist.Target{ + OS: "linux", + } + + result, err := name.AppendSuffix(input, target) + assert.Nil(err) + assert.Equal(result, "my.registry.com/my-repo/my-image:linux") + }) + }) + }) + }) + + when("[os] is not provided", func() { + it("doesn't append anything and return the same <image> name", func() { + input := "my.registry.com/my-repo/my-image" + target := dist.Target{} + + result, err := name.AppendSuffix(input, target) + assert.Nil(err) + assert.Equal(result, input) + }) + }) + }) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/buildpacks-cli-0.36.3/pkg/client/create_builder.go new/buildpacks-cli-0.36.4/pkg/client/create_builder.go --- old/buildpacks-cli-0.36.3/pkg/client/create_builder.go 2025-01-10 21:22:52.000000000 +0100 +++ new/buildpacks-cli-0.36.4/pkg/client/create_builder.go 2025-01-17 15:15:15.000000000 +0100 @@ -6,6 +6,8 @@ "sort" "strings" + "github.com/buildpacks/pack/internal/name" + "github.com/Masterminds/semver" "github.com/buildpacks/imgutil" "github.com/pkg/errors" @@ -43,6 +45,10 @@ // Requires BuilderName to be a valid registry location. Publish bool + // Append [os]-[arch] suffix to the image tag when publishing a multi-arch to a registry + // Requires Publish to be true + AppendImageNameSuffix bool + // Buildpack registry name. Defines where all registry buildpacks will be pulled from. Registry string @@ -98,7 +104,7 @@ return "", err } - bldr, err := c.createBaseBuilder(ctx, opts, target) + bldr, err := c.createBaseBuilder(ctx, opts, target, multiArch) if err != nil { return "", errors.Wrap(err, "failed to create builder") } @@ -197,7 +203,7 @@ return nil } -func (c *Client) createBaseBuilder(ctx context.Context, opts CreateBuilderOptions, target *dist.Target) (*builder.Builder, error) { +func (c *Client) createBaseBuilder(ctx context.Context, opts CreateBuilderOptions, target *dist.Target, multiArch bool) (*builder.Builder, error) { baseImage, err := c.imageFetcher.Fetch(ctx, opts.Config.Build.Image, image.FetchOptions{Daemon: !opts.Publish, PullPolicy: opts.PullPolicy, Target: target}) if err != nil { return nil, errors.Wrap(err, "fetch build image") @@ -213,7 +219,15 @@ builderOpts = append(builderOpts, builder.WithLabels(opts.Labels)) } - bldr, err := builder.New(baseImage, opts.BuilderName, builderOpts...) + builderName := opts.BuilderName + if multiArch && opts.AppendImageNameSuffix { + builderName, err = name.AppendSuffix(builderName, *target) + if err != nil { + return nil, errors.Wrap(err, "invalid image name") + } + } + + bldr, err := builder.New(baseImage, builderName, builderOpts...) if err != nil { return nil, errors.Wrap(err, "invalid build-image") } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/buildpacks-cli-0.36.3/pkg/client/package_buildpack.go new/buildpacks-cli-0.36.4/pkg/client/package_buildpack.go --- old/buildpacks-cli-0.36.3/pkg/client/package_buildpack.go 2025-01-10 21:22:52.000000000 +0100 +++ new/buildpacks-cli-0.36.4/pkg/client/package_buildpack.go 2025-01-17 15:15:15.000000000 +0100 @@ -5,6 +5,8 @@ "fmt" "path/filepath" + "github.com/buildpacks/pack/internal/name" + "github.com/pkg/errors" pubbldpkg "github.com/buildpacks/pack/buildpackage" @@ -47,6 +49,10 @@ // specified in the Name variable. Publish bool + // Append [os]-[arch] suffix to the image tag when publishing a multi-arch to a registry + // Requires Publish to be true + AppendImageNameSuffix bool + // Strategy for updating images before packaging. PullPolicy image.PullPolicy @@ -192,7 +198,14 @@ return digest, err } case FormatImage: - img, err := packageBuilder.SaveAsImage(opts.Name, opts.Publish, target, opts.Labels) + packageName := opts.Name + if multiArch && opts.AppendImageNameSuffix { + packageName, err = name.AppendSuffix(packageName, target) + if err != nil { + return "", errors.Wrap(err, "invalid image name") + } + } + img, err := packageBuilder.SaveAsImage(packageName, opts.Publish, target, opts.Labels) if err != nil { return digest, errors.Wrapf(err, "saving image") } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/buildpacks-cli-0.36.3/pkg/image/fetcher.go new/buildpacks-cli-0.36.4/pkg/image/fetcher.go --- old/buildpacks-cli-0.36.3/pkg/image/fetcher.go 2025-01-10 21:22:52.000000000 +0100 +++ new/buildpacks-cli-0.36.4/pkg/image/fetcher.go 2025-01-17 15:15:15.000000000 +0100 @@ -121,10 +121,9 @@ // FIXME: this matching is brittle and the fallback should be removed when https://github.com/buildpacks/pack/issues/2079 // has been fixed for a sufficient amount of time. // Sample error from docker engine: - // `image with reference <image> was found but does not match the specified platform: wanted linux/amd64, actual: linux` - if strings.Contains(err.Error(), "does not match the specified platform") && - (strings.HasSuffix(strings.TrimSpace(err.Error()), "actual: linux") || - strings.HasSuffix(strings.TrimSpace(err.Error()), "actual: windows")) { + // `image with reference <image> was found but does not match the specified platform: wanted linux/amd64, actual: linux` or + // `image with reference <image> was found but its platform (linux) does not match the specified platform (linux/amd64)` + if strings.Contains(err.Error(), "does not match the specified platform") { f.logger.Debugf(fmt.Sprintf("Pulling image %s", style.Symbol(name))) err = f.pullImage(ctx, name, "") } ++++++ buildpacks-cli.obsinfo ++++++ --- /var/tmp/diff_new_pack.ymZ3J5/_old 2025-01-18 13:23:12.802138356 +0100 +++ /var/tmp/diff_new_pack.ymZ3J5/_new 2025-01-18 13:23:12.802138356 +0100 @@ -1,5 +1,5 @@ name: buildpacks-cli -version: 0.36.3 -mtime: 1736540572 -commit: 2f1af856afc54fa1220be8f0c7d31c481e258f13 +version: 0.36.4 +mtime: 1737123315 +commit: c7f5b1cc88cae6599463a98dcd9fd35c0ca5d67c ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/buildpacks-cli/vendor.tar.gz /work/SRC/openSUSE:Factory/.buildpacks-cli.new.5589/vendor.tar.gz differ: char 5, line 1