From 15300549f085edbbb395ec2845518d20e89748b1 Mon Sep 17 00:00:00 2001 From: Matt Farina Date: Wed, 29 Oct 2025 15:11:20 -0400 Subject: [PATCH] When time not available, using time.Now Note, when time is not available, the builds are not reproducible. This problem would only happen when an SDK user is using parts of the API to build their own tooling. Helm will consistently inject the dates through the higher level APIs. Signed-off-by: Matt Farina --- internal/chart/v3/util/save.go | 3 +++ internal/chart/v3/util/save_test.go | 10 ++++++---- pkg/chart/v2/util/save.go | 3 +++ pkg/chart/v2/util/save_test.go | 14 ++++++++------ 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/internal/chart/v3/util/save.go b/internal/chart/v3/util/save.go index f755300ba..f886c6175 100644 --- a/internal/chart/v3/util/save.go +++ b/internal/chart/v3/util/save.go @@ -234,6 +234,9 @@ func writeToTar(out *tar.Writer, name string, body []byte, modTime time.Time) er Size: int64(len(body)), ModTime: modTime, } + if h.ModTime.IsZero() { + h.ModTime = time.Now() + } if err := out.WriteHeader(h); err != nil { return err } diff --git a/internal/chart/v3/util/save_test.go b/internal/chart/v3/util/save_test.go index 93da34470..62625919b 100644 --- a/internal/chart/v3/util/save_test.go +++ b/internal/chart/v3/util/save_test.go @@ -285,7 +285,8 @@ func TestRepeatableSave(t *testing.T) { }, ModTime: modTime, Lock: &chart.Lock{ - Digest: "testdigest", + Digest: "testdigest", + Generated: modTime, }, Files: []*common.File{ {Name: "scheherazade/shahryar.txt", ModTime: modTime, Data: []byte("1,001 Nights")}, @@ -293,7 +294,7 @@ func TestRepeatableSave(t *testing.T) { Schema: []byte("{\n \"title\": \"Values\"\n}"), SchemaModTime: modTime, }, - want: "bcb52ba7b7c2801be84cdc96d395f00749896a4679a7c9deacdfe934d0c49c1b", + want: "5bfea18cc3c8cbc265744bc32bffa9489a4dbe87d6b51b90f4255e4839d35e03", }, { name: "Package 2 files", @@ -305,7 +306,8 @@ func TestRepeatableSave(t *testing.T) { }, ModTime: modTime, Lock: &chart.Lock{ - Digest: "testdigest", + Digest: "testdigest", + Generated: modTime, }, Files: []*common.File{ {Name: "scheherazade/shahryar.txt", ModTime: modTime, Data: []byte("1,001 Nights")}, @@ -314,7 +316,7 @@ func TestRepeatableSave(t *testing.T) { Schema: []byte("{\n \"title\": \"Values\"\n}"), SchemaModTime: modTime, }, - want: "566bb87d0a044828e1e3acc4e9849b2c378eb9156a8662ceb618ea41b279bb10", + want: "a240365c21e0a2f4a57873132a9b686566a612d08bcb3f20c9446bfff005ccce", }, } for _, test := range tests { diff --git a/pkg/chart/v2/util/save.go b/pkg/chart/v2/util/save.go index 632588b68..e66d86991 100644 --- a/pkg/chart/v2/util/save.go +++ b/pkg/chart/v2/util/save.go @@ -246,6 +246,9 @@ func writeToTar(out *tar.Writer, name string, body []byte, modTime time.Time) er Size: int64(len(body)), ModTime: modTime, } + if h.ModTime.IsZero() { + h.ModTime = time.Now() + } if err := out.WriteHeader(h); err != nil { return err } diff --git a/pkg/chart/v2/util/save_test.go b/pkg/chart/v2/util/save_test.go index 5dc36e786..e317d1c09 100644 --- a/pkg/chart/v2/util/save_test.go +++ b/pkg/chart/v2/util/save_test.go @@ -283,13 +283,14 @@ func TestRepeatableSave(t *testing.T) { name: "Package 1 file", chart: &chart.Chart{ Metadata: &chart.Metadata{ - APIVersion: chart.APIVersionV1, + APIVersion: chart.APIVersionV2, Name: "ahab", Version: "1.2.3", }, ModTime: modTime, Lock: &chart.Lock{ - Digest: "testdigest", + Digest: "testdigest", + Generated: modTime, }, Files: []*common.File{ {Name: "scheherazade/shahryar.txt", ModTime: modTime, Data: []byte("1,001 Nights")}, @@ -297,19 +298,20 @@ func TestRepeatableSave(t *testing.T) { Schema: []byte("{\n \"title\": \"Values\"\n}"), SchemaModTime: modTime, }, - want: "5e14a06037e5d4cb277c7b21770639d4e1a337be9ae391460e50653bac5a80ed", + want: "fea2662522317b65c2788ff9e5fc446a9264830038dac618d4449493d99b3257", }, { name: "Package 2 files", chart: &chart.Chart{ Metadata: &chart.Metadata{ - APIVersion: chart.APIVersionV1, + APIVersion: chart.APIVersionV2, Name: "ahab", Version: "1.2.3", }, ModTime: modTime, Lock: &chart.Lock{ - Digest: "testdigest", + Digest: "testdigest", + Generated: modTime, }, Files: []*common.File{ {Name: "scheherazade/shahryar.txt", ModTime: modTime, Data: []byte("1,001 Nights")}, @@ -318,7 +320,7 @@ func TestRepeatableSave(t *testing.T) { Schema: []byte("{\n \"title\": \"Values\"\n}"), SchemaModTime: modTime, }, - want: "6967787da46fbfcc563cad31240e564e14f2602e6f66302129a59a9669622a36", + want: "7ae92b2f274bb51ea3f1969e4187d78cc52b5f6f663b44b8fb3b40bcb8ee46f3", }, } for _, test := range tests {