From 5ab6399ada2e65e8b8d6640f969d6baae911c49f Mon Sep 17 00:00:00 2001 From: Tamal Saha Date: Thu, 6 May 2021 20:38:41 -0700 Subject: [PATCH] Generate reproducible tarball Signed-off-by: Tamal Saha --- pkg/chartutil/save.go | 15 ++++++++++----- pkg/chartutil/save_test.go | 11 +++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pkg/chartutil/save.go b/pkg/chartutil/save.go index 2ce4eddaf..0bffae15b 100644 --- a/pkg/chartutil/save.go +++ b/pkg/chartutil/save.go @@ -23,7 +23,7 @@ import ( "fmt" "os" "path/filepath" - "time" + "sort" "github.com/pkg/errors" "sigs.k8s.io/yaml" @@ -203,6 +203,9 @@ func writeTarContents(out *tar.Writer, c *chart.Chart, prefix string) error { } // Save templates + sort.Slice(c.Templates, func(i, j int) bool { + return c.Templates[i].Name < c.Templates[j].Name + }) for _, f := range c.Templates { n := filepath.Join(base, f.Name) if err := writeToTar(out, n, f.Data); err != nil { @@ -211,6 +214,9 @@ func writeTarContents(out *tar.Writer, c *chart.Chart, prefix string) error { } // Save files + sort.Slice(c.Files, func(i, j int) bool { + return c.Files[i].Name < c.Files[j].Name + }) for _, f := range c.Files { n := filepath.Join(base, f.Name) if err := writeToTar(out, n, f.Data); err != nil { @@ -231,10 +237,9 @@ func writeTarContents(out *tar.Writer, c *chart.Chart, prefix string) error { func writeToTar(out *tar.Writer, name string, body []byte) error { // TODO: Do we need to create dummy parent directory names if none exist? h := &tar.Header{ - Name: filepath.ToSlash(name), - Mode: 0644, - Size: int64(len(body)), - ModTime: time.Now(), + Name: filepath.ToSlash(name), + Mode: 0644, + Size: int64(len(body)), } if err := out.WriteHeader(h); err != nil { return err diff --git a/pkg/chartutil/save_test.go b/pkg/chartutil/save_test.go index b4951535a..94b36d3d7 100644 --- a/pkg/chartutil/save_test.go +++ b/pkg/chartutil/save_test.go @@ -123,12 +123,7 @@ func Indent(n int, text string) string { return startOfLine.ReplaceAllLiteralString(text, indentation) } -func TestSavePreservesTimestamps(t *testing.T) { - // Test executes so quickly that if we don't subtract a second, the - // check will fail because `initialCreateTime` will be identical to the - // written timestamp for the files. - initialCreateTime := time.Now().Add(-1 * time.Second) - +func TestSaveZerosOutTimestamps(t *testing.T) { tmp, err := ioutil.TempDir("", "helm-") if err != nil { t.Fatal(err) @@ -162,8 +157,8 @@ func TestSavePreservesTimestamps(t *testing.T) { } for _, header := range allHeaders { - if header.ModTime.Before(initialCreateTime) { - t.Fatalf("File timestamp not preserved: %v", header.ModTime) + if header.ModTime != time.Unix(0, 0) { + t.Fatalf("File %s timestamp is not zero", header.Name) } } }