From 68432b1848783640ee8a407edd825f82ca8819fe Mon Sep 17 00:00:00 2001 From: Yusuke Kuoka Date: Wed, 27 May 2020 21:13:05 +0900 Subject: [PATCH] fix: Do not skip passing values files when adhocDependencies/jsonPatches/jsonPatches exist This is a follow-up for #1172 --- pkg/state/helmx.go | 22 +++++++++++--- pkg/state/state.go | 76 +++++++++++++++++++++++++++++++++++++--------- 2 files changed, 79 insertions(+), 19 deletions(-) diff --git a/pkg/state/helmx.go b/pkg/state/helmx.go index afc5f99a..9f1abb47 100644 --- a/pkg/state/helmx.go +++ b/pkg/state/helmx.go @@ -1,6 +1,7 @@ package state import ( + "github.com/roboll/helmfile/pkg/helmexec" "github.com/variantdev/chartify" "strings" ) @@ -19,11 +20,15 @@ func (st *HelmState) appendHelmXFlags(flags []string, release *ReleaseSpec) ([]s return flags, nil } -func (st *HelmState) PrepareChartify(release *ReleaseSpec) (bool, *chartify.ChartifyOpts) { +func (st *HelmState) PrepareChartify(helm helmexec.Interface, release *ReleaseSpec, workerIndex int) (bool, *chartify.ChartifyOpts, error) { var opts chartify.ChartifyOpts var shouldRun bool + opts.EnableKustomizeAlphaPlugins = true + + opts.ChartVersion = release.Version + for _, d := range release.Dependencies { var dep string @@ -52,7 +57,7 @@ func (st *HelmState) PrepareChartify(release *ReleaseSpec) (bool, *chartify.Char if len(jsonPatches) > 0 { generatedFiles, err := st.generateTemporaryValuesFiles(jsonPatches, release.MissingFileHandler) if err != nil { - return false, nil + return false, nil, err } for _, f := range generatedFiles { @@ -68,7 +73,7 @@ func (st *HelmState) PrepareChartify(release *ReleaseSpec) (bool, *chartify.Char if len(strategicMergePatches) > 0 { generatedFiles, err := st.generateTemporaryValuesFiles(strategicMergePatches, release.MissingFileHandler) if err != nil { - return false, nil + return false, nil, err } for _, f := range generatedFiles { @@ -80,5 +85,14 @@ func (st *HelmState) PrepareChartify(release *ReleaseSpec) (bool, *chartify.Char shouldRun = true } - return shouldRun, &opts + if shouldRun { + generatedFiles, err := st.generateValuesFiles(helm, release, workerIndex) + if err != nil { + return false, nil, err + } + + opts.ValuesFiles = generatedFiles + } + + return shouldRun, &opts, nil } diff --git a/pkg/state/state.go b/pkg/state/state.go index 415f5d2f..21804a31 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -718,6 +718,7 @@ func PrepareCharts(helm helmexec.Interface, st *HelmState, dir string, concurren type downloadResults struct { releaseName string chartPath string + err error } errs := []error{} @@ -739,11 +740,17 @@ func PrepareCharts(helm helmexec.Interface, st *HelmState, dir string, concurren } close(jobQueue) }, - func(_ int) { + func(workerIndex int) { for release := range jobQueue { var chartPath string - if shouldChartify, opts := st.PrepareChartify(release); shouldChartify { + shouldChartify, opts, err := st.PrepareChartify(helm, release, workerIndex) + if err != nil { + results <- &downloadResults{err: err} + return + } + + if shouldChartify { c := chartify.New( chartify.HelmBin(st.DefaultHelmBinary), chartify.UseHelm3(helm3), @@ -787,12 +794,18 @@ func PrepareCharts(helm helmexec.Interface, st *HelmState, dir string, concurren } } - results <- &downloadResults{release.Name, chartPath} + results <- &downloadResults{releaseName: release.Name, chartPath: chartPath} } }, func() { for i := 0; i < len(st.Releases); i++ { downloadRes := <-results + + if downloadRes.err != nil { + errs = append(errs, downloadRes.err) + + return + } temp[downloadRes.releaseName] = downloadRes.chartPath } }, @@ -1886,12 +1899,7 @@ func (st *HelmState) generateTemporaryValuesFiles(values []interface{}, missingF return generatedFiles, nil } -func (st *HelmState) namespaceAndValuesFlags(helm helmexec.Interface, release *ReleaseSpec, workerIndex int) ([]string, error) { - flags := []string{} - if release.Namespace != "" { - flags = append(flags, "--namespace", release.Namespace) - } - +func (st *HelmState) generateVanillaValuesFiles(release *ReleaseSpec) ([]string, error) { values := []interface{}{} for _, v := range release.Values { switch typedValue := v.(type) { @@ -1918,12 +1926,14 @@ func (st *HelmState) namespaceAndValuesFlags(helm helmexec.Interface, release *R return nil, err } - for _, f := range generatedFiles { - flags = append(flags, "--values", f) - } - release.generatedValues = append(release.generatedValues, generatedFiles...) + return generatedFiles, nil +} + +func (st *HelmState) generateSecretValuesFiles(helm helmexec.Interface, release *ReleaseSpec, workerIndex int) ([]string, error) { + var generatedFiles []string + for _, value := range release.Secrets { paths, skip, err := st.storage().resolveFile(release.MissingFileHandler, "secrets", release.ValuesPathPrefix+value) if err != nil { @@ -1944,9 +1954,45 @@ func (st *HelmState) namespaceAndValuesFlags(helm helmexec.Interface, release *R return nil, err } - release.generatedValues = append(release.generatedValues, valfile) - flags = append(flags, "--values", valfile) + generatedFiles = append(generatedFiles, valfile) + } + + release.generatedValues = append(release.generatedValues, generatedFiles...) + + return generatedFiles, nil +} + +func (st *HelmState) generateValuesFiles(helm helmexec.Interface, release *ReleaseSpec, workerIndex int) ([]string, error) { + valuesFiles, err := st.generateVanillaValuesFiles(release) + if err != nil { + return nil, err + } + + secretValuesFiles, err := st.generateSecretValuesFiles(helm, release, workerIndex) + if err != nil { + return nil, err + } + + files := append(valuesFiles, secretValuesFiles...) + + return files, nil +} + +func (st *HelmState) namespaceAndValuesFlags(helm helmexec.Interface, release *ReleaseSpec, workerIndex int) ([]string, error) { + flags := []string{} + if release.Namespace != "" { + flags = append(flags, "--namespace", release.Namespace) } + + generatedFiles, err := st.generateValuesFiles(helm, release, workerIndex) + if err != nil { + return nil, err + } + + for _, f := range generatedFiles { + flags = append(flags, "--values", f) + } + if len(release.SetValues) > 0 { for _, set := range release.SetValues { if set.Value != "" {