@@ -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
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- }
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