diff --git a/docs-v2/content/en/schemas/v4beta12.json b/docs-v2/content/en/schemas/v4beta12.json index 24cd4c39e4d..6c2485a637e 100755 --- a/docs-v2/content/en/schemas/v4beta12.json +++ b/docs-v2/content/en/schemas/v4beta12.json @@ -2442,6 +2442,12 @@ "x-intellij-html-description": "should build dependencies be skipped. Ignored for remoteChart.", "default": "false" }, + "skipBuildDependenciesRefresh": { + "type": "boolean", + "description": "determines whether the refresh of already built dependencies should be skipped. If set to `true`, passes `--skip-refresh` flag to `helm dep build` command. Ignored when `skipBuildDependencies` is `false`.", + "x-intellij-html-description": "determines whether the refresh of already built dependencies should be skipped. If set to true, passes --skip-refresh flag to helm dep build command. Ignored when skipBuildDependencies is false.", + "default": "false" + }, "skipTests": { "type": "boolean", "description": "should ignore helm test during manifests generation.", @@ -2494,6 +2500,7 @@ "wait", "recreatePods", "skipBuildDependencies", + "skipBuildDependenciesRefresh", "skipTests", "useHelmSecrets", "repo", diff --git a/pkg/skaffold/render/renderer/helm/helm.go b/pkg/skaffold/render/renderer/helm/helm.go index b442214e5a6..68da6694dba 100644 --- a/pkg/skaffold/render/renderer/helm/helm.go +++ b/pkg/skaffold/render/renderer/helm/helm.go @@ -143,6 +143,14 @@ func (h Helm) generateHelmManifests(ctx context.Context, builds []graph.Artifact return manifests, nil } +func buildDepBuildArgs(skipBuildDependenciesRefresh bool) []string { + args := []string{"dep", "build"} + if skipBuildDependenciesRefresh { + args = append(args, "--skip-refresh") + } + return args +} + func (h Helm) generateHelmManifest(ctx context.Context, builds []graph.Artifact, release latest.HelmRelease, env, additionalArgs []string) ([]byte, error) { releaseName, err := sUtil.ExpandEnvTemplateOrFail(release.Name, nil) if err != nil { @@ -208,7 +216,8 @@ func (h Helm) generateHelmManifest(ctx context.Context, builds []graph.Artifact, // Build Chart dependencies, but allow a user to skip it. if !release.SkipBuildDependencies && release.ChartPath != "" { log.Entry(ctx).Info("Building helm dependencies...") - if err := helm.ExecWithStdoutAndStderr(ctx, h, io.Discard, errBuffer, false, env, "dep", "build", release.ChartPath); err != nil { + cmdArgs := buildDepBuildArgs(release.SkipBuildDependenciesRefresh) + if err := helm.ExecWithStdoutAndStderr(ctx, h, io.Discard, errBuffer, false, env, cmdArgs...); err != nil { log.Entry(ctx).Info(errBuffer.String()) return nil, helm.UserErr("building helm dependencies", err) } diff --git a/pkg/skaffold/render/renderer/helm/helm_test.go b/pkg/skaffold/render/renderer/helm/helm_test.go new file mode 100644 index 00000000000..f717e87769a --- /dev/null +++ b/pkg/skaffold/render/renderer/helm/helm_test.go @@ -0,0 +1,49 @@ +/* +Copyright 2025 The Skaffold Authors + +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. +*/ + +package helm + +import ( + "testing" + + "github.com/GoogleContainerTools/skaffold/v2/testutil" +) + +func TestBuildDepBuildArgs(t *testing.T) { + tests := []struct { + description string + skipBuildDependenciesRefresh bool + expected []string + }{ + { + description: "build args without skipBuildDependenciesRefresh", + skipBuildDependenciesRefresh: false, + expected: []string{"dep", "build"}, + }, + { + description: "build args with skipBuildDependenciesRefresh", + skipBuildDependenciesRefresh: true, + expected: []string{"dep", "build", "--skip-refresh"}, + }, + } + + for _, test := range tests { + testutil.Run(t, test.description, func(t *testutil.T) { + args := buildDepBuildArgs(test.skipBuildDependenciesRefresh) + t.CheckDeepEqual(test.expected, args) + }) + } +} diff --git a/pkg/skaffold/schema/latest/config.go b/pkg/skaffold/schema/latest/config.go index 90865a21b04..7f2a58735d9 100644 --- a/pkg/skaffold/schema/latest/config.go +++ b/pkg/skaffold/schema/latest/config.go @@ -1050,6 +1050,11 @@ type HelmRelease struct { // Ignored for `remoteChart`. SkipBuildDependencies bool `yaml:"skipBuildDependencies,omitempty"` + // SkipBuildDependenciesRefresh determines whether the refresh of already built dependencies should be skipped. + // If set to `true`, passes `--skip-refresh` flag to `helm dep build` command. + // Ignored when `skipBuildDependencies` is `false`. + SkipBuildDependenciesRefresh bool `yaml:"skipBuildDependenciesRefresh,omitempty"` + // SkipTests should ignore helm test during manifests generation. // Defaults to `false` SkipTests bool `yaml:"skipTests,omitempty"` @@ -1856,7 +1861,6 @@ func (clusterDetails *ClusterDetails) UnmarshalYAML(value *yaml.Node) error { // Unmarshal the remaining values aux := (*ClusterDetailsForUnmarshaling)(clusterDetails) err = yaml.Unmarshal(remaining, aux) - if err != nil { return err } @@ -1883,7 +1887,6 @@ func (ka *KanikoArtifact) UnmarshalYAML(value *yaml.Node) error { // Unmarshal the remaining values aux := (*KanikoArtifactForUnmarshaling)(ka) err = yaml.Unmarshal(remaining, aux) - if err != nil { return err }