@@ -73,25 +73,23 @@ func (f *ForkTemplater) Template(
73
73
cmd .Args = append (cmd .Args , asset .HelmOpts ... )
74
74
}
75
75
76
- configCtx , err := f .BuilderBuilder . NewConfigContext (configGroups , templateContext )
76
+ args , err := f .appendHelmValues (configGroups , templateContext , asset )
77
77
if err != nil {
78
- return errors .Wrap (err , "create config context " )
78
+ return errors .Wrap (err , "build helm values " )
79
79
}
80
- builder := f .BuilderBuilder .NewBuilder (
81
- f .BuilderBuilder .NewStaticContext (),
82
- configCtx ,
83
- )
80
+ cmd .Args = append (cmd .Args , args ... )
84
81
85
- if asset .Values != nil {
86
- for key , value := range asset .Values {
87
- if err := appendHelmValue (value , builder , cmd , key ); err != nil {
88
- return errors .Wrapf (err , "append helm value %s" , key )
89
- }
90
- }
82
+ err = f .helmInitClient (chartRoot )
83
+ if err != nil {
84
+ return errors .Wrap (err , "init helm client" )
91
85
}
92
86
93
- stdout , stderr , err := f .fork (cmd )
87
+ err = f .helmDependencyUpdate (chartRoot )
88
+ if err != nil {
89
+ return errors .Wrap (err , "update helm dependencies" )
90
+ }
94
91
92
+ stdout , stderr , err := f .fork (cmd )
95
93
if err != nil {
96
94
debug .Log ("event" , "cmd.err" )
97
95
if exitError , ok := err .(* exec.ExitError ); ok && ! exitError .Success () {
@@ -104,21 +102,52 @@ func (f *ForkTemplater) Template(
104
102
return nil
105
103
}
106
104
107
- func appendHelmValue (value interface {}, builder templates.Builder , cmd * exec.Cmd , key string ) error {
105
+ func (f * ForkTemplater ) appendHelmValues (
106
+ configGroups []libyaml.ConfigGroup ,
107
+ templateContext map [string ]interface {},
108
+ asset api.HelmAsset ,
109
+ ) ([]string , error ) {
110
+ var cmdArgs []string
111
+ configCtx , err := f .BuilderBuilder .NewConfigContext (configGroups , templateContext )
112
+ if err != nil {
113
+ return nil , errors .Wrap (err , "create config context" )
114
+ }
115
+ builder := f .BuilderBuilder .NewBuilder (
116
+ f .BuilderBuilder .NewStaticContext (),
117
+ configCtx ,
118
+ )
119
+ if asset .Values != nil {
120
+ for key , value := range asset .Values {
121
+ args , err := appendHelmValue (value , builder , cmdArgs , key )
122
+ if err != nil {
123
+ return nil , errors .Wrapf (err , "append helm value %s" , key )
124
+ }
125
+ cmdArgs = append (cmdArgs , args ... )
126
+ }
127
+ }
128
+ return cmdArgs , nil
129
+ }
130
+
131
+ func appendHelmValue (
132
+ value interface {},
133
+ builder templates.Builder ,
134
+ args []string ,
135
+ key string ,
136
+ ) ([]string , error ) {
108
137
stringValue , ok := value .(string )
109
138
if ! ok {
110
- cmd . Args = append (cmd . Args , "--set" )
111
- cmd . Args = append (cmd . Args , fmt .Sprintf ("%s=%s" , key , value ))
112
- return nil
139
+ args = append (args , "--set" )
140
+ args = append (args , fmt .Sprintf ("%s=%s" , key , value ))
141
+ return args , nil
113
142
}
114
143
115
144
renderedValue , err := builder .String (stringValue )
116
145
if err != nil {
117
- return errors .Wrapf (err , "render value for %s" , key )
146
+ return nil , errors .Wrapf (err , "render value for %s" , key )
118
147
}
119
- cmd . Args = append (cmd . Args , "--set" )
120
- cmd . Args = append (cmd . Args , fmt .Sprintf ("%s=%s" , key , renderedValue ))
121
- return nil
148
+ args = append (args , "--set" )
149
+ args = append (args , fmt .Sprintf ("%s=%s" , key , renderedValue ))
150
+ return args , nil
122
151
}
123
152
124
153
func (f * ForkTemplater ) fork (cmd * exec.Cmd ) ([]byte , []byte , error ) {
@@ -164,6 +193,52 @@ func (f *ForkTemplater) fork(cmd *exec.Cmd) ([]byte, []byte, error) {
164
193
165
194
return stdout , stderr , err
166
195
}
196
+ func (f * ForkTemplater ) helmDependencyUpdate (chartRoot string ) error {
197
+ debug := level .Debug (log .With (f .Logger , "step.type" , "render" , "render.phase" , "execute" , "asset.type" , "helm" , "render.step" , "helm.dependencyUpdate" ))
198
+ cmd := f .Helm ()
199
+ cmd .Args = append (cmd .Args ,
200
+ "dependency" ,
201
+ "update" ,
202
+ chartRoot ,
203
+ )
204
+
205
+ debug .Log ("event" , "helm.update" , "args" , cmd .Args )
206
+
207
+ stdout , stderr , err := f .fork (cmd )
208
+
209
+ if err != nil {
210
+ debug .Log ("event" , "cmd.err" )
211
+ if exitError , ok := err .(* exec.ExitError ); ok && ! exitError .Success () {
212
+ return errors .Errorf (`execute helm dependency update: %s: stdout: "%s"; stderr: "%s";` , exitError .Error (), stdout , stderr )
213
+ }
214
+ return errors .Wrap (err , "execute helm dependency update" )
215
+ }
216
+
217
+ return nil
218
+ }
219
+
220
+ func (f * ForkTemplater ) helmInitClient (chartRoot string ) error {
221
+ debug := level .Debug (log .With (f .Logger , "step.type" , "render" , "render.phase" , "execute" , "asset.type" , "helm" ))
222
+ cmd := f .Helm ()
223
+ cmd .Args = append (cmd .Args ,
224
+ "init" ,
225
+ "--client-only" ,
226
+ )
227
+
228
+ debug .Log ("event" , "helm.initClient" , "args" , cmd .Args )
229
+
230
+ stdout , stderr , err := f .fork (cmd )
231
+
232
+ if err != nil {
233
+ debug .Log ("event" , "cmd.err" )
234
+ if exitError , ok := err .(* exec.ExitError ); ok && ! exitError .Success () {
235
+ return errors .Errorf (`execute helm dependency update: %s: stdout: "%s"; stderr: "%s";` , exitError .Error (), stdout , stderr )
236
+ }
237
+ return errors .Wrap (err , "execute helm dependency update" )
238
+ }
239
+
240
+ return nil
241
+ }
167
242
168
243
// NewTemplater returns a configured Templater. For now we just always fork
169
244
func NewTemplater (
0 commit comments