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
}