From 6e329b9ed2916be05402b132a856bd5db3acdbfd Mon Sep 17 00:00:00 2001 From: Christoph Ostarek Date: Mon, 22 Sep 2025 13:58:48 +0200 Subject: [PATCH] pkglib: put real pkg-build-arg-hash into pkg hash when using ``` buildArgs: - REL_HASH_%=@lkt:pkgs:../* ``` then exactly this string is put into the pkg hash, but if one of these packages are updated, the pkg hash is not updated, as the string is static. Instead put in the real pkg-build-arg-hash so that even if a pkg is updated, it's descendants end up with a new hash. Signed-off-by: Christoph Ostarek --- src/cmd/linuxkit/pkg_build.go | 2 +- src/cmd/linuxkit/pkglib/buildarg.go | 5 +++- src/cmd/linuxkit/pkglib/pkglib.go | 42 +++++++++++++++++++---------- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/cmd/linuxkit/pkg_build.go b/src/cmd/linuxkit/pkg_build.go index 5eacf349d9..c782591308 100644 --- a/src/cmd/linuxkit/pkg_build.go +++ b/src/cmd/linuxkit/pkg_build.go @@ -129,7 +129,7 @@ func pkgBuildCmd() *cobra.Command { for scanner.Scan() { line := strings.TrimSpace(scanner.Text()) // check if the value is a special linuxkit value - buildArg, err := pkglib.TransformBuildArgValue(line, filename) + buildArg, err := pkglib.TransformBuildArgValue("", line, filename) if err != nil { return fmt.Errorf("error transforming build arg %s: %v", line, err) } diff --git a/src/cmd/linuxkit/pkglib/buildarg.go b/src/cmd/linuxkit/pkglib/buildarg.go index e0c84026f9..757374093e 100644 --- a/src/cmd/linuxkit/pkglib/buildarg.go +++ b/src/cmd/linuxkit/pkglib/buildarg.go @@ -15,7 +15,7 @@ const ( ) // TransformBuildArgValue transforms a build arg pair whose value starts with the special linuxkit prefix. -func TransformBuildArgValue(line, anchorFile string) ([]string, error) { +func TransformBuildArgValue(ownPkgName string, line, anchorFile string) ([]string, error) { parts := strings.SplitN(line, "=", 2) if len(parts) != 2 { return nil, fmt.Errorf("invalid build-arg, must be in format 'arg=value': %s", line) @@ -80,6 +80,9 @@ func TransformBuildArgValue(line, anchorFile string) ([]string, error) { if !info.IsDir() { continue } + if match == ownPkgName { + continue + } if strings.HasPrefix(info.Name(), ".") { continue } diff --git a/src/cmd/linuxkit/pkglib/pkglib.go b/src/cmd/linuxkit/pkglib/pkglib.go index 325b32ca50..6219f2ecf5 100644 --- a/src/cmd/linuxkit/pkglib/pkglib.go +++ b/src/cmd/linuxkit/pkglib/pkglib.go @@ -271,17 +271,7 @@ func NewFromConfig(cfg PkglibConfig, args ...string) ([]Pkg, error) { tagTmpl = "{{.Hash}}" } - // calculate the tag to use based on the template and the pkgHash - tmpl, err := template.New("tag").Parse(tagTmpl) - if err != nil { - return nil, fmt.Errorf("invalid tag template: %v", err) - } - var buf bytes.Buffer - if err := tmpl.Execute(&buf, map[string]string{"Hash": pkgHash}); err != nil { - return nil, fmt.Errorf("failed to execute tag template: %v", err) - } - tag := buf.String() - pkgs = append(pkgs, Pkg{ + pkg := Pkg{ image: pi.Image, org: pi.Org, hash: pkgHash, @@ -299,8 +289,32 @@ func NewFromConfig(cfg PkglibConfig, args ...string) ([]Pkg, error) { buildYML: buildYmlFile, dockerfile: pi.Dockerfile, git: git, - tag: tag, - }) + } + err = pkg.ProcessBuildArgs() + if err != nil { + return pkgs, fmt.Errorf("processing build-args failed: %w", err) + } + if pkg.buildArgs != nil { + for _, buildArg := range *pkg.buildArgs { + fmt.Printf("add buildArg '%s' to hash\n", buildArg) + + buildArgKey := fmt.Sprintf("buildArg=%s", buildArg) + pkgHash += fmt.Sprintf("%x", sha1.Sum([]byte(buildArgKey))) + pkgHash = fmt.Sprintf("%x", sha1.Sum([]byte(pkgHash))) + } + } + // calculate the tag to use based on the template and the pkgHash + tmpl, err := template.New("tag").Parse(tagTmpl) + if err != nil { + return nil, fmt.Errorf("invalid tag template: %v", err) + } + var buf bytes.Buffer + if err := tmpl.Execute(&buf, map[string]string{"Hash": pkgHash}); err != nil { + return nil, fmt.Errorf("failed to execute tag template: %v", err) + } + tag := buf.String() + pkg.tag = tag + pkgs = append(pkgs, pkg) } return pkgs, nil } @@ -374,7 +388,7 @@ func (p *Pkg) ProcessBuildArgs() error { } var buildArgs []string for _, arg := range *p.buildArgs { - transformedLine, err := TransformBuildArgValue(arg, p.buildYML) + transformedLine, err := TransformBuildArgValue(p.path, arg, p.buildYML) if err != nil { return fmt.Errorf("error processing build arg %q: %v", arg, err) }