From 57148029cdb709baa4535b30166a0103668f1568 Mon Sep 17 00:00:00 2001 From: Petr Fedchenkov Date: Tue, 13 Sep 2022 11:03:32 +0300 Subject: [PATCH] Fix consistently building of multiple arch We cannot build for another arch after building for one arch because of setting skipBuild to true if one arch found. In other words "linuxkit pkg build --platforms linux/riscv64,linux/amd64 ..." after "linuxkit pkg build --platforms linux/amd64 ..." will not build for linux/riscv64 which is not expected. In general when we check for available images and able to found part of platforms we do not want to rebuild all of them. So this PR includes platformsToBuild slice which we fill with platforms we want to build for . Signed-off-by: Petr Fedchenkov --- src/cmd/linuxkit/pkglib/build.go | 52 ++++++++++++++++---------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/cmd/linuxkit/pkglib/build.go b/src/cmd/linuxkit/pkglib/build.go index d55e835c5..fc77d105e 100644 --- a/src/cmd/linuxkit/pkglib/build.go +++ b/src/cmd/linuxkit/pkglib/build.go @@ -229,40 +229,40 @@ func (p Pkg) Build(bos ...BuildOpt) error { return fmt.Errorf("contexts not supported, check docker version: %v", err) } - skipBuild := bo.skipBuild - if !bo.force { - notFound := false + var platformsToBuild []imagespec.Platform + if bo.force { + platformsToBuild = bo.platforms + } else if !bo.skipBuild { fmt.Fprintf(writer, "checking for %s in local cache, fallback to remote registry...\n", ref) for _, platform := range bo.platforms { if _, err := c.ImagePull(&ref, "", platform.Architecture, false); err == nil { fmt.Fprintf(writer, "%s found or pulled\n", ref) - skipBuild = true + if bo.targetDocker { + archRef, err := reference.Parse(fmt.Sprintf("%s-%s", p.FullTag(), platform.Architecture)) + if err != nil { + return err + } + fmt.Fprintf(writer, "checking for %s in local cache, fallback to remote registry...\n", archRef) + if _, err := c.ImagePull(&archRef, "", platform.Architecture, false); err == nil { + fmt.Fprintf(writer, "%s found or pulled\n", archRef) + } else { + fmt.Fprintf(writer, "%s not found, will build: %s\n", archRef, err) + platformsToBuild = append(platformsToBuild, platform) + } + } } else { - fmt.Fprintf(writer, "%s not found: %s\n", ref, err) - notFound = true + fmt.Fprintf(writer, "%s not found, will build: %s\n", ref, err) + platformsToBuild = append(platformsToBuild, platform) } } - if bo.targetDocker { - for _, platform := range bo.platforms { - archRef, err := reference.Parse(fmt.Sprintf("%s-%s", p.FullTag(), platform.Architecture)) - if err != nil { - return err - } - fmt.Fprintf(writer, "checking for %s in local cache, fallback to remote registry...\n", archRef) - if _, err := c.ImagePull(&archRef, "", platform.Architecture, false); err == nil { - fmt.Fprintf(writer, "%s found or pulled\n", archRef) - skipBuild = true - } else { - fmt.Fprintf(writer, "%s not found: %s\n", archRef, err) - notFound = true - } - } - skipBuild = skipBuild && !notFound - } } - if !skipBuild { - fmt.Fprintf(writer, "building %s\n", ref) + if len(platformsToBuild) > 0 { + var arches []string + for _, platform := range platformsToBuild { + arches = append(arches, platform.Architecture) + } + fmt.Fprintf(writer, "building %s for arches: %s\n", ref, strings.Join(arches, ",")) var ( imageBuildOpts = types.ImageBuildOptions{ Labels: map[string]string{}, @@ -313,7 +313,7 @@ func (p Pkg) Build(bos ...BuildOpt) error { } // build for each arch and save in the linuxkit cache - for _, platform := range bo.platforms { + for _, platform := range platformsToBuild { desc, err := p.buildArch(ctx, d, c, bo.builderImage, platform.Architecture, bo.builderRestart, writer, bo, imageBuildOpts) if err != nil { return fmt.Errorf("error building for arch %s: %v", platform.Architecture, err)