From ec3ca84ad92645d60ecb92fb79cf7726e589748a Mon Sep 17 00:00:00 2001 From: Tejal Desai Date: Thu, 4 Jun 2020 22:02:13 -0700 Subject: [PATCH] add another redo snapshotter --- Makefile | 4 ++-- pkg/constants/constants.go | 1 + pkg/executor/build.go | 11 +++++++---- pkg/util/util.go | 22 ++++++++++++++++++++++ 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 0966fe693..1d2e4aeb7 100644 --- a/Makefile +++ b/Makefile @@ -88,8 +88,8 @@ integration-test-misc: .PHONY: images images: - docker build ${BUILD_ARG} --build-arg=GOARCH=$(GOARCH) -t $(REGISTRY)/executor:latest -f deploy/Dockerfile . - docker build ${BUILD_ARG} --build-arg=GOARCH=$(GOARCH) -t $(REGISTRY)/executor:debug -f deploy/Dockerfile_debug . + docker build ${BUILD_ARG} --build-arg=GOARCH=$(GOARCH) -t $(REGISTRY)/executor:perf-latest -f deploy/Dockerfile . + docker build ${BUILD_ARG} --build-arg=GOARCH=$(GOARCH) -t $(REGISTRY)/executor:perf-debug -f deploy/Dockerfile_debug . docker build ${BUILD_ARG} --build-arg=GOARCH=$(GOARCH) -t $(REGISTRY)/warmer:latest -f deploy/Dockerfile_warmer . .PHONY: push diff --git a/pkg/constants/constants.go b/pkg/constants/constants.go index aaa0c815a..0d6ddc9f5 100644 --- a/pkg/constants/constants.go +++ b/pkg/constants/constants.go @@ -47,6 +47,7 @@ const ( // Various snapshot modes: SnapshotModeTime = "time" SnapshotModeFull = "full" + SnapshotModeRedo = "redo" // NoBaseImage is the scratch image NoBaseImage = "scratch" diff --git a/pkg/executor/build.go b/pkg/executor/build.go index d05ddecaa..87c8cad43 100644 --- a/pkg/executor/build.go +++ b/pkg/executor/build.go @@ -808,14 +808,17 @@ func saveStageAsTarball(path string, image v1.Image) error { } func getHasher(snapshotMode string) (func(string) (string, error), error) { - if snapshotMode == constants.SnapshotModeTime { + switch snapshotMode { + case constants.SnapshotModeTime: logrus.Info("Only file modification time will be considered when snapshotting") return util.MtimeHasher(), nil - } - if snapshotMode == constants.SnapshotModeFull { + case constants.SnapshotModeFull: return util.Hasher(), nil + case constants.SnapshotModeRedo: + return util.RedoHasher(), nil + default: + return nil, fmt.Errorf("%s is not a valid snapshot mode", snapshotMode) } - return nil, fmt.Errorf("%s is not a valid snapshot mode", snapshotMode) } func resolveOnBuild(stage *config.KanikoStage, config *v1.Config, stageNameToIdx map[string]string) error { diff --git a/pkg/util/util.go b/pkg/util/util.go index a1dd77f4f..72fac9df5 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -115,6 +115,28 @@ func MtimeHasher() func(string) (string, error) { return hasher } +// RedoHasher returns a hash function, which looks at mtime, size, filemode, owner uid and gid +// Note that the mtime can lag, so it's possible that a file will have changed but the mtime may look the same. +func RedoHasher() func(string) (string, error) { + hasher := func(p string) (string, error) { + h := md5.New() + fi, err := os.Lstat(p) + if err != nil { + return "", err + } + h.Write([]byte(fi.Mode().String())) + h.Write([]byte(fi.ModTime().String())) + h.Write([]byte(strconv.FormatInt(fi.Size(), 64))) + h.Write([]byte(strconv.FormatUint(uint64(fi.Sys().(*syscall.Stat_t).Uid), 36))) + h.Write([]byte(",")) + h.Write([]byte(strconv.FormatUint(uint64(fi.Sys().(*syscall.Stat_t).Gid), 36))) + + return hex.EncodeToString(h.Sum(nil)), nil + } + return hasher +} + + // SHA256 returns the shasum of the contents of r func SHA256(r io.Reader) (string, error) { hasher := sha256.New()