add another redo snapshotter

This commit is contained in:
Tejal Desai 2020-06-04 22:02:13 -07:00
parent 7ace1d6a24
commit ec3ca84ad9
4 changed files with 32 additions and 6 deletions

View File

@ -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

View File

@ -47,6 +47,7 @@ const (
// Various snapshot modes:
SnapshotModeTime = "time"
SnapshotModeFull = "full"
SnapshotModeRedo = "redo"
// NoBaseImage is the scratch image
NoBaseImage = "scratch"

View File

@ -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 {

View File

@ -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()