You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by as...@apache.org on 2021/03/19 15:18:52 UTC

[camel-k] 06/13: feat: Coordinate task working directories automatically

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 7d1db84ff176021dbc524adb96cfcf9e03b871a4
Author: Antonin Stefanutti <an...@stefanutti.fr>
AuthorDate: Thu Mar 18 16:02:58 2021 +0100

    feat: Coordinate task working directories automatically
---
 pkg/builder/image.go                     |  4 ++-
 pkg/controller/build/schedule_pod.go     | 43 ++++++++++++++---------------
 pkg/controller/build/schedule_routine.go | 46 ++++++++++++++++++++++++++------
 pkg/trait/builder.go                     | 23 +++-------------
 4 files changed, 67 insertions(+), 49 deletions(-)

diff --git a/pkg/builder/image.go b/pkg/builder/image.go
index a94aa9c..9ec8bf1 100644
--- a/pkg/builder/image.go
+++ b/pkg/builder/image.go
@@ -31,6 +31,8 @@ import (
 	"github.com/apache/camel-k/pkg/util/controller"
 )
 
+const ContextDir = "context"
+
 type artifactsSelector func(ctx *builderContext) error
 
 func standardImageContext(ctx *builderContext) error {
@@ -84,7 +86,7 @@ func imageContext(ctx *builderContext, selector artifactsSelector) error {
 		return err
 	}
 
-	contextDir := path.Join(ctx.Path, "context")
+	contextDir := path.Join(ctx.Path, ContextDir)
 
 	err = os.MkdirAll(contextDir, 0777)
 	if err != nil {
diff --git a/pkg/controller/build/schedule_pod.go b/pkg/controller/build/schedule_pod.go
index 1e2f3ac..8876222 100644
--- a/pkg/controller/build/schedule_pod.go
+++ b/pkg/controller/build/schedule_pod.go
@@ -41,7 +41,10 @@ import (
 	"github.com/apache/camel-k/pkg/util/kubernetes"
 )
 
-const builderVolume = "camel-k-builder"
+const (
+	builderDir    = "/builder"
+	builderVolume = "camel-k-builder"
+)
 
 type schedulePodAction struct {
 	baseAction
@@ -246,7 +249,15 @@ func (action *schedulePodAction) newBuildPod(ctx context.Context, build *v1.Buil
 }
 
 func (action *schedulePodAction) addBuilderTaskToPod(build *v1.Build, task *v1.BuilderTask, pod *corev1.Pod) {
-	pod.Spec.InitContainers = append(pod.Spec.InitContainers, corev1.Container{
+	// Add the EmptyDir volume used to share the build state across tasks
+	pod.Spec.Volumes = append(pod.Spec.Volumes, corev1.Volume{
+		Name: builderVolume,
+		VolumeSource: corev1.VolumeSource{
+			EmptyDir: &corev1.EmptyDirVolumeSource{},
+		},
+	})
+
+	container := corev1.Container{
 		Name:            task.Name,
 		Image:           action.operatorImage,
 		ImagePullPolicy: corev1.PullIfNotPresent,
@@ -260,20 +271,10 @@ func (action *schedulePodAction) addBuilderTaskToPod(build *v1.Build, task *v1.B
 			"--task-name",
 			task.Name,
 		},
-		VolumeMounts: []corev1.VolumeMount{
-			{
-				Name:      builderVolume,
-				MountPath: builderDir,
-			},
-		},
-	})
+		WorkingDir: path.Join(builderDir, build.Name),
+	}
 
-	pod.Spec.Volumes = append(pod.Spec.Volumes, corev1.Volume{
-		Name: builderVolume,
-		VolumeSource: corev1.VolumeSource{
-			EmptyDir: &corev1.EmptyDirVolumeSource{},
-		},
-	})
+	action.addContainerToPod(build, container, pod)
 }
 
 func (action *schedulePodAction) addBuildahTaskToPod(ctx context.Context, build *v1.Build, task *v1.BuildahTask, pod *corev1.Pod) error {
@@ -357,13 +358,13 @@ func (action *schedulePodAction) addBuildahTaskToPod(ctx context.Context, build
 		Command:         []string{"/bin/sh", "-c"},
 		Args:            []string{strings.Join(args, " && ")},
 		Env:             env,
-		WorkingDir:      path.Join(builderDir, e.IntegrationKit.Name, "context"),
+		WorkingDir:      path.Join(builderDir, build.Name, builder.ContextDir),
 		VolumeMounts:    volumeMounts,
 	}
 
 	pod.Spec.Volumes = append(pod.Spec.Volumes, volumes...)
 
-	action.addContainerToPod(container, pod)
+	action.addContainerToPod(build, container, pod)
 
 	return nil
 }
@@ -376,7 +377,7 @@ func (action *schedulePodAction) addKanikoTaskToPod(ctx context.Context, build *
 
 	args := []string{
 		"--dockerfile=Dockerfile",
-		"--context=" + path.Join(builderDir, e.IntegrationKit.Name, "context"),
+		"--context=" + path.Join(builderDir, build.Name, builder.ContextDir),
 		"--destination=" + task.Image,
 		"--cache=" + strconv.FormatBool(cache),
 		"--cache-dir=" + builder.KanikoCacheDir,
@@ -473,16 +474,16 @@ func (action *schedulePodAction) addKanikoTaskToPod(ctx context.Context, build *
 	pod.Spec.Affinity = affinity
 	pod.Spec.Volumes = append(pod.Spec.Volumes, volumes...)
 
-	action.addContainerToPod(container, pod)
+	action.addContainerToPod(build, container, pod)
 
 	return nil
 }
 
-func (action *schedulePodAction) addContainerToPod(container corev1.Container, pod *corev1.Pod) {
+func (action *schedulePodAction) addContainerToPod(build *v1.Build, container corev1.Container, pod *corev1.Pod) {
 	if action.hasBuilderVolume(pod) {
 		container.VolumeMounts = append(container.VolumeMounts, corev1.VolumeMount{
 			Name:      builderVolume,
-			MountPath: builderDir,
+			MountPath: path.Join(builderDir, build.Name),
 		})
 	}
 
diff --git a/pkg/controller/build/schedule_routine.go b/pkg/controller/build/schedule_routine.go
index e2cfc63..1f31852 100644
--- a/pkg/controller/build/schedule_routine.go
+++ b/pkg/controller/build/schedule_routine.go
@@ -19,6 +19,9 @@ package build
 
 import (
 	"context"
+	"io/ioutil"
+	"os"
+	"path"
 	"sync"
 	"time"
 
@@ -114,28 +117,55 @@ func (action *scheduleRoutineAction) runBuild(ctx context.Context, build *v1.Bui
 		return
 	}
 
-	// FIXME: Clean-up build directory
+	buildDir := ""
+	defer os.RemoveAll(buildDir)
+
 	for i, task := range build.Spec.Tasks {
-		status := action.builder.Build(build).Task(task).Do(ctx)
+		// Coordinate the build and context directories across the sequence of tasks
+		if t := task.Builder; t != nil {
+			if t.BuildDir == "" {
+				tmpDir, err := ioutil.TempDir(os.TempDir(), build.Name+"-")
+				if err != nil {
+					status.Failed(err)
+					break
+				}
+				t.BuildDir = tmpDir
+			}
+			buildDir = t.BuildDir
+		} else if t := task.Spectrum; t != nil && t.ContextDir == "" {
+			t.ContextDir = path.Join(buildDir, builder.ContextDir)
+		} else if t := task.S2i; t != nil && t.ContextDir == "" {
+			t.ContextDir = path.Join(buildDir, builder.ContextDir)
+		}
+
+		// Execute the task
+		status = action.builder.Build(build).Task(task).Do(ctx)
 
 		lastTask := i == len(build.Spec.Tasks)-1
 		taskFailed := status.Phase == v1.BuildPhaseFailed || status.Phase == v1.BuildPhaseError
 		if lastTask && !taskFailed {
 			status.Phase = v1.BuildPhaseSucceeded
 		}
-		if lastTask || taskFailed {
-			duration := metav1.Now().Sub(build.Status.StartedAt.Time)
-			status.Duration = duration.String()
 
-			// Account for the Build metrics
-			observeBuildResult(build, status.Phase, duration)
+		if lastTask || taskFailed {
+			// Spare a redundant update
+			break
 		}
 
+		// Update the Build status
 		err := action.updateBuildStatus(ctx, build, status)
-		if err != nil || taskFailed {
+		if err != nil {
+			status.Failed(err)
 			break
 		}
 	}
+
+	duration := metav1.Now().Sub(build.Status.StartedAt.Time)
+	status.Duration = duration.String()
+	// Account for the Build metrics
+	observeBuildResult(build, status.Phase, duration)
+
+	_ = action.updateBuildStatus(ctx, build, status)
 }
 
 func (action *scheduleRoutineAction) updateBuildStatus(ctx context.Context, build *v1.Build, status v1.BuildStatus) error {
diff --git a/pkg/trait/builder.go b/pkg/trait/builder.go
index ede0e8e..07d7401 100644
--- a/pkg/trait/builder.go
+++ b/pkg/trait/builder.go
@@ -18,9 +18,6 @@ limitations under the License.
 package trait
 
 import (
-	"io/ioutil"
-	"os"
-	"path"
 	"sort"
 
 	v1 "github.com/apache/camel-k/pkg/apis/camel/v1"
@@ -64,16 +61,6 @@ func (t *builderTrait) Configure(e *Environment) (bool, error) {
 func (t *builderTrait) Apply(e *Environment) error {
 	builderTask := t.builderTask(e)
 
-	switch e.Platform.Status.Build.PublishStrategy {
-	case v1.IntegrationPlatformBuildPublishStrategyBuildah, v1.IntegrationPlatformBuildPublishStrategyKaniko:
-		builderTask.BuildDir = path.Join(builderDir, e.IntegrationKit.Name)
-	default:
-		tmpDir, err := ioutil.TempDir(os.TempDir(), e.IntegrationKit.Name+"-")
-		if err != nil {
-			return err
-		}
-		builderTask.BuildDir = tmpDir
-	}
 	e.BuildTasks = append(e.BuildTasks, v1.Task{Builder: builderTask})
 
 	switch e.Platform.Status.Build.PublishStrategy {
@@ -83,10 +70,9 @@ func (t *builderTrait) Apply(e *Environment) error {
 				Name: "spectrum",
 			},
 			PublishTask: v1.PublishTask{
-				ContextDir: path.Join(builderTask.BuildDir, "context"),
-				BaseImage:  e.Platform.Status.Build.BaseImage,
-				Image:      getImageName(e),
-				Registry:   e.Platform.Status.Build.Registry,
+				BaseImage: e.Platform.Status.Build.BaseImage,
+				Image:     getImageName(e),
+				Registry:  e.Platform.Status.Build.Registry,
 			},
 		}})
 
@@ -95,8 +81,7 @@ func (t *builderTrait) Apply(e *Environment) error {
 			BaseTask: v1.BaseTask{
 				Name: "s2i",
 			},
-			ContextDir: path.Join(builderTask.BuildDir, "context"),
-			Tag:        e.IntegrationKit.ResourceVersion,
+			Tag: e.IntegrationKit.ResourceVersion,
 		}})
 
 	case v1.IntegrationPlatformBuildPublishStrategyBuildah: