Skip to content

Commit d4a2713

Browse files
authored
Merge pull request #2470 from semaphoreui/config_env_vars
Add config option to provide environment variables for run apps
2 parents 44cc5cb + 783309b commit d4a2713

File tree

7 files changed

+97
-11
lines changed

7 files changed

+97
-11
lines changed

db_lib/AnsiblePlaybook.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,12 @@ func (p AnsiblePlaybook) makeCmd(command string, args []string, environmentVars
2222
cmd := exec.Command(command, args...) //nolint: gas
2323
cmd.Dir = p.GetFullPath()
2424

25-
cmd.Env = []string{}
26-
27-
cmd.Env = append(cmd.Env, fmt.Sprintf("HOME=%s", util.Config.TmpPath))
28-
cmd.Env = append(cmd.Env, fmt.Sprintf("PWD=%s", cmd.Dir))
2925
cmd.Env = append(cmd.Env, "PYTHONUNBUFFERED=1")
3026
cmd.Env = append(cmd.Env, "ANSIBLE_FORCE_COLOR=True")
31-
32-
// TODO: Following option doesn't work when password authentication used.
33-
// So, we need to check args for --ask-pass, --ask-become-pass or remove this code completely.
34-
// What reason to use this code: prevent hanging of semaphore when host key confirmation required.
35-
//cmd.Env = append(cmd.Env, "ANSIBLE_SSH_ARGS=\"-o BatchMode=yes\"")
27+
cmd.Env = append(cmd.Env, fmt.Sprintf("PATH=%s", os.Getenv("PATH")))
28+
cmd.Env = append(cmd.Env, getEnvironmentVars()...)
29+
cmd.Env = append(cmd.Env, fmt.Sprintf("HOME=%s", util.Config.TmpPath))
30+
cmd.Env = append(cmd.Env, fmt.Sprintf("PWD=%s", cmd.Dir))
3631

3732
if environmentVars != nil {
3833
cmd.Env = append(cmd.Env, *environmentVars...)

db_lib/LocalApp.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,30 @@
11
package db_lib
22

33
import (
4+
"fmt"
45
"os"
56

67
"github.com/ansible-semaphore/semaphore/pkg/task_logger"
8+
"github.com/ansible-semaphore/semaphore/util"
79
)
810

11+
func getEnvironmentVars() []string {
12+
res := []string{}
13+
14+
for _, e := range util.Config.ForwardedEnvVars {
15+
v := os.Getenv(e)
16+
if v != "" {
17+
res = append(res, fmt.Sprintf("%s=%s", e, v))
18+
}
19+
}
20+
21+
for k, v := range util.Config.EnvVars {
22+
res = append(res, fmt.Sprintf("%s=%s", k, v))
23+
}
24+
25+
return res
26+
}
27+
928
type LocalApp interface {
1029
SetLogger(logger task_logger.Logger) task_logger.Logger
1130
InstallRequirements(environmentVars *[]string) error

db_lib/LocalApp_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package db_lib
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
"github.com/ansible-semaphore/semaphore/util"
8+
)
9+
10+
// contains checks if a slice contains a specific string
11+
func contains(slice []string, item string) bool {
12+
for _, s := range slice {
13+
if s == item {
14+
return true
15+
}
16+
}
17+
return false
18+
}
19+
20+
func TestGetEnvironmentVars(t *testing.T) {
21+
22+
os.Setenv("SEMAPHORE_TEST", "test123")
23+
os.Setenv("SEMAPHORE_TEST2", "test222")
24+
os.Setenv("PASSWORD", "test222")
25+
26+
util.Config = &util.ConfigType{
27+
ForwardedEnvVars: []string{"SEMAPHORE_TEST"},
28+
EnvVars: map[string]string{
29+
"ANSIBLE_FORCE_COLOR": "False",
30+
},
31+
}
32+
33+
res := getEnvironmentVars()
34+
35+
expected := []string{
36+
"SEMAPHORE_TEST=test123",
37+
"ANSIBLE_FORCE_COLOR=False",
38+
}
39+
40+
if len(res) != len(expected) {
41+
t.Errorf("Expected %v, got %v", expected, res)
42+
}
43+
44+
for _, e := range expected {
45+
46+
if !contains(res, e) {
47+
t.Errorf("Expected %v, got %v", expected, res)
48+
}
49+
}
50+
}

db_lib/ShellApp.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func (t *ShellApp) makeCmd(command string, args []string, environmentVars *[]str
4545
cmd := exec.Command(command, args...) //nolint: gas
4646
cmd.Dir = t.GetFullPath()
4747

48-
cmd.Env = []string{}
48+
cmd.Env = getEnvironmentVars()
4949
cmd.Env = append(cmd.Env, fmt.Sprintf("HOME=%s", util.Config.TmpPath))
5050
cmd.Env = append(cmd.Env, fmt.Sprintf("PWD=%s", cmd.Dir))
5151

db_lib/TerraformApp.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func (t *TerraformApp) makeCmd(command string, args []string, environmentVars *[
3838
cmd := exec.Command(command, args...) //nolint: gas
3939
cmd.Dir = t.GetFullPath()
4040

41-
cmd.Env = []string{}
41+
cmd.Env = getEnvironmentVars()
4242
cmd.Env = append(cmd.Env, fmt.Sprintf("HOME=%s", util.Config.TmpPath))
4343
cmd.Env = append(cmd.Env, fmt.Sprintf("PWD=%s", cmd.Dir))
4444

util/config.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,10 @@ type ConfigType struct {
204204
Apps map[string]App `json:"apps,omitempty" env:"SEMAPHORE_APPS"`
205205

206206
Runner *RunnerConfig `json:"runner,omitempty"`
207+
208+
EnvVars map[string]string `json:"env_vars,omitempty" env:"SEMAPHORE_ENV_VARS"`
209+
210+
ForwardedEnvVars []string `json:"forwarded_env_vars,omitempty" env:"SEMAPHORE_FORWARDED_ENV_VARS"`
207211
}
208212

209213
func NewConfigType() *ConfigType {

util/config_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ func TestLoadEnvironmentToObject(t *testing.T) {
3030
Subfield struct {
3131
Value string `env:"TEST_VALUE_ENV_VAR"`
3232
}
33+
StringArr []string `env:"TEST_STRING_ARR"`
3334
}
3435

3536
err := os.Setenv("TEST_FLAG", "yes")
@@ -47,6 +48,11 @@ func TestLoadEnvironmentToObject(t *testing.T) {
4748
panic(err)
4849
}
4950

51+
err = os.Setenv("TEST_STRING_ARR", "[\"test1\",\"test2\"]")
52+
if err != nil {
53+
panic(err)
54+
}
55+
5056
err = loadEnvironmentToObject(&val)
5157
if err != nil {
5258
t.Error(err)
@@ -63,6 +69,18 @@ func TestLoadEnvironmentToObject(t *testing.T) {
6369
if val.Subfield.Value != "test_value" {
6470
t.Error("Invalid value")
6571
}
72+
73+
if val.StringArr == nil {
74+
t.Error("Invalid array value")
75+
}
76+
77+
if val.StringArr[0] != "test1" {
78+
t.Error("Invalid array item value")
79+
}
80+
81+
if val.StringArr[1] != "test2" {
82+
t.Error("Invalid array item value")
83+
}
6684
}
6785

6886
func TestCastStringToInt(t *testing.T) {

0 commit comments

Comments
 (0)