8000 fix(api): action param interpolate (#5107) · ovh/cds@661af83 · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Commit 661af83

Browse files
authored
fix(api): action param interpolate (#5107)
1 parent faddae7 commit 661af83

File tree

4 files changed

+80
-67
lines changed

4 files changed

+80
-67
lines changed

engine/api/pipeline/pipeline_parameter.go

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -121,29 +121,3 @@ func DeleteAllParameterFromPipeline(db gorp.SqlExecutor, pipelineID int64) error
121121
_, err := db.Exec(query, pipelineID)
122122
return sdk.WrapError(err, "Unable to delete all parameters")
123123
}
124-
125-
// CountInParamValue counts how many time a pattern is in parameter value for the given project
126-
func CountInParamValue(db gorp.SqlExecutor, key string, value string) ([]string, error) {
127-
query := `
128-
SELECT DISTINCT pipeline.name
129-
FROM pipeline_parameter
130-
JOIN pipeline ON pipeline.id = pipeline_parameter.pipeline_id
131-
JOIN project ON project.id = pipeline.project_id
132-
WHERE value like $2 AND project.projectkey = $1;
133-
`
134-
rows, err := db.Query(query, key, fmt.Sprintf("%%%s%%", value))
135-
if err != nil {
136-
return nil, sdk.WrapError(err, "Unable to count usage")
137-
}
138-
defer rows.Close()
139-
140-
var results []string
141-
for rows.Next() {
142-
var pipName string
143-
if err := rows.Scan(&pipName); err != nil {
144-
return nil, sdk.WrapError(err, "Unable to scan")
145-
}
146-
results = append(results, pipName)
147-
}
148-
return results, nil
149-
}

engine/api/workflow/gorp_model.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"time"
66

77
"github.com/ovh/cds/engine/api/database/gorpmapping"
8-
"github.com/ovh/cds/sdk/log"
98

109
"github.com/ovh/cds/sdk"
1110
)
@@ -108,7 +107,6 @@ func (j *JobRun) ToJobRun(jr *sdk.WorkflowNodeJobRun) (err error) {
108107
j.ExecGroups, err = gorpmapping.JSONToNullString(jr.ExecGroups)
109108
j.WorkerName = jr.WorkerName
110109
j.HatcheryName = jr.HatcheryName
111-
log.Debug("ToJobRun> %+v", j)
112110
if err != nil {
113111
return sdk.WrapError(err, "column exec_groups")
114112
}

engine/worker/internal/run.go

Lines changed: 47 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)
0