Skip to content

Commit 474d88c

Browse files
committed
don't return validation error when taskrun failed/skipped
This commit aims to fix tektoncd#6383, tektoncd#6139 and supports tektoncd#3749. This commits skip the validation if the taskrun is not successful (e.g. failed or skipped) and omit the pipelinerun coresponding result. This way the skipped taskrun won't get validation error for pipelinerun. And the pipelinerun error won't be overwritten by the validation error. Signed-off-by: Yongxuan Zhang yongxuanzhang@google.com
1 parent 8e8c163 commit 474d88c

File tree

4 files changed

+101
-23
lines changed

4 files changed

+101
-23
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
apiVersion: tekton.dev/v1beta1
2+
kind: PipelineRun
3+
metadata:
4+
name: pipelinerun-test
5+
spec:
6+
pipelineSpec:
7+
params:
8+
- name: say-hello
9+
default: 'false'
10+
tasks:
11+
- name: hello
12+
taskSpec:
13+
results:
14+
- name: result-one
15+
steps:
16+
- image: alpine
17+
script: |
18+
#!/bin/sh
19+
echo "Hello world!"
20+
echo -n "RES1" > $(results.result-one.path)
21+
22+
- name: goodbye
23+
runAfter:
24+
- hello
25+
taskSpec:
26+
results:
27+
- name: result-two
28+
steps:
29+
- image: alpine
30+
script: |
31+
#!/bin/sh
32+
echo "Goodbye world!"
33+
echo -n "RES2" > $(results.result-two.path)
34+
when:
35+
- input: $(params.say-hello)
36+
operator: in
37+
values: ["true"]
38+
39+
results:
40+
- name: result-hello
41+
description: Result one
42+
value: '$(tasks.hello.results.result-one)'
43+
- name: result-goodbye
44+
description: Result two
45+
value: '$(tasks.goodbye.results.result-two)'

