Add support for adhoc dependency to local chart

Helmfile has been providing a feature called "adhoc chart dependency" that basially enabled you to add Chart.yaml `dependencies` entry adhocly without forking or modifying the chart.

It was missing the support for using a local chart as the adhoc dependency. This patch adds that.

Usage:

`releases[].dependencies[].chart` is enhanced to accept the fs path to the local chart:

```
releases:
- name: foo
  chart: ./path/to/foo
  dependencies:
  - chart: ./path/to/bar
```

Resolves #1762
This commit is contained in:
Yusuke Kuoka 2021-04-09 01:28:25 +00:00
parent 74cd2bc147
commit 81b04fcb8b
3 changed files with 28 additions and 27 deletions

2
go.mod
View File

@ -28,7 +28,7 @@ require (
github.com/spf13/cobra v1.1.1 github.com/spf13/cobra v1.1.1
github.com/tatsushid/go-prettytable v0.0.0-20141013043238-ed2d14c29939 github.com/tatsushid/go-prettytable v0.0.0-20141013043238-ed2d14c29939
github.com/urfave/cli v1.22.5 github.com/urfave/cli v1.22.5
github.com/variantdev/chartify v0.7.3 github.com/variantdev/chartify v0.8.0
github.com/variantdev/dag v0.0.0-20191028002400-bb0b3c785363 github.com/variantdev/dag v0.0.0-20191028002400-bb0b3c785363
github.com/variantdev/vals v0.13.0 github.com/variantdev/vals v0.13.0
go.uber.org/multierr v1.6.0 go.uber.org/multierr v1.6.0

2
go.sum
View File

@ -581,6 +581,8 @@ github.com/variantdev/chartify v0.7.2 h1:H7a9xD4rfyKkLDhCO/Oj3VfYnJRb92Dqk+GR6vp
github.com/variantdev/chartify v0.7.2/go.mod h1:qF4XzQlkfH/6k2jAi1hLas+lK4zSCa8kY+r5JdmLA68= github.com/variantdev/chartify v0.7.2/go.mod h1:qF4XzQlkfH/6k2jAi1hLas+lK4zSCa8kY+r5JdmLA68=
github.com/variantdev/chartify v0.7.3 h1:uX0mN8PmYHZDWILcg41sQfasJ7TT/CYnYWSmDgsIBIA= github.com/variantdev/chartify v0.7.3 h1:uX0mN8PmYHZDWILcg41sQfasJ7TT/CYnYWSmDgsIBIA=
github.com/variantdev/chartify v0.7.3/go.mod h1:qF4XzQlkfH/6k2jAi1hLas+lK4zSCa8kY+r5JdmLA68= github.com/variantdev/chartify v0.7.3/go.mod h1:qF4XzQlkfH/6k2jAi1hLas+lK4zSCa8kY+r5JdmLA68=
github.com/variantdev/chartify v0.8.0 h1:yIBsS/dIUeMjWP8U6JWlT3PM0Lky7en9QBi+MgDu2U8=
github.com/variantdev/chartify v0.8.0/go.mod h1:qF4XzQlkfH/6k2jAi1hLas+lK4zSCa8kY+r5JdmLA68=
github.com/variantdev/dag v0.0.0-20191028002400-bb0b3c785363 h1:KrfQBEUn+wEOQ/6UIfoqRDvn+Q/wZridQ7t0G1vQqKE= 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/dag v0.0.0-20191028002400-bb0b3c785363/go.mod h1:pH1TQsNSLj2uxMo9NNl9zdGy01Wtn+/2MT96BrKmVyE=
github.com/variantdev/vals v0.13.0 h1:zdtTBjoWKkUGdFauxETkDVjqWXdjUNwI+ggWcUmpxv8= github.com/variantdev/vals v0.13.0 h1:zdtTBjoWKkUGdFauxETkDVjqWXdjUNwI+ggWcUmpxv8=

View File

@ -4,7 +4,6 @@ import (
"fmt" "fmt"
"os" "os"
"path/filepath" "path/filepath"
"strings"
"github.com/roboll/helmfile/pkg/helmexec" "github.com/roboll/helmfile/pkg/helmexec"
"github.com/roboll/helmfile/pkg/remote" "github.com/roboll/helmfile/pkg/remote"
@ -85,7 +84,7 @@ func (st *HelmState) goGetterChart(chart, dir, cacheDir string, force bool) (str
} }
func (st *HelmState) PrepareChartify(helm helmexec.Interface, release *ReleaseSpec, chart string, workerIndex int) (*Chartify, func(), error) { func (st *HelmState) PrepareChartify(helm helmexec.Interface, release *ReleaseSpec, chart string, workerIndex int) (*Chartify, func(), error) {
chartify := &Chartify{ c := &Chartify{
Opts: &chartify.ChartifyOpts{ Opts: &chartify.ChartifyOpts{
WorkaroundOutputDirIssue: true, WorkaroundOutputDirIssue: true,
EnableKustomizeAlphaPlugins: true, EnableKustomizeAlphaPlugins: true,
@ -110,25 +109,25 @@ func (st *HelmState) PrepareChartify(helm helmexec.Interface, release *ReleaseSp
} }
for _, d := range release.Dependencies { for _, d := range release.Dependencies {
var dep string chart := d.Chart
if st.directoryExistsAt(chart) {
var err error
if d.Alias != "" { // Otherwise helm-dependency-up on the temporary chart generated by chartify ends up errors like:
dep += d.Alias + "=" // Error: directory /tmp/chartify945964195/myapp-57fb4495cf/test/integration/charts/httpbin not found]
} else { // which is due to that the temporary chart is generated outside of the current working directory/basePath,
a := strings.Split(d.Chart, "/") // and therefore the relative path in `chart` points to somewhere inexistent.
chart, err = filepath.Abs(filepath.Join(st.basePath, chart))
chart := a[len(a)-1] if err != nil {
return nil, clean, err
dep += chart + "=" }
} }
dep += d.Chart c.Opts.AdhocChartDependencies = append(c.Opts.AdhocChartDependencies, chartify.ChartDependency{
Alias: d.Alias,
if d.Version != "" { Chart: chart,
dep += ":" + d.Version Version: d.Version,
} })
chartify.Opts.AdhocChartDependencies = append(chartify.Opts.AdhocChartDependencies, dep)
shouldRun = true shouldRun = true
} }
@ -143,7 +142,7 @@ func (st *HelmState) PrepareChartify(helm helmexec.Interface, release *ReleaseSp
filesNeedCleaning = append(filesNeedCleaning, generatedFiles...) filesNeedCleaning = append(filesNeedCleaning, generatedFiles...)
for _, f := range generatedFiles { for _, f := range generatedFiles {
chartify.Opts.JsonPatches = append(chartify.Opts.JsonPatches, f) c.Opts.JsonPatches = append(c.Opts.JsonPatches, f)
} }
shouldRun = true shouldRun = true
@ -157,7 +156,7 @@ func (st *HelmState) PrepareChartify(helm helmexec.Interface, release *ReleaseSp
} }
for _, f := range generatedFiles { for _, f := range generatedFiles {
chartify.Opts.StrategicMergePatches = append(chartify.Opts.StrategicMergePatches, f) c.Opts.StrategicMergePatches = append(c.Opts.StrategicMergePatches, f)
} }
filesNeedCleaning = append(filesNeedCleaning, generatedFiles...) filesNeedCleaning = append(filesNeedCleaning, generatedFiles...)
@ -173,7 +172,7 @@ func (st *HelmState) PrepareChartify(helm helmexec.Interface, release *ReleaseSp
} }
for _, f := range generatedFiles { for _, f := range generatedFiles {
chartify.Opts.Transformers = append(chartify.Opts.Transformers, f) c.Opts.Transformers = append(c.Opts.Transformers, f)
} }
filesNeedCleaning = append(filesNeedCleaning, generatedFiles...) filesNeedCleaning = append(filesNeedCleaning, generatedFiles...)
@ -182,7 +181,7 @@ func (st *HelmState) PrepareChartify(helm helmexec.Interface, release *ReleaseSp
} }
if release.ForceNamespace != "" { if release.ForceNamespace != "" {
chartify.Opts.OverrideNamespace = release.ForceNamespace c.Opts.OverrideNamespace = release.ForceNamespace
shouldRun = true shouldRun = true
} }
@ -195,11 +194,11 @@ func (st *HelmState) PrepareChartify(helm helmexec.Interface, release *ReleaseSp
filesNeedCleaning = append(filesNeedCleaning, generatedFiles...) filesNeedCleaning = append(filesNeedCleaning, generatedFiles...)
chartify.Opts.ValuesFiles = generatedFiles c.Opts.ValuesFiles = generatedFiles
chartify.Opts.TemplateData = st.newReleaseTemplateData(release) c.Opts.TemplateData = st.newReleaseTemplateData(release)
chartify.Opts.TemplateFuncs = st.newReleaseTemplateFuncMap(dir) c.Opts.TemplateFuncs = st.newReleaseTemplateFuncMap(dir)
return chartify, clean, nil return c, clean, nil
} }
return nil, clean, nil return nil, clean, nil