Skip to content

Commit

Permalink
Merge pull request GoogleContainerTools#1301 from tejal29/addRedoSnap…
Browse files Browse the repository at this point in the history
…shotter

Add redo snapshotter.
  • Loading branch information
tejal29 committed Jun 6, 2020
2 parents e73dea4 + 35d2358 commit 1033ad7
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 4 deletions.
26 changes: 26 additions & 0 deletions integration/dockerfiles/Dockerfile_test_run_redo
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Copyright 2020 Google, Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

FROM debian:9.11
RUN echo "hey" > /etc/foo
RUN echo "baz" > /etc/baz
RUN cp /etc/baz /etc/bar
RUN rm /etc/baz

# Test with ARG
ARG file
RUN echo "run" > $file

RUN echo "test home" > $HOME/file
COPY context/foo $HOME/foo
2 changes: 2 additions & 0 deletions integration/images.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ const (
// Arguments to build Dockerfiles with, used for both docker and kaniko builds
var argsMap = map[string][]string{
"Dockerfile_test_run": {"file=/file"},
"Dockerfile_test_run_redo": {"file=/file"},
"Dockerfile_test_workdir": {"workdir=/arg/workdir"},
"Dockerfile_test_add": {"file=context/foo"},
"Dockerfile_test_arg_secret": {"SSH_PRIVATE_KEY", "SSH_PUBLIC_KEY=Pµbl1cK€Y"},
Expand All @@ -74,6 +75,7 @@ var additionalDockerFlagsMap = map[string][]string{
// Arguments to build Dockerfiles with when building with kaniko
var additionalKanikoFlagsMap = map[string][]string{
"Dockerfile_test_add": {"--single-snapshot"},
"Dockerfile_test_run_redo": {"--snapshotMode=redo"},
"Dockerfile_test_scratch": {"--single-snapshot"},
"Dockerfile_test_maintainer": {"--single-snapshot"},
"Dockerfile_test_target": {"--target=second"},
Expand Down
1 change: 1 addition & 0 deletions pkg/constants/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ const (
// Various snapshot modes:
SnapshotModeTime = "time"
SnapshotModeFull = "full"
SnapshotModeRedo = "redo"

// NoBaseImage is the scratch image
NoBaseImage = "scratch"
Expand Down
11 changes: 7 additions & 4 deletions pkg/executor/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
21 changes: 21 additions & 0 deletions pkg/util/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,27 @@ 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(), 16)))
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()
Expand Down

0 comments on commit 1033ad7

Please sign in to comment.