diff --git a/README.md b/README.md index 5b18e164..6872d845 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,10 @@ releases: # Interpolate environment variable with a fixed string domain: {{ requiredEnv "PLATFORM_ID" }}.my-domain.com scheme: {{ env "SCHEME" | default "https" }} + set: + # single value load from a local file, --set-file foo.config=path/to/file + - name: foo.config + file: path/to/file # will attempt to decrypt it using helm-secrets plugin secrets: - vault_secret.yaml diff --git a/state/state.go b/state/state.go index 540231d8..0c719f50 100644 --- a/state/state.go +++ b/state/state.go @@ -81,6 +81,7 @@ type ReleaseSpec struct { type SetValue struct { Name string `yaml:"name"` Value string `yaml:"value"` + File string `yaml:"file"` } // CreateFromFile loads the helmfile from disk and processes the template @@ -757,11 +758,13 @@ func (state *HelmState) namespaceAndValuesFlags(helm helmexec.Interface, basePat flags = append(flags, "--values", valfile) } if len(release.SetValues) > 0 { - val := []string{} for _, set := range release.SetValues { - val = append(val, fmt.Sprintf("%s=%s", escape(set.Name), escape(set.Value))) + if set.Value != "" { + flags = append(flags, "--set", fmt.Sprintf("%s=%s", escape(set.Name), escape(set.Value))) + } else if set.File != "" { + flags = append(flags, "--set-file", fmt.Sprintf("%s=%s", escape(set.Name), set.File)) + } } - flags = append(flags, "--set", strings.Join(val, ",")) } /*********** diff --git a/state/state_test.go b/state/state_test.go index 7fd78eaf..cc7562f2 100644 --- a/state/state_test.go +++ b/state/state_test.go @@ -704,7 +704,32 @@ func TestHelmState_SyncReleases(t *testing.T) { }, }, helm: &mockHelmExec{}, - wantReleases: []mockRelease{{"releaseName", []string{"--set", "someList=a\\,b\\,c,json=\\{\"name\": \"john\"\\}"}}}, + wantReleases: []mockRelease{{"releaseName", []string{"--set", "someList=a\\,b\\,c", "--set", "json=\\{\"name\": \"john\"\\}"}}}, + }, + { + name: "set single value from file", + releases: []ReleaseSpec{ + { + Name: "releaseName", + Chart: "foo", + SetValues: []SetValue{ + { + Name: "foo", + Value: "FOO", + }, + { + Name: "bar", + File: "path/to/bar", + }, + { + Name: "baz", + Value: "BAZ", + }, + }, + }, + }, + helm: &mockHelmExec{}, + wantReleases: []mockRelease{{"releaseName", []string{"--set", "foo=FOO", "--set-file", "bar=path/to/bar", "--set", "baz=BAZ"}}}, }, } for _, tt := range tests {