diff --git a/docs-v2/content/en/schemas/v4beta12.json b/docs-v2/content/en/schemas/v4beta12.json index 644821c8641..ab8e0e9c3fe 100755 --- a/docs-v2/content/en/schemas/v4beta12.json +++ b/docs-v2/content/en/schemas/v4beta12.json @@ -2941,6 +2941,11 @@ "x-intellij-html-description": "enables caching of copy layers.", "default": "false" }, + "cacheRunLayers": { + "type": "boolean", + "description": "enables caching of run layers (default=true).", + "x-intellij-html-description": "enables caching of run layers (default=true)." + }, "hostPath": { "type": "string", "description": "specifies a path on the host that is mounted to each pod as read only cache volume containing base images. If set, must exist on each node and prepopulated with kaniko-warmer.", @@ -2961,7 +2966,8 @@ "repo", "hostPath", "ttl", - "cacheCopyLayers" + "cacheCopyLayers", + "cacheRunLayers" ], "additionalProperties": false, "type": "object", diff --git a/pkg/skaffold/build/gcb/kaniko_test.go b/pkg/skaffold/build/gcb/kaniko_test.go index 9f4a5e5a896..6a464d6f615 100644 --- a/pkg/skaffold/build/gcb/kaniko_test.go +++ b/pkg/skaffold/build/gcb/kaniko_test.go @@ -18,6 +18,7 @@ package gcb import ( "context" + "fmt" "testing" "google.golang.org/api/cloudbuild/v1" @@ -104,6 +105,28 @@ func TestKanikoBuildSpec(t *testing.T) { kaniko.CacheCopyLayersFlag, }, }, + { + description: "with Cache Run Layers is false", + artifact: &latest.KanikoArtifact{ + DockerfilePath: "Dockerfile", + Cache: &latest.KanikoCache{CacheRunLayers: boolPtr(false)}, + }, + expectedArgs: []string{ + kaniko.CacheFlag, + fmt.Sprintf("%s=%t", kaniko.CacheRunLayersFlag, false), + }, + }, + { + description: "with Cache Run Layers is true", + artifact: &latest.KanikoArtifact{ + DockerfilePath: "Dockerfile", + Cache: &latest.KanikoCache{CacheRunLayers: boolPtr(true)}, + }, + expectedArgs: []string{ + kaniko.CacheFlag, + fmt.Sprintf("%s=%t", kaniko.CacheRunLayersFlag, true), + }, + }, { description: "with Cleanup", artifact: &latest.KanikoArtifact{ @@ -482,6 +505,10 @@ func TestKanikoBuildSpec(t *testing.T) { } } +func boolPtr(b bool) *bool { + return &b +} + type mockArtifactStore map[string]string func (m mockArtifactStore) GetImageTag(imageName string) (string, bool) { return m[imageName], true } diff --git a/pkg/skaffold/build/kaniko/args.go b/pkg/skaffold/build/kaniko/args.go index 3f6cf8246e1..ddcfcf6c9e9 100644 --- a/pkg/skaffold/build/kaniko/args.go +++ b/pkg/skaffold/build/kaniko/args.go @@ -59,6 +59,9 @@ func Args(artifact *latest.KanikoArtifact, tag, context string) ([]string, error if artifact.Cache.CacheCopyLayers { args = append(args, CacheCopyLayersFlag) } + if artifact.Cache.CacheRunLayers != nil { + args = append(args, fmt.Sprintf("%s=%t", CacheRunLayersFlag, *artifact.Cache.CacheRunLayers)) + } } if artifact.Target != "" { diff --git a/pkg/skaffold/build/kaniko/types.go b/pkg/skaffold/build/kaniko/types.go index 507311109be..9aa6d410a20 100644 --- a/pkg/skaffold/build/kaniko/types.go +++ b/pkg/skaffold/build/kaniko/types.go @@ -23,6 +23,8 @@ const ( CacheFlag = "--cache" // CacheCopyLayersFlag additional flag CacheCopyLayersFlag = "--cache-copy-layers" + // CacheRunLayersFlag additional flag + CacheRunLayersFlag = "--cache-run-layers" // CacheDirFlag additional flag CacheDirFlag = "--cache-dir" // CacheRepoFlag additional flag diff --git a/pkg/skaffold/schema/defaults/defaults.go b/pkg/skaffold/schema/defaults/defaults.go index 580f3859380..fda392e0f66 100644 --- a/pkg/skaffold/schema/defaults/defaults.go +++ b/pkg/skaffold/schema/defaults/defaults.go @@ -362,6 +362,9 @@ func setKanikoArtifactDefaults(a *latest.KanikoArtifact) { a.DockerfilePath = valueOrDefault(a.DockerfilePath, constants.DefaultDockerfilePath) a.InitImage = valueOrDefault(a.InitImage, constants.DefaultBusyboxImage) a.DigestFile = valueOrDefault(a.DigestFile, constants.DefaultKanikoDigestFile) + if a.Cache != nil { + a.Cache.CacheRunLayers = valueOrDefaultBool(a.Cache.CacheRunLayers, true) + } a.CopyMaxRetries = valueOrDefaultInt(a.CopyMaxRetries, kaniko.DefaultCopyMaxRetries) a.CopyTimeout = valueOrDefault(a.CopyTimeout, kaniko.DefaultCopyTimeout) a.BuildContextCompressionLevel = valueOrDefaultInt(a.BuildContextCompressionLevel, kaniko.DefaultBuildContextCompressionLevel) @@ -381,6 +384,13 @@ func valueOrDefaultInt(v *int, def int) *int { return &def } +func valueOrDefaultBool(v *bool, def bool) *bool { + if v != nil { + return v + } + return &def +} + func currentNamespace() (string, error) { cfg, err := kubectx.CurrentConfig() if err != nil { diff --git a/pkg/skaffold/schema/latest/config.go b/pkg/skaffold/schema/latest/config.go index fa654731042..c6cef437592 100644 --- a/pkg/skaffold/schema/latest/config.go +++ b/pkg/skaffold/schema/latest/config.go @@ -496,6 +496,8 @@ type KanikoCache struct { TTL string `yaml:"ttl,omitempty"` // CacheCopyLayers enables caching of copy layers. CacheCopyLayers bool `yaml:"cacheCopyLayers,omitempty"` + // CacheRunLayers enables caching of run layers (default=true). + CacheRunLayers *bool `yaml:"cacheRunLayers,omitempty"` } // ClusterDetails *beta* describes how to do an on-cluster build.