@@ -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,15 @@ func (h Helm) ManifestOverrides() map[string]string {
8182}
8283
8384func 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- }
94-
9585 generator := generate .NewGenerator (cfg .GetWorkingDir (), rCfg .Generate , "" )
9686 transformAllowlist , transformDenylist , err := util .ConsolidateTransformConfiguration (cfg )
9787 if err != nil {
9888 return Helm {}, err
9989 }
90+
91+ helmVersionStored := semver.Version {}
92+ helmVersionMutex := sync.Mutex {}
93+
10094 return Helm {
10195 configName : configName ,
10296 Generator : generator ,
@@ -110,8 +104,25 @@ func New(ctx context.Context, cfg render.Config, rCfg latest.RenderConfig, label
110104 labels : labels ,
111105 namespace : cfg .GetKubeNamespace (),
112106 manifestOverrides : manifestOverrides ,
113- helmVersion : helmVersion ,
114107
108+ helmVersion : func (ctx context.Context ) (semver.Version , error ) {
109+ if RendererHelmVersionOverride != nil {
110+ return * RendererHelmVersionOverride , nil
111+ }
112+
113+ helmVersionMutex .Lock ()
114+ defer helmVersionMutex .Unlock ()
115+
116+ if ! helmVersionStored .Equals (semver.Version {}) {
117+ return helmVersionStored , nil
118+ }
119+ helmVersion , err := helm .BinVer (ctx )
120+ if err != nil {
121+ return semver.Version {}, helm .VersionGetErr (err )
122+ }
123+ helmVersionStored = helmVersion
124+ return helmVersionStored , nil
125+ },
115126 transformAllowlist : transformAllowlist ,
116127 transformDenylist : transformDenylist ,
117128 }, nil
@@ -147,7 +158,11 @@ func (h Helm) generateHelmManifests(ctx context.Context, builds []graph.Artifact
147158 helmEnv = append (helmEnv , filterEnv ... )
148159
149160 var cleanUpPostRenderer func ()
150- cleanUpPostRenderer , postRendererArgs , err = helm .PreparePostRenderer (ctx , h , skaffoldBinary , h .helmVersion )
161+ helmVersion , err := h .helmVersion (ctx )
162+ if err != nil {
163+ return nil , fmt .Errorf ("could not get helm version: %w" , err )
164+ }
165+ cleanUpPostRenderer , postRendererArgs , err = helm .PreparePostRenderer (ctx , h , skaffoldBinary , helmVersion )
151166 if err != nil {
152167 return nil , err
153168 }
0 commit comments