Skip to content

Commit d2b9e71

Browse files
committed
TEP-0090: Resolve PipelineTask with Custom Task
[TEP-0090: Matrix][tep-0090] proposed executing a `PipelineTask` in parallel `TaskRuns` and `Runs` with substitutions from combinations of `Parameters` in a `Matrix`. This change resolves a `PipelineTask` with a matrixed `Custom Task`. [tep-0090]: https://github.com/tektoncd/community/blob/main/teps/0090-matrix.md
1 parent 4c021dc commit d2b9e71

File tree

2 files changed

+117
-0
lines changed

2 files changed

+117
-0
lines changed

pkg/reconciler/pipelinerun/resources/pipelinerunresolution.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ type ResolvedPipelineTask struct {
6666
CustomTask bool
6767
RunName string
6868
Run *v1alpha1.Run
69+
RunNames []string
6970
Runs []*v1alpha1.Run
7071
PipelineTask *v1beta1.PipelineTask
7172
ResolvedTaskResources *resources.ResolvedTaskResources
@@ -525,6 +526,15 @@ func ResolvePipelineTask(
525526
}
526527
rpt.CustomTask = isCustomTask(ctx, rpt)
527528
switch {
529+
case rpt.IsCustomTask() && rpt.IsMatrixed():
530+
rpt.RunNames = getNamesOfRuns(pipelineRun.Status.ChildReferences, pipelineTask.Name, pipelineRun.Name, pipelineTask.GetMatrixCombinationsCount())
531+
for _, runName := range rpt.RunNames {
532+
run, err := getRun(runName)
533+
if err != nil && !kerrors.IsNotFound(err) {
534+
return nil, fmt.Errorf("error retrieving Run %s: %w", runName, err)
535+
}
536+
rpt.Runs = append(rpt.Runs, run)
537+
}
528538
case rpt.IsCustomTask():
529539
rpt.RunName = getRunName(pipelineRun.Status.Runs, pipelineRun.Status.ChildReferences, pipelineTask.Name, pipelineRun.Name)
530540
run, err := getRun(rpt.RunName)

pkg/reconciler/pipelinerun/resources/pipelinerunresolution_test.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3201,6 +3201,113 @@ func TestResolvePipelineRunTask_WithMatrix(t *testing.T) {
32013201
}
32023202
}
32033203

3204+
func TestResolvePipelineRunTask_WithMatrixedCustomTask(t *testing.T) {
3205+
pipelineRunName := "pipelinerun"
3206+
pipelineTaskName := "pipelinetask"
3207+
3208+
pr := v1beta1.PipelineRun{
3209+
ObjectMeta: metav1.ObjectMeta{
3210+
Name: pipelineRunName,
3211+
},
3212+
}
3213+
3214+
var runs []*v1alpha1.Run
3215+
var runNames []string
3216+
runsMap := map[string]*v1alpha1.Run{}
3217+
for i := 0; i < 9; i++ {
3218+
runName := fmt.Sprintf("%s-%s-%d", pipelineRunName, pipelineTaskName, i)
3219+
run := &v1alpha1.Run{
3220+
ObjectMeta: metav1.ObjectMeta{
3221+
Name: runName,
3222+
},
3223+
}
3224+
runs = append(runs, run)
3225+
runNames = append(runNames, runName)
3226+
runsMap[runName] = run
3227+
}
3228+
3229+
pts := []v1beta1.PipelineTask{{
3230+
Name: "pipelinetask",
3231+
TaskRef: &v1beta1.TaskRef{
3232+
APIVersion: "example.dev/v0",
3233+
Kind: "Example",
3234+
Name: "my-task",
3235+
},
3236+
Matrix: []v1beta1.Param{{
3237+
Name: "platform",
3238+
Value: v1beta1.ArrayOrString{Type: v1beta1.ParamTypeArray, ArrayVal: []string{"linux", "mac", "windows"}},
3239+
}},
3240+
}, {
3241+
Name: "pipelinetask",
3242+
TaskRef: &v1beta1.TaskRef{
3243+
APIVersion: "example.dev/v0",
3244+
Kind: "Example",
3245+
Name: "my-task",
3246+
},
3247+
Matrix: []v1beta1.Param{{
3248+
Name: "platform",
3249+
Value: v1beta1.ArrayOrString{Type: v1beta1.ParamTypeArray, ArrayVal: []string{"linux", "mac", "windows"}},
3250+
}, {
3251+
Name: "browsers",
3252+
Value: v1beta1.ArrayOrString{Type: v1beta1.ParamTypeArray, ArrayVal: []string{"chrome", "safari", "firefox"}},
3253+
}},
3254+
}}
3255+
3256+
rtr := &resources.ResolvedTaskResources{
3257+
TaskName: "task",
3258+
TaskSpec: &v1beta1.TaskSpec{Steps: []v1beta1.Step{{
3259+
Name: "step1",
3260+
}}},
3261+
}
3262+
3263+
getTask := func(ctx context.Context, name string) (v1beta1.TaskObject, error) { return task, nil }
3264+
getTaskRun := func(name string) (*v1beta1.TaskRun, error) { return &trs[0], nil }
3265+
getRun := func(name string) (*v1alpha1.Run, error) { return runsMap[name], nil }
3266+
3267+
for _, tc := range []struct {
3268+
name string
3269+
pt v1beta1.PipelineTask
3270+
want *ResolvedPipelineTask
3271+
}{{
3272+
name: "custom task with matrix - single parameter",
3273+
pt: pts[0],
3274+
want: &ResolvedPipelineTask{
3275+
RunNames: runNames[:3],
3276+
Runs: runs[:3],
3277+
PipelineTask: &pts[0],
3278+
ResolvedTaskResources: rtr,
3279+
},
3280+
}, {
3281+
name: "custom task with matrix - multiple parameters",
3282+
pt: pts[1],
3283+
want: &ResolvedPipelineTask{
3284+
RunNames: runNames,
3285+
Runs: runs,
3286+
PipelineTask: &pts[1],
3287+
ResolvedTaskResources: rtr,
3288+
},
3289+
}} {
3290+
t.Run(tc.name, func(t *testing.T) {
3291+
ctx := context.Background()
3292+
cfg := config.NewStore(logtesting.TestLogger(t))
3293+
cfg.OnConfigChanged(&corev1.ConfigMap{
3294+
ObjectMeta: metav1.ObjectMeta{Name: config.GetFeatureFlagsConfigName()},
3295+
Data: map[string]string{
3296+
"enable-api-fields": "alpha",
3297+
},
3298+
})
3299+
ctx = cfg.ToContext(ctx)
3300+
rpt, err := ResolvePipelineTask(ctx, pr, getTask, getTaskRun, getRun, tc.pt, nil)
3301+
if err != nil {
3302+
t.Fatalf("Did not expect error when resolving PipelineRun: %v", err)
3303+
}
3304+
if d := cmp.Diff(tc.want, rpt); d != "" {
3305+
t.Errorf("Did not get expected ResolvePipelineTask with Matrix: %s", diff.PrintWantGot(d))
3306+
}
3307+
})
3308+
}
3309+
}
3310+
32043311
func TestIsSuccessful(t *testing.T) {
32053312
for _, tc := range []struct {
32063313
name string

0 commit comments

Comments
 (0)