@@ -23,6 +23,7 @@ import (
2323 "fmt"
2424 "path/filepath"
2525 "reflect"
26+ "strconv"
2627 "strings"
2728 "time"
2829
@@ -38,6 +39,7 @@ import (
3839 listersv1alpha1 "github.com/tektoncd/pipeline/pkg/client/listers/pipeline/v1alpha1"
3940 listers "github.com/tektoncd/pipeline/pkg/client/listers/pipeline/v1beta1"
4041 resourcelisters "github.com/tektoncd/pipeline/pkg/client/resource/listers/resource/v1alpha1"
42+ "github.com/tektoncd/pipeline/pkg/matrix"
4143 "github.com/tektoncd/pipeline/pkg/pipelinerunmetrics"
4244 tknreconciler "github.com/tektoncd/pipeline/pkg/reconciler"
4345 "github.com/tektoncd/pipeline/pkg/reconciler/events"
@@ -688,7 +690,8 @@ func (c *Reconciler) runNextSchedulableTask(ctx context.Context, pr *v1beta1.Pip
688690 if rprt == nil || rprt .Skip (pipelineRunFacts ).IsSkipped || rprt .IsFinallySkipped (pipelineRunFacts ).IsSkipped {
689691 continue
690692 }
691- if rprt .IsCustomTask () {
693+ switch {
694+ case rprt .IsCustomTask ():
692695 if rprt .IsFinalTask (pipelineRunFacts ) {
693696 rprt .Run , err = c .createRun (ctx , rprt , pr , getFinallyTaskRunTimeout )
694697 } else {
@@ -698,16 +701,27 @@ func (c *Reconciler) runNextSchedulableTask(ctx context.Context, pr *v1beta1.Pip
698701 recorder .Eventf (pr , corev1 .EventTypeWarning , "RunCreationFailed" , "Failed to create Run %q: %v" , rprt .RunName , err )
699702 return fmt .Errorf ("error creating Run called %s for PipelineTask %s from PipelineRun %s: %w" , rprt .RunName , rprt .PipelineTask .Name , pr .Name , err )
700703 }
701- } else {
704+ case rprt .IsMatrixed ():
705+ if rprt .IsFinalTask (pipelineRunFacts ) {
706+ rprt .TaskRuns , err = c .createTaskRuns (ctx , rprt , pr , as .StorageBasePath (pr ), getFinallyTaskRunTimeout )
707+ } else {
708+ rprt .TaskRuns , err = c .createTaskRuns (ctx , rprt , pr , as .StorageBasePath (pr ), getTaskRunTimeout )
709+ }
710+ if err != nil {
711+ recorder .Eventf (pr , corev1 .EventTypeWarning , "TaskRunsCreationFailed" , "Failed to create TaskRuns %q: %v" , rprt .TaskRunNames , err )
712+ return fmt .Errorf ("error creating TaskRuns called %s for PipelineTask %s from PipelineRun %s: %w" , rprt .TaskRunNames , rprt .PipelineTask .Name , pr .Name , err )
713+ }
714+ default :
702715 if rprt .IsFinalTask (pipelineRunFacts ) {
703- rprt .TaskRun , err = c .createTaskRun (ctx , rprt , pr , as .StorageBasePath (pr ), getFinallyTaskRunTimeout )
716+ rprt .TaskRun , err = c .createTaskRun (ctx , rprt . TaskRunName , nil , rprt , pr , as .StorageBasePath (pr ), getFinallyTaskRunTimeout )
704717 } else {
705- rprt .TaskRun , err = c .createTaskRun (ctx , rprt , pr , as .StorageBasePath (pr ), getTaskRunTimeout )
718+ rprt .TaskRun , err = c .createTaskRun (ctx , rprt . TaskRunName , nil , rprt , pr , as .StorageBasePath (pr ), getTaskRunTimeout )
706719 }
707720 if err != nil {
708721 recorder .Eventf (pr , corev1 .EventTypeWarning , "TaskRunCreationFailed" , "Failed to create TaskRun %q: %v" , rprt .TaskRunName , err )
709722 return fmt .Errorf ("error creating TaskRun called %s for PipelineTask %s from PipelineRun %s: %w" , rprt .TaskRunName , rprt .PipelineTask .Name , pr .Name , err )
710723 }
724+
711725 }
712726 }
713727 return nil
@@ -750,10 +764,24 @@ func (c *Reconciler) updateRunsStatusDirectly(pr *v1beta1.PipelineRun) error {
750764
751765type getTimeoutFunc func (ctx context.Context , pr * v1beta1.PipelineRun , rprt * resources.ResolvedPipelineRunTask , c clock.PassiveClock ) * metav1.Duration
752766
753- func (c * Reconciler ) createTaskRun (ctx context.Context , rprt * resources.ResolvedPipelineRunTask , pr * v1beta1.PipelineRun , storageBasePath string , getTimeoutFunc getTimeoutFunc ) (* v1beta1.TaskRun , error ) {
767+ func (c * Reconciler ) createTaskRuns (ctx context.Context , rprt * resources.ResolvedPipelineRunTask , pr * v1beta1.PipelineRun , storageBasePath string , getTimeoutFunc getTimeoutFunc ) ([]* v1beta1.TaskRun , error ) {
768+ var taskRuns []* v1beta1.TaskRun
769+ matrixCombinations := matrix .FanOut (rprt .PipelineTask .Matrix ).ToMap ()
770+ for i , taskRunName := range rprt .TaskRunNames {
771+ params := matrixCombinations [strconv .Itoa (i )]
772+ taskRun , err := c .createTaskRun (ctx , taskRunName , params , rprt , pr , storageBasePath , getTimeoutFunc )
773+ if err != nil {
774+ return nil , err
775+ }
776+ taskRuns = append (taskRuns , taskRun )
777+ }
778+ return taskRuns , nil
779+ }
780+
781+ func (c * Reconciler ) createTaskRun (ctx context.Context , taskRunName string , params []v1beta1.Param , rprt * resources.ResolvedPipelineRunTask , pr * v1beta1.PipelineRun , storageBasePath string , getTimeoutFunc getTimeoutFunc ) (* v1beta1.TaskRun , error ) {
754782 logger := logging .FromContext (ctx )
755783
756- tr , _ := c .taskRunLister .TaskRuns (pr .Namespace ).Get (rprt . TaskRunName )
784+ tr , _ := c .taskRunLister .TaskRuns (pr .Namespace ).Get (taskRunName )
757785 if tr != nil {
758786 // Don't modify the lister cache's copy.
759787 tr = tr .DeepCopy ()
@@ -767,16 +795,19 @@ func (c *Reconciler) createTaskRun(ctx context.Context, rprt *resources.Resolved
767795
768796 rprt .PipelineTask = resources .ApplyPipelineTaskContexts (rprt .PipelineTask )
769797 taskRunSpec := pr .GetTaskRunSpec (rprt .PipelineTask .Name )
798+ if len (params ) == 0 {
799+ params = rprt .PipelineTask .Params
800+ }
770801 tr = & v1beta1.TaskRun {
771802 ObjectMeta : metav1.ObjectMeta {
772- Name : rprt . TaskRunName ,
803+ Name : taskRunName ,
773804 Namespace : pr .Namespace ,
774805 OwnerReferences : []metav1.OwnerReference {* kmeta .NewControllerRef (pr )},
775806 Labels : combineTaskRunAndTaskSpecLabels (pr , rprt .PipelineTask ),
776807 Annotations : combineTaskRunAndTaskSpecAnnotations (pr , rprt .PipelineTask ),
777808 },
778809 Spec : v1beta1.TaskRunSpec {
779- Params : rprt . PipelineTask . Params ,
810+ Params : params ,
780811 ServiceAccountName : taskRunSpec .TaskServiceAccountName ,
781812 Timeout : getTimeoutFunc (ctx , pr , rprt , c .Clock ),
782813 PodTemplate : taskRunSpec .TaskPodTemplate ,
@@ -803,7 +834,7 @@ func (c *Reconciler) createTaskRun(ctx context.Context, rprt *resources.Resolved
803834 }
804835
805836 resources .WrapSteps (& tr .Spec , rprt .PipelineTask , rprt .ResolvedTaskResources .Inputs , rprt .ResolvedTaskResources .Outputs , storageBasePath )
806- logger .Infof ("Creating a new TaskRun object %s for pipeline task %s" , rprt . TaskRunName , rprt .PipelineTask .Name )
837+ logger .Infof ("Creating a new TaskRun object %s for pipeline task %s" , taskRunName , rprt .PipelineTask .Name )
807838 return c .PipelineClientSet .TektonV1beta1 ().TaskRuns (pr .Namespace ).Create (ctx , tr , metav1.CreateOptions {})
808839}
809840
0 commit comments