Skip to content

Commit 019cf3a

Browse files
fix: late evaluate helm version
This restores the behavior that you can execute skaffold build without needing helm.
1 parent 561ce51 commit 019cf3a

File tree

1 file changed

+29
-13
lines changed
  • pkg/skaffold/render/renderer/helm

1 file changed

+29
-13
lines changed

pkg/skaffold/render/renderer/helm/helm.go

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"io"
2525
"os"
2626
"strings"
27+
"sync"
2728

2829
"github.com/blang/semver"
2930
"gopkg.in/yaml.v3"
@@ -61,7 +62,7 @@ type Helm struct {
6162
labels map[string]string
6263
enableDebug bool
6364
overrideProtocols []string
64-
helmVersion semver.Version
65+
helmVersion func(ctx context.Context) (semver.Version, error)
6566

6667
manifestOverrides map[string]string
6768
transformAllowlist map[apimachinery.GroupKind]latest.ResourceFilter
@@ -81,22 +82,16 @@ func (h Helm) ManifestOverrides() map[string]string {
8182
}
8283

8384
func New(ctx context.Context, cfg render.Config, rCfg latest.RenderConfig, labels map[string]string, configName string, manifestOverrides map[string]string) (Helm, error) {
84-
var helmVersion semver.Version
85-
var err error
86-
if RendererHelmVersionOverride != nil {
87-
helmVersion = *RendererHelmVersionOverride
88-
} else {
89-
helmVersion, err = helm.BinVer(ctx)
90-
if err != nil {
91-
return Helm{}, helm.VersionGetErr(err)
92-
}
93-
}
9485

9586
generator := generate.NewGenerator(cfg.GetWorkingDir(), rCfg.Generate, "")
9687
transformAllowlist, transformDenylist, err := util.ConsolidateTransformConfiguration(cfg)
9788
if err != nil {
9889
return Helm{}, err
9990
}
91+
92+
helmVersionStored := semver.Version{}
93+
helmVersionMutex := sync.Mutex{}
94+
10095
return Helm{
10196
configName: configName,
10297
Generator: generator,
@@ -110,8 +105,25 @@ func New(ctx context.Context, cfg render.Config, rCfg latest.RenderConfig, label
110105
labels: labels,
111106
namespace: cfg.GetKubeNamespace(),
112107
manifestOverrides: manifestOverrides,
113-
helmVersion: helmVersion,
114108

109+
helmVersion: func(ctx context.Context) (semver.Version, error) {
110+
if RendererHelmVersionOverride != nil {
111+
return *RendererHelmVersionOverride, nil
112+
}
113+
114+
helmVersionMutex.Lock()
115+
defer helmVersionMutex.Unlock()
116+
117+
if !helmVersionStored.Equals(semver.Version{}) {
118+
return helmVersionStored, nil
119+
}
120+
helmVersion, err := helm.BinVer(ctx)
121+
if err != nil {
122+
return semver.Version{}, helm.VersionGetErr(err)
123+
}
124+
helmVersionStored = helmVersion
125+
return helmVersionStored, nil
126+
},
115127
transformAllowlist: transformAllowlist,
116128
transformDenylist: transformDenylist,
117129
}, nil
@@ -147,7 +159,11 @@ func (h Helm) generateHelmManifests(ctx context.Context, builds []graph.Artifact
147159
helmEnv = append(helmEnv, filterEnv...)
148160

149161
var cleanUpPostRenderer func()
150-
cleanUpPostRenderer, postRendererArgs, err = helm.PreparePostRenderer(ctx, h, skaffoldBinary, h.helmVersion)
162+
helmVersion, err := h.helmVersion(ctx)
163+
if err != nil {
164+
return nil, fmt.Errorf("could not get helm version: %w", err)
165+
}
166+
cleanUpPostRenderer, postRendererArgs, err = helm.PreparePostRenderer(ctx, h, skaffoldBinary, helmVersion)
151167
if err != nil {
152168
return nil, err
153169
}

0 commit comments

Comments
 (0)