Merge pull request #95 from yxxhero/add_execEnvs

[feat] add execEnvs
This commit is contained in:
Quan TRAN 2022-05-16 17:13:57 +02:00 committed by GitHub
commit f7ef07ff94
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 55 additions and 1 deletions

View File

@ -1124,6 +1124,16 @@ mysetting: |
The possibility is endless. Try importing values from your golang app, bash script, jsonnet, or anything! The possibility is endless. Try importing values from your golang app, bash script, jsonnet, or anything!
Then `execEnvs` same as `exec`, but it can receive a dict as the envs.
A usual usage of `execEnvs` would look like this:
```yaml
mysetting: |
{{ execEnvs (dict "envkey" "envValue") "./mycmd" (list "arg1" "arg2" "--flag1") | indent 2 }}
```
## Hooks ## Hooks
A Helmfile hook is a per-release extension point that is composed of: A Helmfile hook is a per-release extension point that is composed of:

View File

@ -20,6 +20,7 @@ type Values = map[string]interface{}
func (c *Context) createFuncMap() template.FuncMap { func (c *Context) createFuncMap() template.FuncMap {
funcMap := template.FuncMap{ funcMap := template.FuncMap{
"execEnvs": c.ExecEnvs,
"exec": c.Exec, "exec": c.Exec,
"isFile": c.IsFile, "isFile": c.IsFile,
"readFile": c.ReadFile, "readFile": c.ReadFile,
@ -48,7 +49,8 @@ func (c *Context) createFuncMap() template.FuncMap {
return funcMap return funcMap
} }
func (c *Context) Exec(command string, args []interface{}, inputs ...string) (string, error) { // TODO: in the next major version, remove this function.
func (c *Context) ExecEnvs(envs map[string]string, command string, args []interface{}, inputs ...string) (string, error) {
var input string var input string
if len(inputs) > 0 { if len(inputs) > 0 {
input = inputs[0] input = inputs[0]
@ -66,6 +68,12 @@ func (c *Context) Exec(command string, args []interface{}, inputs ...string) (st
cmd := exec.Command(command, strArgs...) cmd := exec.Command(command, strArgs...)
cmd.Dir = c.basePath cmd.Dir = c.basePath
if envs != nil {
cmd.Env = os.Environ()
for k, v := range envs {
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", k, v))
}
}
g := errgroup.Group{} g := errgroup.Group{}
@ -119,6 +127,10 @@ func (c *Context) Exec(command string, args []interface{}, inputs ...string) (st
return string(bytes), nil return string(bytes), nil
} }
func (c *Context) Exec(command string, args []interface{}, inputs ...string) (string, error) {
return c.ExecEnvs(nil, command, args, inputs...)
}
func (c *Context) IsFile(filename string) (bool, error) { func (c *Context) IsFile(filename string) (bool, error) {
var path string var path string
if filepath.IsAbs(filename) { if filepath.IsAbs(filename) {

View File

@ -267,3 +267,35 @@ func TestExec(t *testing.T) {
_, err = ctx.Exec("bash", []interface{}{"-c", "exit 1"}, "") _, err = ctx.Exec("bash", []interface{}{"-c", "exit 1"}, "")
require.Error(t, err, "Expected error to be returned when executing command with non-zero exit code") require.Error(t, err, "Expected error to be returned when executing command with non-zero exit code")
} }
// TestExecEnvs tests that ExecEnvs returns the expected output.
// TODO: in the next major version, this test should be removed.
func TestExecEnvs(t *testing.T) {
ctx := &Context{basePath: "."}
expected := "foo"
testKey := "testkey"
// test that the command is executed with environment variables
output, err := ctx.ExecEnvs(map[string]string{testKey: "foo"}, "bash", []interface{}{"-c", fmt.Sprintf("echo -n $%s", testKey)}, "")
require.Nilf(t, err, "Expected no error to be returned when executing command with environment variables")
require.Equalf(t, expected, output, "Expected %s to be returned when executing command with environment variables", expected)
// test that the command is executed with no environment variables
output, err = ctx.ExecEnvs(nil, "bash", []interface{}{"-c", fmt.Sprintf("echo -n $%s", testKey)}, "")
require.Nilf(t, err, "Expected no error to be returned when executing command with no environment variables")
require.Emptyf(t, output, "Expected empty string to be returned when executing command with no environment variables")
// test that the command is executed with os environment variables
os.Setenv(testKey, "foo")
defer os.Unsetenv(testKey)
output, err = ctx.ExecEnvs(nil, "bash", []interface{}{"-c", fmt.Sprintf("echo -n $%s", testKey)}, "")
require.Nilf(t, err, "Expected no error to be returned when executing command with environment variables")
require.Equalf(t, expected, output, "Expected %s to be returned when executing command with environment variables", expected)
}