@@ -641,7 +641,11 @@ func (c *Reconciler) runNextSchedulableTask(ctx context.Context, pr *v1beta1.Pip
641641 return fmt .Errorf ("error creating Run called %s for PipelineTask %s from PipelineRun %s: %w" , rprt .RunName , rprt .PipelineTask .Name , pr .Name , err )
642642 }
643643 } else {
644- rprt .TaskRun , err = c .createTaskRun (ctx , rprt , pr , as .StorageBasePath (pr ))
644+ if rprt .IsFinalTask (pipelineRunFacts ) {
645+ rprt .TaskRun , err = c .createFinallyTaskRun (ctx , rprt , pr , as .StorageBasePath (pr ))
646+ } else {
647+ rprt .TaskRun , err = c .createTaskRun (ctx , rprt , pr , as .StorageBasePath (pr ))
648+ }
645649 if err != nil {
646650 recorder .Eventf (pr , corev1 .EventTypeWarning , "TaskRunCreationFailed" , "Failed to create TaskRun %q: %v" , rprt .TaskRunName , err )
647651 return fmt .Errorf ("error creating TaskRun called %s for PipelineTask %s from PipelineRun %s: %w" , rprt .TaskRunName , rprt .PipelineTask .Name , pr .Name , err )
@@ -692,7 +696,17 @@ func (c *Reconciler) updateRunsStatusDirectly(pr *v1beta1.PipelineRun) error {
692696 return nil
693697}
694698
699+ type getTimeoutFunc func (ctx context.Context , pr * v1beta1.PipelineRun , rprt * resources.ResolvedPipelineRunTask ) * metav1.Duration
700+
695701func (c * Reconciler ) createTaskRun (ctx context.Context , rprt * resources.ResolvedPipelineRunTask , pr * v1beta1.PipelineRun , storageBasePath string ) (* v1beta1.TaskRun , error ) {
702+ return c .createTaskRunHelper (ctx , rprt , pr , storageBasePath , getTaskRunTimeout )
703+ }
704+
705+ func (c * Reconciler ) createFinallyTaskRun (ctx context.Context , rprt * resources.ResolvedPipelineRunTask , pr * v1beta1.PipelineRun , storageBasePath string ) (* v1beta1.TaskRun , error ) {
706+ return c .createTaskRunHelper (ctx , rprt , pr , storageBasePath , getFinallyTaskRunTimeout )
707+ }
708+
709+ func (c * Reconciler ) createTaskRunHelper (ctx context.Context , rprt * resources.ResolvedPipelineRunTask , pr * v1beta1.PipelineRun , storageBasePath string , getTimeoutFunc getTimeoutFunc ) (* v1beta1.TaskRun , error ) {
696710 logger := logging .FromContext (ctx )
697711
698712 tr , _ := c .taskRunLister .TaskRuns (pr .Namespace ).Get (rprt .TaskRunName )
@@ -719,7 +733,7 @@ func (c *Reconciler) createTaskRun(ctx context.Context, rprt *resources.Resolved
719733 Spec : v1beta1.TaskRunSpec {
720734 Params : rprt .PipelineTask .Params ,
721735 ServiceAccountName : taskRunSpec .TaskServiceAccountName ,
722- Timeout : getTaskRunTimeout (ctx , pr , rprt ),
736+ Timeout : getTimeoutFunc (ctx , pr , rprt ),
723737 PodTemplate : taskRunSpec .TaskPodTemplate ,
724738 }}
725739
@@ -926,30 +940,58 @@ func combineTaskRunAndTaskSpecAnnotations(pr *v1beta1.PipelineRun, pipelineTask
926940 return annotations
927941}
928942
929- func getTaskRunTimeout (ctx context.Context , pr * v1beta1.PipelineRun , rprt * resources.ResolvedPipelineRunTask ) * metav1.Duration {
943+ func getFinallyTaskRunTimeout (ctx context.Context , pr * v1beta1.PipelineRun , rprt * resources.ResolvedPipelineRunTask ) * metav1.Duration {
930944 var taskRunTimeout = & metav1.Duration {Duration : apisconfig .NoTimeoutDuration }
931945
932946 var timeout time.Duration
933- if pr .Spec .Timeout == nil {
947+
948+ if pr .Spec .Timeout != nil {
949+ timeout = pr .Spec .Timeout .Duration
950+ } else {
934951 defaultTimeout := time .Duration (config .FromContextOrDefaults (ctx ).Defaults .DefaultTimeoutMinutes )
935952 timeout = defaultTimeout * time .Minute
936- } else {
953+ }
954+
955+ // If the value of the timeout is 0 for any resource, there is no timeout.
956+ // It is impossible for pr.Spec.Timeout to be nil, since SetDefault always assigns it with a value.
957+ taskRunTimeout = taskRunTimeoutHelper (timeout , pr , taskRunTimeout , rprt )
958+
959+ return taskRunTimeout
960+ }
961+
962+ func getTaskRunTimeout (ctx context.Context , pr * v1beta1.PipelineRun , rprt * resources.ResolvedPipelineRunTask ) * metav1.Duration {
963+ var taskRunTimeout = & metav1.Duration {Duration : apisconfig .NoTimeoutDuration }
964+
965+ var timeout time.Duration
966+
967+ // TODO @souleb wrap into alpha feature flag
968+ if pr .Spec .TasksTimeout != nil {
969+ timeout = pr .Spec .TasksTimeout .Duration
970+ } else if pr .Spec .Timeout != nil {
937971 timeout = pr .Spec .Timeout .Duration
972+ } else {
973+ defaultTimeout := time .Duration (config .FromContextOrDefaults (ctx ).Defaults .DefaultTimeoutMinutes )
974+ timeout = defaultTimeout * time .Minute
938975 }
939976
940977 // If the value of the timeout is 0 for any resource, there is no timeout.
941978 // It is impossible for pr.Spec.Timeout to be nil, since SetDefault always assigns it with a value.
979+ taskRunTimeout = taskRunTimeoutHelper (timeout , pr , taskRunTimeout , rprt )
980+
981+ return taskRunTimeout
982+ }
983+
984+ func taskRunTimeoutHelper (timeout time.Duration , pr * v1beta1.PipelineRun , taskRunTimeout * metav1.Duration , rprt * resources.ResolvedPipelineRunTask ) * metav1.Duration {
942985 if timeout != apisconfig .NoTimeoutDuration {
943986 pTimeoutTime := pr .Status .StartTime .Add (timeout )
944987 if time .Now ().After (pTimeoutTime ) {
945- // Just in case something goes awry and we're creating the TaskRun after it should have already timed out,
946- // set the timeout to 1 second.
988+
947989 taskRunTimeout = & metav1.Duration {Duration : time .Until (pTimeoutTime )}
948990 if taskRunTimeout .Duration < 0 {
949991 taskRunTimeout = & metav1.Duration {Duration : 1 * time .Second }
950992 }
951993 } else {
952- // check if PipelineTask has a timeout specified
994+
953995 if rprt .PipelineTask .Timeout != nil {
954996 taskRunTimeout = & metav1.Duration {Duration : rprt .PipelineTask .Timeout .Duration }
955997 } else {
@@ -958,11 +1000,9 @@ func getTaskRunTimeout(ctx context.Context, pr *v1beta1.PipelineRun, rprt *resou
9581000 }
9591001 }
9601002
961- // check if PipelineTask has a timeout specified even if PipelineRun doesn't have a timeout
9621003 if timeout == apisconfig .NoTimeoutDuration && rprt .PipelineTask .Timeout != nil {
9631004 taskRunTimeout = & metav1.Duration {Duration : rprt .PipelineTask .Timeout .Duration }
9641005 }
965-
9661006 return taskRunTimeout
9671007}
9681008
0 commit comments