feat: Allow overriding chart via flag (#1751)
Adds `--chart` flag for overriding the selected release's chart ad-hoc-ly like `helmfile --chart $CHART template`. This is handy when e.g. you want to have an ArgoCD application per each release in your helmfile.yaml, while also providing the ability to customize the release's chart without touching helmfile.yaml. See https://github.com/roboll/helmfile/issues/1690#issuecomment-812321354 for more context. Closes #1690
This commit is contained in:
parent
261367e7e9
commit
a161796dc4
8
main.go
8
main.go
|
|
@ -89,6 +89,10 @@ func main() {
|
|||
Name: "namespace, n",
|
||||
Usage: "Set namespace. Uses the namespace set in the context by default, and is available in templates as {{ .Namespace }}",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "chart, c",
|
||||
Usage: "Set chart. Uses the chart set in release by default, and is available in template as {{ .Chart }}",
|
||||
},
|
||||
cli.StringSliceFlag{
|
||||
Name: "selector, l",
|
||||
Usage: `Only run using the releases that match labels. Labels can take the form of foo=bar or foo!=bar.
|
||||
|
|
@ -776,6 +780,10 @@ func (c configImpl) Namespace() string {
|
|||
return c.c.GlobalString("namespace")
|
||||
}
|
||||
|
||||
func (c configImpl) Chart() string {
|
||||
return c.c.GlobalString("chart")
|
||||
}
|
||||
|
||||
func (c configImpl) FileOrDir() string {
|
||||
return c.c.GlobalString("file")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ type App struct {
|
|||
Logger *zap.SugaredLogger
|
||||
Env string
|
||||
Namespace string
|
||||
Chart string
|
||||
Selectors []string
|
||||
Args string
|
||||
ValuesFiles []string
|
||||
|
|
@ -72,6 +73,7 @@ func New(conf ConfigProvider) *App {
|
|||
Logger: conf.Logger(),
|
||||
Env: conf.Env(),
|
||||
Namespace: conf.Namespace(),
|
||||
Chart: conf.Chart(),
|
||||
Selectors: conf.Selectors(),
|
||||
Args: conf.Args(),
|
||||
FileOrDir: conf.FileOrDir(),
|
||||
|
|
@ -640,6 +642,7 @@ func (a *App) loadDesiredStateFromYaml(file string, opts ...LoadOpts) (*state.He
|
|||
directoryExistsAt: a.directoryExistsAt,
|
||||
env: a.Env,
|
||||
namespace: a.Namespace,
|
||||
chart: a.Chart,
|
||||
logger: a.Logger,
|
||||
abs: a.abs,
|
||||
remote: a.remote,
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ type ConfigProvider interface {
|
|||
FileOrDir() string
|
||||
KubeContext() string
|
||||
Namespace() string
|
||||
Chart() string
|
||||
Selectors() []string
|
||||
StateValuesSet() map[string]interface{}
|
||||
StateValuesFiles() []string
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ type desiredStateLoader struct {
|
|||
|
||||
env string
|
||||
namespace string
|
||||
chart string
|
||||
|
||||
readFile func(string) ([]byte, error)
|
||||
deleteFile func(string) error
|
||||
|
|
@ -82,6 +83,13 @@ func (ld *desiredStateLoader) Load(f string, opts LoadOpts) (*state.HelmState, e
|
|||
st.OverrideNamespace = ld.namespace
|
||||
}
|
||||
|
||||
if ld.chart != "" {
|
||||
if st.OverrideChart != "" {
|
||||
return nil, errors.New("err: Cannot use option --chart and set attribute chart.")
|
||||
}
|
||||
st.OverrideChart = ld.chart
|
||||
}
|
||||
|
||||
return st, nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,11 +3,12 @@ package app
|
|||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/roboll/helmfile/pkg/environment"
|
||||
"github.com/roboll/helmfile/pkg/state"
|
||||
"github.com/roboll/helmfile/pkg/tmpl"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func prependLineNumbers(text string) string {
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ type Bus struct {
|
|||
BasePath string
|
||||
StateFilePath string
|
||||
Namespace string
|
||||
Chart string
|
||||
|
||||
Env environment.Environment
|
||||
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ type ReleaseSetSpec struct {
|
|||
DeprecatedContext string `yaml:"context,omitempty"`
|
||||
DeprecatedReleases []ReleaseSpec `yaml:"charts,omitempty"`
|
||||
OverrideNamespace string `yaml:"namespace,omitempty"`
|
||||
OverrideChart string `yaml:"chart,omitempty"`
|
||||
Repositories []RepositorySpec `yaml:"repositories,omitempty"`
|
||||
CommonLabels map[string]string `yaml:"commonLabels,omitempty"`
|
||||
Releases []ReleaseSpec `yaml:"releases,omitempty"`
|
||||
|
|
@ -999,6 +1000,9 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre
|
|||
},
|
||||
func(workerIndex int) {
|
||||
for release := range jobQueue {
|
||||
if st.OverrideChart != "" {
|
||||
release.Chart = st.OverrideChart
|
||||
}
|
||||
// Call user-defined `prepare` hooks to create/modify local charts to be used by
|
||||
// the later process.
|
||||
//
|
||||
|
|
@ -2062,6 +2066,7 @@ func (st *HelmState) triggerGlobalReleaseEvent(evt string, evtErr error, helmfil
|
|||
StateFilePath: st.FilePath,
|
||||
BasePath: st.basePath,
|
||||
Namespace: st.OverrideNamespace,
|
||||
Chart: st.OverrideChart,
|
||||
Env: st.Env,
|
||||
Logger: st.logger,
|
||||
ReadFile: st.readFile,
|
||||
|
|
@ -2094,6 +2099,7 @@ func (st *HelmState) triggerReleaseEvent(evt string, evtErr error, r *ReleaseSpe
|
|||
StateFilePath: st.FilePath,
|
||||
BasePath: st.basePath,
|
||||
Namespace: st.OverrideNamespace,
|
||||
Chart: st.OverrideChart,
|
||||
Env: st.Env,
|
||||
Logger: st.logger,
|
||||
ReadFile: st.readFile,
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ func (st *HelmState) createReleaseTemplateData(release *ReleaseSpec, vals map[st
|
|||
tmplData := releaseTemplateData{
|
||||
Environment: st.Env,
|
||||
Namespace: st.OverrideNamespace,
|
||||
Chart: st.OverrideChart,
|
||||
Values: vals,
|
||||
Release: releaseTemplateDataRelease{
|
||||
Name: release.Name,
|
||||
|
|
|
|||
|
|
@ -34,6 +34,10 @@ type releaseTemplateData struct {
|
|||
// You should better use Release.Namespace as it might work as you'd expect even if OverrideNamespace is not set.
|
||||
// See releaseTemplateDataRelease.Namespace for more information.
|
||||
Namespace string
|
||||
// Chart is HelmState.OverrideChart.
|
||||
// You should better use Release.Chart as it might work as you'd expect even if OverrideChart is not set.
|
||||
// See releaseTemplateDataRelease.Chart for more information.
|
||||
Chart string
|
||||
}
|
||||
|
||||
type releaseTemplateDataRelease struct {
|
||||
|
|
|
|||
Loading…
Reference in New Issue