This is an automated email from the ASF dual-hosted git repository. astefanutti pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit e5b2c1ed9cf8060822bef8e35dfd18681a05cef4 Author: Antonin Stefanutti <[email protected]> AuthorDate: Tue Dec 17 12:18:35 2019 +0100 fix(build): Fix build routine execution --- pkg/controller/build/schedule_routine.go | 71 ++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/pkg/controller/build/schedule_routine.go b/pkg/controller/build/schedule_routine.go index 6535687..f4abe59 100644 --- a/pkg/controller/build/schedule_routine.go +++ b/pkg/controller/build/schedule_routine.go @@ -91,42 +91,51 @@ func (action *scheduleRoutineAction) Handle(ctx context.Context, build *v1alpha1 } // Start the build asynchronously to avoid blocking the reconcile loop - go func() { - defer action.routines.Delete(build.Name) + action.routines.Store(build.Name, true) - status := v1alpha1.BuildStatus{ - Phase: v1alpha1.BuildPhaseRunning, - StartedAt: metav1.Now(), - } - if err := action.updateBuildStatus(ctx, build, status); err != nil { - return - } + go action.runBuild(ctx, build) - for i, task := range build.Spec.Tasks { - if task.Builder == nil { - status := v1alpha1.BuildStatus{ - // Error the build directly as we know recovery won't work over ill-defined tasks - Phase: v1alpha1.BuildPhaseError, - Error: fmt.Sprintf("task cannot be executed using the routine strategy: %s", task.GetName()), - } - if err := action.updateBuildStatus(ctx, build, status); err != nil { - break - } - } else { - status := action.builder.Run(*task.Builder) - if i == len(build.Spec.Tasks)-1 { - status.Duration = metav1.Now().Sub(build.Status.StartedAt.Time).String() - } - if err := action.updateBuildStatus(ctx, build, status); err != nil { - break - } + return nil, nil +} + +func (action *scheduleRoutineAction) runBuild(ctx context.Context, build *v1alpha1.Build) { + defer action.routines.Delete(build.Name) + + status := v1alpha1.BuildStatus{ + Phase: v1alpha1.BuildPhaseRunning, + StartedAt: metav1.Now(), + } + if err := action.updateBuildStatus(ctx, build, status); err != nil { + return + } + + for i, task := range build.Spec.Tasks { + if task.Builder == nil { + status := v1alpha1.BuildStatus{ + // Error the build directly as we know recovery won't work over ill-defined tasks + Phase: v1alpha1.BuildPhaseError, + Error: fmt.Sprintf("task cannot be executed using the routine strategy: %s", + task.GetName()), + Duration: metav1.Now().Sub(build.Status.StartedAt.Time).String(), } + _ = action.updateBuildStatus(ctx, build, status) + break } - }() - - action.routines.Store(build.Name, true) - return nil, nil + status := action.builder.Run(*task.Builder) + lastTask := i == len(build.Spec.Tasks)-1 + taskFailed := status.Phase == v1alpha1.BuildPhaseFailed + if lastTask || taskFailed { + status.Duration = metav1.Now().Sub(build.Status.StartedAt.Time).String() + } + if lastTask && !taskFailed { + status.Phase = v1alpha1.BuildPhaseSucceeded + } + err := action.updateBuildStatus(ctx, build, status) + if err != nil || taskFailed { + break + } + } } func (action *scheduleRoutineAction) updateBuildStatus(ctx context.Context, build *v1alpha1.Build, status v1alpha1.BuildStatus) error {
