diff --git a/README.md b/README.md index c95e64c0..600aa16f 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,9 @@ helmDefaults: createNamespace: true # if used with charts museum allows to pull unstable charts for deployment, for example: if 1.2.3 and 1.2.4-dev versions exist and set to true, 1.2.4-dev will be pulled (default false) devel: true + # When set to `true`, skips running `helm dep up` and `helm dep build` on this release's chart. + # Useful when the chart is broken, like seen in https://github.com/roboll/helmfile/issues/1547 + skipDeps: false # these labels will be applied to all releases in a Helmfile. Useful in templating if you have a helmfile per environment or customer and don't want to copy the same label to each release commonLabels: @@ -193,6 +196,9 @@ releases: kubeContext: kube-context # limit the maximum number of revisions saved per release. Use 0 for no limit (default 10) historyMax: 10 + # When set to `true`, skips running `helm dep up` and `helm dep build` on this release's chart. + # Useful when the chart is broken, like seen in https://github.com/roboll/helmfile/issues/1547 + skipDeps: false # Local chart example - name: grafana # name of this release diff --git a/go.mod b/go.mod index db6d3b1d..2b2ed57a 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/spf13/cobra v0.0.3 github.com/tatsushid/go-prettytable v0.0.0-20141013043238-ed2d14c29939 github.com/urfave/cli v1.20.0 - github.com/variantdev/chartify v0.4.4 + github.com/variantdev/chartify v0.4.8 github.com/variantdev/dag v0.0.0-20191028002400-bb0b3c785363 github.com/variantdev/vals v0.10.3 go.uber.org/multierr v1.1.0 diff --git a/go.sum b/go.sum index 0ec15736..6a800286 100644 --- a/go.sum +++ b/go.sum @@ -855,6 +855,14 @@ github.com/variantdev/chartify v0.4.3 h1:CRyi9XDCXkgvvgOkNUwXp0oaIJG0BWKjbUZHN3D github.com/variantdev/chartify v0.4.3/go.mod h1:Fr4oPNJ4b19knlovn0wBoU2+MZxQdBacmBs30wwgAFk= github.com/variantdev/chartify v0.4.4 h1:ludsoqljh2HVNpZhMjtvzo5P0ntEcFqMufu6B4SfByY= github.com/variantdev/chartify v0.4.4/go.mod h1:Fr4oPNJ4b19knlovn0wBoU2+MZxQdBacmBs30wwgAFk= +github.com/variantdev/chartify v0.4.5 h1:Nt2lFV1yNnu2uvs0iAf/uyRrNtlrL74Ie/KVwBe2WqA= +github.com/variantdev/chartify v0.4.5/go.mod h1:Fr4oPNJ4b19knlovn0wBoU2+MZxQdBacmBs30wwgAFk= +github.com/variantdev/chartify v0.4.6 h1:YILsir/llPNwbITPIdQ7bCc5lYJgmK3l15jcS62v88E= +github.com/variantdev/chartify v0.4.6/go.mod h1:Fr4oPNJ4b19knlovn0wBoU2+MZxQdBacmBs30wwgAFk= +github.com/variantdev/chartify v0.4.7 h1:qBAmbMFdQ1mMLP9ZikqVLMyakkeqPKNcv/YT2laP6P4= +github.com/variantdev/chartify v0.4.7/go.mod h1:Fr4oPNJ4b19knlovn0wBoU2+MZxQdBacmBs30wwgAFk= +github.com/variantdev/chartify v0.4.8 h1:bQAlp9N1qiyG29bn39r51g1bBuDJrYdT9zxT303PhbM= +github.com/variantdev/chartify v0.4.8/go.mod h1:Fr4oPNJ4b19knlovn0wBoU2+MZxQdBacmBs30wwgAFk= github.com/variantdev/dag v0.0.0-20191028002400-bb0b3c785363 h1:KrfQBEUn+wEOQ/6UIfoqRDvn+Q/wZridQ7t0G1vQqKE= github.com/variantdev/dag v0.0.0-20191028002400-bb0b3c785363/go.mod h1:pH1TQsNSLj2uxMo9NNl9zdGy01Wtn+/2MT96BrKmVyE= github.com/variantdev/vals v0.4.0 h1:O1O7/sWhlvozcY2DjZBzlE1notxwVo6UBT1+w7HsO/k= diff --git a/pkg/state/state.go b/pkg/state/state.go index 075ce610..bc9f8221 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -139,6 +139,10 @@ type HelmSpec struct { HistoryMax *int `yaml:"historyMax,omitempty"` // CreateNamespace, when set to true (default), --create-namespace is passed to helm3 on install/upgrade (ignored for helm2) CreateNamespace *bool `yaml:"createNamespace,omitempty"` + // SkipDeps disables running `helm dependency up` and `helm dependency build` on this release's chart. + // This is relevant only when your release uses a local chart or a directory containing K8s manifests or a Kustomization + // as a Helm chart. + SkipDeps bool `yaml:"skipDeps"` TLS bool `yaml:"tls"` TLSCACert string `yaml:"tlsCACert,omitempty"` @@ -270,6 +274,11 @@ type ReleaseSpec struct { // In standard use-cases, `Namespace` should be sufficient. // Use this only when you know what you want to do! ForceNamespace string `yaml:"forceNamespace"` + + // SkipDeps disables running `helm dependency up` and `helm dependency build` on this release's chart. + // This is relevant only when your release uses a local chart or a directory containing K8s manifests or a Kustomization + // as a Helm chart. + SkipDeps *bool `yaml:"skipDeps"` } type Release struct { @@ -894,6 +903,8 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre chartName := release.Chart + isLocal := pathExists(normalizeChart(st.basePath, chartName)) + chartPath, err := st.goGetterChart(chartName, release.Directory, release.ForceGoGetter) if err != nil { results <- &chartPrepareResult{err: fmt.Errorf("release %q: %w", release.Name, err)} @@ -911,20 +922,34 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre var buildDeps bool + skipDepsGlobal := opts.SkipRepos + skipDepsRelease := release.SkipDeps != nil && *release.SkipDeps + skipDepsDefault := release.SkipDeps == nil && st.HelmDefaults.SkipDeps + skipDeps := !isLocal || skipDepsGlobal || skipDepsRelease || skipDepsDefault + if chartification != nil { c := chartify.New( chartify.HelmBin(st.DefaultHelmBinary), chartify.UseHelm3(helm3), ) - out, err := c.Chartify(release.Name, chartPath, chartify.WithChartifyOpts(chartification.Opts)) + chartifyOpts := chartification.Opts + + if skipDeps { + chartifyOpts.SkipDeps = true + } + + out, err := c.Chartify(release.Name, chartPath, chartify.WithChartifyOpts(chartifyOpts)) if err != nil { results <- &chartPrepareResult{err: err} return } else { - // TODO Chartify chartPath = out } + + // Skip `helm dep build` and `helm dep up` altogether when the chart is from remote or the dep is + // explicitly skipped. + buildDeps = !skipDeps } else if pathExists(normalizeChart(st.basePath, chartPath)) { // At this point, we are sure that chartPath is a local directory containing either: // - A remote chart fetched by go-getter or @@ -951,7 +976,7 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre // a broken remote chart won't completely block their job. chartPath = normalizeChart(st.basePath, chartPath) - buildDeps = !opts.SkipRepos + buildDeps = !skipDeps } else if !opts.ForceDownload { // At this point, we are sure that either: // 1. It is a local chart and we can use it in later process (helm upgrade/template/lint/etc)