Skip to content
This repository was archived by the owner on Mar 24, 2023. It is now read-only.

Commit ce852d3

Browse files
authored
Merge pull request #136 from dexhorthy/fix-helm-chart-deps
Fix helm location, fetch deps
2 parents 298bf39 + 4b2aaeb commit ce852d3

File tree

5 files changed

+134
-24
lines changed

5 files changed

+134
-24
lines changed

examples/helm/github.yml

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
assets:
2+
v1:
3+
- github:
4+
repo: kubernetes/charts
5+
path: stable/jasperreports
6+
ref: fd35ab34bfd26878fb5970fbc7c3e75760df10ec
7+
source: public
8+
dest: jasperreports
9+
- helm:
10+
dest: charts
11+
github:
12+
repo: kubernetes/charts
13+
path: stable/jasperreports
14+
ref: fd35ab34bfd26878fb5970fbc7c3e75760df10ec
15+
source: public
16+
17+
config:
18+
v1: []
19+
20+
lifecycle:
21+
v1:
22+
- render: {}

pkg/e2e/vendor_client.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,8 @@ mutation($channelId: ID!, $semver: String!, $spec: String!, $releaseNotes: Strin
6161
semver: $semver
6262
spec: $spec
6363
releaseNotes: $releaseNotes
64-
)
64+
) {
65+
id }
6566
}`,
6667
Variables: map[string]string{
6768
"spec": spec,

pkg/lifecycle/render/helm/fetch.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func (f *ClientFetcher) FetchChart(
6666
return "", errors.Wrap(err, "fetch github asset")
6767
}
6868

69-
return checkoutDir, nil
69+
return path.Join(checkoutDir, asset.GitHub.Path), nil
7070
}
7171

7272
debug.Log("event", "chart.fetch.fail", "reason", "unsupported")

pkg/lifecycle/render/helm/template.go

+96-21
Original file line numberDiff line numberDiff line change
@@ -73,25 +73,23 @@ func (f *ForkTemplater) Template(
7373
cmd.Args = append(cmd.Args, asset.HelmOpts...)
7474
}
7575

76-
configCtx, err := f.BuilderBuilder.NewConfigContext(configGroups, templateContext)
76+
args, err := f.appendHelmValues(configGroups, templateContext, asset)
7777
if err != nil {
78-
return errors.Wrap(err, "create config context")
78+
return errors.Wrap(err, "build helm values")
7979
}
80-
builder := f.BuilderBuilder.NewBuilder(
81-
f.BuilderBuilder.NewStaticContext(),
82-
configCtx,
83-
)
80+
cmd.Args = append(cmd.Args, args...)
8481

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")
9185
}
9286

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+
}
9491

92+
stdout, stderr, err := f.fork(cmd)
9593
if err != nil {
9694
debug.Log("event", "cmd.err")
9795
if exitError, ok := err.(*exec.ExitError); ok && !exitError.Success() {
@@ -104,21 +102,52 @@ func (f *ForkTemplater) Template(
104102
return nil
105103
}
106104

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) {
108137
stringValue, ok := value.(string)
109138
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
113142
}
114143

115144
renderedValue, err := builder.String(stringValue)
116145
if err != nil {
117-
return errors.Wrapf(err, "render value for %s", key)
146+
return nil, errors.Wrapf(err, "render value for %s", key)
118147
}
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
122151
}
123152

124153
func (f *ForkTemplater) fork(cmd *exec.Cmd) ([]byte, []byte, error) {
@@ -164,6 +193,52 @@ func (f *ForkTemplater) fork(cmd *exec.Cmd) ([]byte, []byte, error) {
164193

165194
return stdout, stderr, err
166195
}
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+
}
167242

168243
// NewTemplater returns a configured Templater. For now we just always fork
169244
func NewTemplater(

pkg/lifecycle/render/helm/template_test.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,19 @@ func TestMockHelm(t *testing.T) {
193193
return
194194
}
195195

196+
receivedArgs := os.Args[2:]
197+
expectInit := []string{"init", "--client-only"}
198+
expectUpdate := []string{"dependency", "update", "/tmp/chartroot"}
199+
if reflect.DeepEqual(receivedArgs, expectInit) {
200+
// we good, these are exepcted calls, and we just need to test one type of forking
201+
os.Exit(0)
202+
}
203+
204+
if reflect.DeepEqual(receivedArgs, expectUpdate) {
205+
// we good, these are exepcted calls
206+
os.Exit(0)
207+
}
208+
196209
if os.Getenv("CRASHING_HELM_ERROR") != "" {
197210
fmt.Fprintf(os.Stdout, os.Getenv("CRASHING_HELM_ERROR"))
198211
os.Exit(1)
@@ -201,7 +214,6 @@ func TestMockHelm(t *testing.T) {
201214
if os.Getenv("EXPECT_HELM_ARGV") != "" {
202215
// this is janky, but works for our purposes, use pipe | for separator, since its unlikely to be in argv
203216
expectedArgs := strings.Split(os.Getenv("EXPECT_HELM_ARGV"), "|")
204-
receivedArgs := os.Args[2:]
205217

206218
fmt.Fprintf(os.Stderr, "expected args %v, got args %v", expectedArgs, receivedArgs)
207219
if !reflect.DeepEqual(receivedArgs, expectedArgs) {

0 commit comments

Comments
 (0)