@@ -14,32 +14,51 @@ import (
1414 "github.com/spf13/afero"
1515
1616 "github.com/ovh/cds/engine/worker/pkg/workerruntime"
17-
1817 "github.com/ovh/cds/sdk"
1918 "github.com/ovh/cds/sdk/interpolate"
2019 "github.com/ovh/cds/sdk/log"
2120)
2221
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 )
2836
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" )
3147 }
3248
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" )
3552 }
3653
3754 // If parameters wasn't updated, consider it done
38- if parameters [i ].Value == t {
55+ if parameters [i ].Value == oldValue {
3956 keepReplacing = false
4057 }
58+ x ++
4159 }
4260 }
61+ return nil
4362}
4463
4564// ProcessActionVariables replaces all placeholders inside action recursively using
@@ -48,38 +67,29 @@ func processJobParameter(parameters []sdk.Parameter, secrets []sdk.Variable) {
4867// - Secrets from project, application and environment
4968//
5069// 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 {
5271 // replaces placeholder in parameters with ActionBuild variables
5372 // 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 )
5482 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
7787 }
7888 }
7989
8090 // replaces placeholder in all children recursively
8191 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 {
8393 return nil
8494 }
8595 }
@@ -514,12 +524,10 @@ func (w *CurrentWorker) ProcessJob(jobInfo sdk.WorkflowNodeJobRunData) (sdk.Resu
514524 })
515525
516526 // 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 {
520528 return sdk.Result {
521529 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 ),
523531 }, err
524532 }
525533
0 commit comments