@@ -14,32 +14,51 @@ import (
14
14
"github.com/spf13/afero"
15
15
16
16
"github.com/ovh/cds/engine/worker/pkg/workerruntime"
17
-
18
17
"github.com/ovh/cds/sdk"
19
18
"github.com/ovh/cds/sdk/interpolate"
20
19
"github.com/ovh/cds/sdk/log"
21
20
)
22
21
23
- func processJobParameter (parameters []sdk.Parameter , secrets []sdk.Variable ) {
24
- for i := range parameters {
25
- keepReplacing := true
26
- for keepReplacing {
27
- t := parameters [i ].Value
22
+ func processVariablesAndParameters (action * sdk.Action , jobParameters []sdk.Parameter , jobSecrets []sdk.Variable ) error {
23
+ if err := processJobParameter (jobParameters , jobSecrets ); err != nil {
24
+ return err
25
+ }
26
+
27
+ if err := processActionVariables (action , nil , jobParameters , jobSecrets ); err != nil {
28
+ return err
29
+ }
30
+ return nil
31
+ }
32
+
33
+ func processJobParameter (parameters []sdk.Parameter , secrets []sdk.Variable ) error {
34
+ secretParam := sdk .VariablesToParameters ("" , secrets )
35
+ secretMap := sdk .ParametersToMap (secretParam )
28
36
29
- for _ , p := range parameters {
30
- parameters [i ].Value = strings .Replace (parameters [i ].Value , "{{." + p .Name + "}}" , p .Value , - 1 )
37
+ for i := range parameters {
38
+ var err error
39
+ var oldValue = parameters [i ].Value
40
+ var x int
41
+ var keepReplacing = true
42
+ for keepReplacing && x < 10 {
43
+ var paramMap = sdk .ParametersToMap (parameters )
44
+ parameters [i ].Value , err = interpolate .Do (parameters [i ].Value , paramMap )
45
+ if err != nil {
46
+ return sdk .WrapError (err , "Unable to interpolate job parameters" )
31
47
}
32
48
33
- for _ , p := range secrets {
34
- parameters [i ].Value = strings .Replace (parameters [i ].Value , "{{." + p .Name + "}}" , p .Value , - 1 )
49
+ parameters [i ].Value , err = interpolate .Do (parameters [i ].Value , secretMap )
50
+ if err != nil {
51
+ return sdk .WrapError (err , "Unable to interpolate job parameters" )
35
52
}
36
53
37
54
// If parameters wasn't updated, consider it done
38
- if parameters [i ].Value == t {
55
+ if parameters [i ].Value == oldValue {
39
56
keepReplacing = false
40
57
}
58
+ x ++
41
59
}
42
60
}
61
+ return nil
43
62
}
44
63
45
64
// ProcessActionVariables replaces all placeholders inside action recursively using
@@ -48,38 +67,29 @@ func processJobParameter(parameters []sdk.Parameter, secrets []sdk.Variable) {
48
67
// - Secrets from project, application and environment
49
68
//
50
69
// This function should be called ONLY from worker
51
- func ( w * CurrentWorker ) processActionVariables (a * sdk.Action , parent * sdk.Action , jobParameters []sdk.Parameter , secrets []sdk.Variable ) error {
70
+ func processActionVariables (a * sdk.Action , parent * sdk.Action , jobParameters []sdk.Parameter , secrets []sdk.Variable ) error {
52
71
// replaces placeholder in parameters with ActionBuild variables
53
72
// replaces placeholder in parameters with Parent params
73
+ secretParam := sdk .VariablesToParameters ("" , secrets )
74
+ secretMap := sdk .ParametersToMap (secretParam )
75
+ var parentParamMap = map [string ]string {}
76
+ if parent != nil {
77
+ parentParamMap = sdk .ParametersToMap (parent .Parameters )
78
+ }
79
+ jobParamMap := sdk .ParametersToMap (jobParameters )
80
+ allParams := sdk .ParametersMapMerge (parentParamMap , jobParamMap )
81
+ allParams = sdk .ParametersMapMerge (allParams , secretMap )
54
82
for i := range a .Parameters {
55
- keepReplacing := true
56
- for keepReplacing {
57
- t := a .Parameters [i ].Value
58
-
59
- if parent != nil {
60
- for _ , p := range parent .Parameters {
61
- a .Parameters [i ].Value = strings .Replace (a .Parameters [i ].Value , "{{." + p .Name + "}}" , p .Value , - 1 )
62
- }
63
- }
64
-
65
- for _ , p := range jobParameters {
66
- a .Parameters [i ].Value = strings .Replace (a .Parameters [i ].Value , "{{." + p .Name + "}}" , p .Value , - 1 )
67
- }
68
-
69
- for _ , p := range secrets {
70
- a .Parameters [i ].Value = strings .Replace (a .Parameters [i ].Value , "{{." + p .Name + "}}" , p .Value , - 1 )
71
- }
72
-
73
- // If parameters wasn't updated, consider it done
74
- if a .Parameters [i ].Value == t {
75
- keepReplacing = false
76
- }
83
+ var err error
84
+ a .Parameters [i ].Value , err = interpolate .Do (a .Parameters [i ].Value , allParams )
85
+ if err != nil {
86
+ return err
77
87
}
78
88
}
79
89
80
90
// replaces placeholder in all children recursively
81
91
for i := range a .Actions {
82
- if err := w . processActionVariables (& a .Actions [i ], a , jobParameters , secrets ); err != nil {
92
+ if err := processActionVariables (& a .Actions [i ], a , jobParameters , secrets ); err != nil {
83
93
return nil
84
94
}
85
95
}
@@ -514,12 +524,10 @@ func (w *CurrentWorker) ProcessJob(jobInfo sdk.WorkflowNodeJobRunData) (sdk.Resu
514
524
})
515
525
516
526
// REPLACE ALL VARIABLE EVEN SECRETS HERE
517
- processJobParameter (jobParameters , jobInfo .Secrets )
518
- if err := w .processActionVariables (& jobInfo .NodeJobRun .Job .Action , nil , jobParameters , jobInfo .Secrets ); err != nil {
519
- log .Warning (ctx , "processJob> Cannot process action %s parameters: %s" , jobInfo .NodeJobRun .Job .Action .Name , err )
527
+ if err := processVariablesAndParameters (& jobInfo .NodeJobRun .Job .Action , jobParameters , jobInfo .Secrets ); err != nil {
520
528
return sdk.Result {
521
529
Status : sdk .StatusFail ,
522
- Reason : fmt .Sprintf ("Error: cannot process action %s parameters" , jobInfo .NodeJobRun .Job .Action .Name ),
530
+ Reason : fmt .Sprintf ("Error: cannot process job %s parameters" , jobInfo .NodeJobRun .Job .Action .Name ),
523
531
}, err
524
532
}
525
533
0 commit comments