Skip to content

Commit 29b5a3a

Browse files
committed
feat: experimental integration with helm-x
This enhances helmfile so that it can: - Treat K8s manifests directories and Kustomize projects as charts - Add adhoc chart dependencies on sync/diff/template without forking or modifying chart(s) (#649) - Add adhoc patches(JSON Patch or Strategic Merge Patch supported) to be applied to the K8s resources before sync/diff/template, without forking or modifyin chart(s) (#650) The usage is as outlined in https://github.com/mumoshu/helm-x/tree/master/examples/helmfile. Add any or all of `dependencies:`, `jsonPatches:` and `strategicMergePatches:` so that it adds additional flags to `helm` calls that is only supported by `helm x`. ```yaml releases: - name: kustomize chart: ../kustomize - name: manifests chart: ../manifests - name: foo chart: incubator/raw dependencies: - alias: bar chart: incubator/raw values: - values.yaml - bar: enabled: true resources: - apiVersion: v1 kind: Pod metadata: name: bar spec: containers: - command: - sleep - 1000 image: alpine:3.9.4 imagePullPolicy: IfNotPresent name: bar jsonPatches: - target: version: v1 kind: Pod name: foo patch: - op: replace path: /spec/containers/0/command value: - sleep - "123" strategicMergePatches: - apiVersion: v1 kind: Pod metadata: name: bar spec: containers: - name: bar command: - sleep - "234" ``` You can alternatively provide `source: path/to/patch.yaml` for `jsonPatches` and `strategicMergePatches` items to externalize it. Add `.gotmpl` suffix like you would do for values files for templating. When running `helmfile` you must point `--helm-binary` to the `helm-x` binary like below: ``` $ helmfile --helm-binary ~/.helm/plugins/helm-x/bin/helm-x --log-level debug apply ``` after installing the [helm-x](https://github.com/mumoshu/helm-x) plugin. The integration should ideally be automatic. That is, it shouldn't force you to set `--helm-binary`. But I had no other way to not bloat helmfile's codebase to just add this experimental feature. Resolves #649 Resolves #650
1 parent 65d404b commit 29b5a3a

File tree

2 files changed

+86
-1
lines changed

2 files changed

+86
-1
lines changed

pkg/state/helmx.go

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package state
2+
3+
type Dependency struct {
4+
Chart string `yaml:"chart"`
5+
Version string `yaml:"version"`
6+
Alias string `yaml:"alias"`
7+
}
8+
9+
func (st *HelmState) appendHelmXFlags(flags []string, release *ReleaseSpec) ([]string, error) {
10+
for _, d := range release.Dependencies {
11+
var dep string
12+
if d.Alias != "" {
13+
dep += d.Alias + "="
14+
}
15+
dep += d.Chart
16+
if d.Version != "" {
17+
dep += ":" + d.Version
18+
}
19+
flags = append(flags, "--dependency", dep)
20+
}
21+
22+
jsonPatches := release.JSONPatches
23+
if len(jsonPatches) > 0 {
24+
generatedFiles, err := st.generateTemporaryValuesFiles(jsonPatches, release.MissingFileHandler)
25+
if err != nil {
26+
return nil, err
27+
}
28+
29+
for _, f := range generatedFiles {
30+
flags = append(flags, "--json-patch", f)
31+
}
32+
33+
release.generatedValues = append(release.generatedValues, generatedFiles...)
34+
}
35+
36+
strategicMergePatches := release.StrategicMergePatches
37+
if len(strategicMergePatches) > 0 {
38+
generatedFiles, err := st.generateTemporaryValuesFiles(strategicMergePatches, release.MissingFileHandler)
39+
if err != nil {
40+
return nil, err
41+
}
42+
43+
for _, f := range generatedFiles {
44+
flags = append(flags, "--strategic-merge-patch", f)
45+
}
46+
47+
release.generatedValues = append(release.generatedValues, generatedFiles...)
48+
}
49+
50+
return flags, nil
51+
}

pkg/state/state.go

+35-1
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,11 @@ type ReleaseSpec struct {
158158
TLSKey string `yaml:"tlsKey"`
159159
TLSCert string `yaml:"tlsCert"`
160160

161+
// These settings requires helm-x integration to work
162+
Dependencies []Dependency `yaml:"dependencies"`
163+
JSONPatches []interface{} `yaml:"jsonPatches"`
164+
StrategicMergePatches []interface{} `yaml:"strategicMergePatches"`
165+
161166
// generatedValues are values that need cleaned up on exit
162167
generatedValues []string
163168
//version of the chart that has really been installed cause desired version may be fuzzy (~2.0.0)
@@ -1198,6 +1203,12 @@ func (st *HelmState) flagsForUpgrade(helm helmexec.Interface, release *ReleaseSp
11981203

11991204
flags = st.appendTillerFlags(flags, release)
12001205

1206+
var err error
1207+
flags, err = st.appendHelmXFlags(flags, release)
1208+
if err != nil {
1209+
return nil, err
1210+
}
1211+
12011212
common, err := st.namespaceAndValuesFlags(helm, release, workerIndex)
12021213
if err != nil {
12031214
return nil, err
@@ -1209,6 +1220,13 @@ func (st *HelmState) flagsForTemplate(helm helmexec.Interface, release *ReleaseS
12091220
flags := []string{
12101221
"--name", release.Name,
12111222
}
1223+
1224+
var err error
1225+
flags, err = st.appendHelmXFlags(flags, release)
1226+
if err != nil {
1227+
return nil, err
1228+
}
1229+
12121230
common, err := st.namespaceAndValuesFlags(helm, release, workerIndex)
12131231
if err != nil {
12141232
return nil, err
@@ -1228,6 +1246,12 @@ func (st *HelmState) flagsForDiff(helm helmexec.Interface, release *ReleaseSpec,
12281246

12291247
flags = st.appendTillerFlags(flags, release)
12301248

1249+
var err error
1250+
flags, err = st.appendHelmXFlags(flags, release)
1251+
if err != nil {
1252+
return nil, err
1253+
}
1254+
12311255
common, err := st.namespaceAndValuesFlags(helm, release, workerIndex)
12321256
if err != nil {
12331257
return nil, err
@@ -1245,7 +1269,17 @@ func (st *HelmState) isDevelopment(release *ReleaseSpec) bool {
12451269
}
12461270

12471271
func (st *HelmState) flagsForLint(helm helmexec.Interface, release *ReleaseSpec, workerIndex int) ([]string, error) {
1248-
return st.namespaceAndValuesFlags(helm, release, workerIndex)
1272+
flags, err := st.namespaceAndValuesFlags(helm, release, workerIndex)
1273+
if err != nil {
1274+
return nil, err
1275+
}
1276+
1277+
flags, err = st.appendHelmXFlags(flags, release)
1278+
if err != nil {
1279+
return nil, err
1280+
}
1281+
1282+
return flags, nil
12491283
}
12501284

12511285
func (st *HelmState) RenderValuesFileToBytes(path string) ([]byte, error) {

0 commit comments

Comments
 (0)