diff --git a/docs/advanced-features.md b/docs/advanced-features.md index faaddf88..526a48e4 100644 --- a/docs/advanced-features.md +++ b/docs/advanced-features.md @@ -1,6 +1,8 @@ ## Advanced Features - [Import Configuration Parameters into Helmfile](#import-configuration-parameters-into-helmfile) +- [Deploy Kustomization with Helmfile](#deploy-kustomizations-with-helmfile) +- [Adhoc Kustomization of Helm Charts](#adhoc-kustomization-of-helm-charts) ### Import Configuration Parameters into Helmfile @@ -35,7 +37,7 @@ $ somehow_generate_chart_yaml ${TMPCHART}/Chart.yaml $ TMPKUSTOMIZATION=/tmp/sometmpdir2 $ somehow_generate_temp_kustomization_yaml ${TMPKUSTOMIZATION}/kustomization.yaml -$ kustomize build ${TMPKUSTOMIZATION}/kustomization.yaml > ${TMPCHART}/templates/all.yaml +$ kustomize build ${TMPKUSTOMIZATION}/kustomization.yaml > ${TMPCHART}/templates/all.yaml ``` Let's say you have a `helmfile.yaml` that looks like the below: @@ -57,7 +59,7 @@ bases: Followed by the below steps: -- Running `kustomize edit set image $IMAGE` for every `$IMAGE` generated from your values.yaml +- Running `kustomize edit set image $IMAGE` for every `$IMAGE` generated from your values.yaml - Running `kustomize edit set nameprefix $NAMEPREFIX` with the nameprefix specified in your values.yaml - Running `kustomize edit set namesuffix $NAMESUFFIX` with the namesuffix specified in your values.yaml - Running `kustomize edit set namespace $NS` with the namespace specified in your values.yaml @@ -92,7 +94,17 @@ After all, Helmfile just installs the temporary chart like standard charts, whic Please also see [test/advanced/helmfile.yaml](https://github.com/roboll/helmfile/tree/master/test/advanced/helmfile.yaml) for an example of kustomization support and more. -## Adhoc Customization of Helm charts +### Adhoc Kustomization of Helm charts + +With Helmfile's integration with Helmfile, not only deploying Kustomization as a Helm chart, you can kustomize charts before installation. + +Currently, Helmfile allows you to set the following fields for kustomizing the chart: + +- [`releases[].strategicMergePatches`](#strategicmergepatches) +- `releases[].jsonPatches` +- [`releases[].transformers`](#transformers) + +#### `strategicMergePatches` You can add/update any Kubernetes resource field rendered from a Helm chart by specifying `releases[].strategicMergePatches`: @@ -135,3 +147,65 @@ Please note that the second `data` field `bar` is coming from the strategic-merg There's also `releases[].jsonPatches` that works similarly to `strategicMergePatches` but has additional capability to remove fields. Please also see [test/advanced/helmfile.yaml](https://github.com/roboll/helmfile/tree/master/test/advanced/helmfile.yaml) for an example of patching support and more. + +#### `transformers` + +You can set `transformers` to apply [Kustomize's transformers](https://github.com/kubernetes-sigs/kustomize/blob/master/examples/configureBuiltinPlugin.md#configuring-the-builtin-plugins-instead). + +Each item can be a path to a YAML or go template file, or an embedded transformer declaration as a YAML hash. + +It's often used to add common labels and annotations to your resources. + +In the below example. we add common annotations and labels every resource rendered from the `aws-load-balancer-controller` chart: + +```yaml +releases: +- name: "aws-load-balancer-controller" + namespace: "kube-system" + forceNamespace: "kube-system" + chart: "center/aws/aws-load-balancer-controller" + transformers: + - apiVersion: builtin + kind: AnnotationsTransformer + metadata: + name: notImportantHere + annotations: + area: 51 + greeting: take me to your leader + fieldSpecs: + - path: metadata/annotations + create: true + - apiVersion: builtin + kind: LabelTransformer + metadata: + name: notImportantHere + labels: + foo: bar + fieldSpecs: + - path: metadata/labels + create: true +``` + +As explained earlier, `transformers` can be not only a list of embedded transformers, but also YAML or go template files, or a mix of those three kinds. + +```yaml +transformers: +# Embedded transformer +- apiVersion: builtin + kind: AnnotationsTransformer + metadata: + name: notImportantHere + annotations: + area: 51 + greeting: take me to your leader + fieldSpecs: + - path: metadata/annotations + create: true +# YAML file +- path/to/transformer.yaml +# Go template +# The same set of template parameters as release values files templates is available. +- path/to/transformer.yaml.gotmpl +``` + +Please see https://github.com/kubernetes-sigs/kustomize/blob/master/examples/configureBuiltinPlugin.md#configuring-the-builtin-plugins-instead for more information on how to declare transformers. diff --git a/go.mod b/go.mod index 94917b58..8092a012 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( github.com/spf13/cobra v1.1.1 github.com/tatsushid/go-prettytable v0.0.0-20141013043238-ed2d14c29939 github.com/urfave/cli v1.22.5 - github.com/variantdev/chartify v0.4.9 + github.com/variantdev/chartify v0.5.0 github.com/variantdev/dag v0.0.0-20191028002400-bb0b3c785363 github.com/variantdev/vals v0.11.0 go.uber.org/multierr v1.6.0 diff --git a/go.sum b/go.sum index 4f3d9c33..908d3d97 100644 --- a/go.sum +++ b/go.sum @@ -622,6 +622,8 @@ github.com/urfave/cli v1.22.5 h1:lNq9sAHXK2qfdI8W+GRItjCEkI+2oR4d+MEHy1CKXoU= github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/variantdev/chartify v0.4.9 h1:06foIMnJj31q/l1JZ+54anDLwqtP8zAOv5qVEn2IQhM= github.com/variantdev/chartify v0.4.9/go.mod h1:jqlUJIzcrIVSfg8FC4g+IoC5WB83TBl8rnVVEv6g8MQ= +github.com/variantdev/chartify v0.5.0 h1:I6T6oobjLfYmwZ4dUjRsO9AdGKPCMtfzt0CXR0ovl9k= +github.com/variantdev/chartify v0.5.0/go.mod h1:jqlUJIzcrIVSfg8FC4g+IoC5WB83TBl8rnVVEv6g8MQ= 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.11.0 h1:818ztGk5yPTiixbUeE3LkkBGGATEAKtWq09n8q8PFqc= diff --git a/pkg/state/helmx.go b/pkg/state/helmx.go index 69de2454..e638081d 100644 --- a/pkg/state/helmx.go +++ b/pkg/state/helmx.go @@ -144,6 +144,22 @@ func (st *HelmState) PrepareChartify(helm helmexec.Interface, release *ReleaseSp shouldRun = true } + transformers := release.Transformers + if len(transformers) > 0 { + generatedFiles, err := st.generateTemporaryReleaseValuesFiles(release, transformers, release.MissingFileHandler) + if err != nil { + return nil, clean, err + } + + for _, f := range generatedFiles { + chartify.Opts.Transformers = append(chartify.Opts.Transformers, f) + } + + filesNeedCleaning = append(filesNeedCleaning, generatedFiles...) + + shouldRun = true + } + if release.ForceNamespace != "" { chartify.Opts.OverrideNamespace = release.ForceNamespace diff --git a/pkg/state/state.go b/pkg/state/state.go index e03f74f6..24b99498 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -256,7 +256,14 @@ type ReleaseSpec struct { Dependencies []Dependency `yaml:"dependencies,omitempty"` JSONPatches []interface{} `yaml:"jsonPatches,omitempty"` StrategicMergePatches []interface{} `yaml:"strategicMergePatches,omitempty"` - Adopt []string `yaml:"adopt,omitempty"` + + // Transformers is the list of Kustomize transformers + // + // Each item can be a path to a YAML or go template file, or an embedded transformer declaration as a YAML hash. + // It's often used to add common labels and annotations to your resources. + // See https://github.com/kubernetes-sigs/kustomize/blob/master/examples/configureBuiltinPlugin.md#configuring-the-builtin-plugins-instead for more information. + Transformers []interface{} `yaml:"transformers,omitempty"` + Adopt []string `yaml:"adopt,omitempty"` //version of the chart that has really been installed cause desired version may be fuzzy (~2.0.0) installedVersion string