feat: Add `helmfile template --include-crds` (#1568)

This allows you to use helmfile-template output as a GitOps source, when the template output contains CRDs and you use Helm 3.

Helm 3 by default removes CRDs from the template output. If you want to git-commit helmfile-template containing CRDs for GitOps and you use Helm 3 for templating, the only way is provide this newly added `--include-crds` flag.
This commit is contained in:
Yusuke Kuoka 2020-11-05 10:13:25 +09:00 committed by GitHub
parent bdbaa00628
commit 6b86408500
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 24 additions and 4 deletions

View File

@ -248,6 +248,10 @@ func main() {
Name: "validate", Name: "validate",
Usage: "validate your manifests against the Kubernetes cluster you are currently pointing at", Usage: "validate your manifests against the Kubernetes cluster you are currently pointing at",
}, },
cli.BoolFlag{
Name: "include-crds",
Usage: "include CRDs in the templated output",
},
cli.BoolFlag{ cli.BoolFlag{
Name: "skip-deps", Name: "skip-deps",
Usage: "skip running `helm repo update` and `helm dependency build`", Usage: "skip running `helm repo update` and `helm dependency build`",
@ -717,6 +721,10 @@ func (c configImpl) EmbedValues() bool {
return c.c.Bool("embed-values") return c.c.Bool("embed-values")
} }
func (c configImpl) IncludeCRDs() bool {
return c.c.Bool("include-crds")
}
func (c configImpl) Logger() *zap.SugaredLogger { func (c configImpl) Logger() *zap.SugaredLogger {
return c.c.App.Metadata["logger"].(*zap.SugaredLogger) return c.c.App.Metadata["logger"].(*zap.SugaredLogger)
} }

View File

@ -1433,6 +1433,7 @@ func (a *App) template(r *Run, c TemplateConfigProvider) (bool, []error) {
opts := &state.TemplateOpts{ opts := &state.TemplateOpts{
Set: c.Set(), Set: c.Set(),
IncludeCRDs: c.IncludeCRDs(),
OutputDirTemplate: c.OutputDirTemplate(), OutputDirTemplate: c.OutputDirTemplate(),
} }
return subst.TemplateReleases(helm, c.OutputDir(), c.Values(), args, c.Concurrency(), c.Validate(), opts) return subst.TemplateReleases(helm, c.OutputDir(), c.Values(), args, c.Concurrency(), c.Validate(), opts)

View File

@ -2237,10 +2237,11 @@ services:
} }
type configImpl struct { type configImpl struct {
selectors []string selectors []string
set []string set []string
output string output string
skipDeps bool includeCRDs bool
skipDeps bool
} }
func (a configImpl) Selectors() []string { func (a configImpl) Selectors() []string {
@ -2275,6 +2276,10 @@ func (c configImpl) OutputDirTemplate() string {
return "" return ""
} }
func (c configImpl) IncludeCRDs() bool {
return c.includeCRDs
}
func (c configImpl) Concurrency() int { func (c configImpl) Concurrency() int {
return 1 return 1
} }

View File

@ -133,6 +133,7 @@ type TemplateConfigProvider interface {
Validate() bool Validate() bool
SkipDeps() bool SkipDeps() bool
OutputDir() string OutputDir() string
IncludeCRDs() bool
concurrencyConfig concurrencyConfig
} }

View File

@ -1125,6 +1125,7 @@ func (st *HelmState) runHelmDepBuilds(helm helmexec.Interface, concurrency int,
type TemplateOpts struct { type TemplateOpts struct {
Set []string Set []string
OutputDirTemplate string OutputDirTemplate string
IncludeCRDs bool
} }
type TemplateOpt interface{ Apply(*TemplateOpts) } type TemplateOpt interface{ Apply(*TemplateOpts) }
@ -1197,6 +1198,10 @@ func (st *HelmState) TemplateReleases(helm helmexec.Interface, outputDir string,
flags = append(flags, "--validate") flags = append(flags, "--validate")
} }
if opts.IncludeCRDs {
flags = append(flags, "--include-crds")
}
if len(errs) == 0 { if len(errs) == 0 {
if err := helm.TemplateRelease(release.Name, release.Chart, flags...); err != nil { if err := helm.TemplateRelease(release.Name, release.Chart, flags...); err != nil {
errs = append(errs, err) errs = append(errs, err)