pkg/reconciler/pipelinerun/pipelinerun.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,7 @@ func (c *Reconciler) reconcile(ctx context.Context, pr *v1beta1.PipelineRun, get
687687
pr.Status.SkippedTasks = pipelineRunFacts.GetSkippedTasks()
688688
if after.Status == corev1.ConditionTrue || after.Status == corev1.ConditionFalse {
689689
pr.Status.PipelineResults, err = resources.ApplyTaskResultsToPipelineResults(ctx, pipelineSpec.Results,
690-
pipelineRunFacts.State.GetTaskRunsResults(), pipelineRunFacts.State.GetRunsResults(), pr.Status.SkippedTasks)
690+
pipelineRunFacts.State.GetTaskRunsResults(), pipelineRunFacts.State.GetRunsResults(), pipelineRunFacts.GetPipelineTaskStatus())
691691
if err != nil {
692692
pr.Status.MarkFailed(ReasonFailedValidation, err.Error())
693693
return err

pkg/reconciler/pipelinerun/resources/apply.go

+16-10
Original file line numberDiff line numberDiff line change
@@ -338,13 +338,9 @@ func ApplyTaskResultsToPipelineResults(
338338
results []v1beta1.PipelineResult,
339339
taskRunResults map[string][]v1beta1.TaskRunResult,
340340
customTaskResults map[string][]v1beta1.CustomRunResult,
341-
skippedTasks []v1beta1.SkippedTask) ([]v1beta1.PipelineRunResult, error) {
341+
taskstatus map[string]string) ([]v1beta1.PipelineRunResult, error) {
342342
var runResults []v1beta1.PipelineRunResult
343343
var invalidPipelineResults []string
344-
skippedTaskNames := map[string]bool{}
345-
for _, t := range skippedTasks {
346-
skippedTaskNames[t.Name] = true
347-
}
348344

349345
stringReplacements := map[string]string{}
350346
arrayReplacements := map[string][]string{}
@@ -366,11 +362,7 @@ func ApplyTaskResultsToPipelineResults(
366362
continue
367363
}
368364
variableParts := strings.Split(variable, ".")
369-
// if the referenced task is skipped, we should also skip the results replacements
370-
if _, ok := skippedTaskNames[variableParts[1]]; ok {
371-
validPipelineResult = false
372-
continue
373-
}
365+
374366
if (variableParts[0] != v1beta1.ResultTaskPart && variableParts[0] != v1beta1.ResultFinallyPart) || variableParts[2] != v1beta1.ResultResultPart {
375367
validPipelineResult = false
376368
invalidPipelineResults = append(invalidPipelineResults, pipelineResult.Name)
@@ -406,6 +398,13 @@ func ApplyTaskResultsToPipelineResults(
406398
} else if resultValue := runResultValue(taskName, resultName, customTaskResults); resultValue != nil {
407399
stringReplacements[variable] = *resultValue
408400
} else {
401+
// if the task is not successful (e.g. skipped or failed) and the results is missing, don't return error
402+
if status, ok := taskstatus[PipelineTaskStatusPrefix+taskName+PipelineTaskStatusSuffix]; ok {
403+
if status != v1beta1.TaskRunReasonSuccessful.String() {
404+
validPipelineResult = false
405+
continue
406+
}
407+
}
409408
// referred result name is not existent
410409
invalidPipelineResults = append(invalidPipelineResults, pipelineResult.Name)
411410
validPipelineResult = false
@@ -423,6 +422,13 @@ func ApplyTaskResultsToPipelineResults(
423422
validPipelineResult = false
424423
}
425424
} else {
425+
// if the task is not successful (e.g. skipped or failed) and the results is missing, don't return error
426+
if status, ok := taskstatus[PipelineTaskStatusPrefix+taskName+PipelineTaskStatusSuffix]; ok {
427+
if status != v1beta1.TaskRunReasonSuccessful.String() {
428+
validPipelineResult = false
429+
continue
430+
}
431+
}
426432
// referred result name is not existent
427433
invalidPipelineResults = append(invalidPipelineResults, pipelineResult.Name)
428434
validPipelineResult = false

pkg/reconciler/pipelinerun/resources/apply_test.go

+39-12
Original file line numberDiff line numberDiff line change
@@ -3512,6 +3512,7 @@ func TestApplyTaskResultsToPipelineResults_Success(t *testing.T) {
35123512
results []v1beta1.PipelineResult
35133513
taskResults map[string][]v1beta1.TaskRunResult
35143514
runResults map[string][]v1beta1.CustomRunResult
3515+
taskstatus map[string]string
35153516
skippedTasks []v1beta1.SkippedTask
35163517
expectedResults []v1beta1.PipelineRunResult
35173518
}{{
@@ -3789,13 +3790,47 @@ func TestApplyTaskResultsToPipelineResults_Success(t *testing.T) {
37893790
Value: *v1beta1.NewStructuredValues("rae"),
37903791
}},
37913792
},
3792-
skippedTasks: []v1beta1.SkippedTask{{
3793-
Name: "skippedTask",
3793+
taskstatus: map[string]string{resources.PipelineTaskStatusPrefix + "skippedTask" + resources.PipelineTaskStatusSuffix: resources.PipelineTaskStateNone},
3794+
expectedResults: nil,
3795+
}, {
3796+
description: "unsuccessful-taskrun-no-results",
3797+
results: []v1beta1.PipelineResult{{
3798+
Name: "foo",
3799+
Value: *v1beta1.NewStructuredValues("$(tasks.pt1.results.foo)"),
37943800
}},
3801+
taskResults: map[string][]v1beta1.TaskRunResult{},
3802+
taskstatus: map[string]string{resources.PipelineTaskStatusPrefix + "pt1" + resources.PipelineTaskStatusSuffix: v1beta1.TaskRunReasonFailed.String()},
37953803
expectedResults: nil,
3804+
}, {
3805+
description: "unsuccessful-taskrun-no-returned-result-object-ref",
3806+
results: []v1beta1.PipelineResult{{
3807+
Name: "foo",
3808+
Value: *v1beta1.NewStructuredValues("$(tasks.pt1.results.foo.key1)"),
3809+
}},
3810+
taskResults: map[string][]v1beta1.TaskRunResult{},
3811+
taskstatus: map[string]string{resources.PipelineTaskStatusPrefix + "pt1" + resources.PipelineTaskStatusSuffix: v1beta1.TaskRunReasonFailed.String()},
3812+
expectedResults: nil,
3813+
}, {
3814+
description: "unsuccessful-taskrun-with-results",
3815+
results: []v1beta1.PipelineResult{{
3816+
Name: "foo",
3817+
Value: *v1beta1.NewStructuredValues("$(tasks.pt1.results.foo[*])"),
3818+
}},
3819+
taskResults: map[string][]v1beta1.TaskRunResult{
3820+
"pt1": {
3821+
{
3822+
Name: "foo",
3823+
Value: *v1beta1.NewStructuredValues("do", "rae", "mi"),
3824+
},
3825+
}},
3826+
taskstatus: map[string]string{resources.PipelineTaskStatusPrefix + "pt1" + resources.PipelineTaskStatusSuffix: v1beta1.TaskRunReasonFailed.String()},
3827+
expectedResults: []v1beta1.PipelineRunResult{{
3828+
Name: "foo",
3829+
Value: *v1beta1.NewStructuredValues("do", "rae", "mi"),
3830+
}},
37963831
}} {
37973832
t.Run(tc.description, func(t *testing.T) {
3798-
received, err := resources.ApplyTaskResultsToPipelineResults(context.Background(), tc.results, tc.taskResults, tc.runResults, tc.skippedTasks)
3833+
received, err := resources.ApplyTaskResultsToPipelineResults(context.Background(), tc.results, tc.taskResults, tc.runResults, tc.taskstatus)
37993834
if err != nil {
38003835
t.Errorf("Got unecpected error:%v", err)
38013836
}
@@ -3921,15 +3956,6 @@ func TestApplyTaskResultsToPipelineResults_Error(t *testing.T) {
39213956
},
39223957
expectedResults: nil,
39233958
expectedError: fmt.Errorf("invalid pipelineresults [foo], the referred results don't exist"),
3924-
}, {
3925-
description: "unsuccessful-taskrun-no-returned-result",
3926-
results: []v1beta1.PipelineResult{{
3927-
Name: "foo",
3928-
Value: *v1beta1.NewStructuredValues("$(tasks.pt1.results.foo)"),
3929-
}},
3930-
taskResults: map[string][]v1beta1.TaskRunResult{},
3931-
expectedResults: nil,
3932-
expectedError: fmt.Errorf("invalid pipelineresults [foo], the referred results don't exist"),
39333959
}, {
39343960
description: "mixed-success-tasks-some-returned-results",
39353961
results: []v1beta1.PipelineResult{{
@@ -4014,6 +4040,7 @@ func TestApplyTaskResultsToPipelineResults_Error(t *testing.T) {
40144040
received, err := resources.ApplyTaskResultsToPipelineResults(context.Background(), tc.results, tc.taskResults, tc.runResults, nil /*skipped tasks*/)
40154041
if err == nil {
40164042
t.Errorf("Expect error but got nil")
4043+
return
40174044
}
40184045

40194046
if d := cmp.Diff(tc.expectedError.Error(), err.Error()); d != "" {

0 commit comments

Comments
 (0)