This is an automated email from the ASF dual-hosted git repository.

pcongiusti pushed a commit to branch release-2.3.x
in repository https://gitbox.apache.org/repos/asf/camel-k.git


The following commit(s) were added to refs/heads/release-2.3.x by this push:
     new 264c343f4 fix(builder): add root and base image to S2I report
264c343f4 is described below

commit 264c343f4fb14a7223d1f9c10847b8986cac7538
Author: Pasquale Congiusti <[email protected]>
AuthorDate: Tue May 28 15:27:12 2024 +0200

    fix(builder): add root and base image to S2I report
---
 docs/modules/ROOT/partials/apis/camel-k-crds.adoc  |  9 +-
 helm/camel-k/crds/crd-build.yaml                   | 27 ++++++
 pkg/apis/camel/v1/build_types.go                   |  5 +-
 pkg/apis/camel/v1/zz_generated.deepcopy.go         |  1 +
 pkg/builder/builder_test.go                        | 98 +++++++++++++++++++++-
 pkg/builder/jib.go                                 | 25 ++----
 pkg/builder/s2i.go                                 |  4 +-
 pkg/builder/spectrum.go                            | 27 ++----
 pkg/builder/util.go                                | 17 ++++
 .../camel/applyconfiguration/camel/v1/s2itask.go   | 30 ++++++-
 .../config/crd/bases/camel.apache.org_builds.yaml  | 27 ++++++
 pkg/trait/builder.go                               |  4 +
 pkg/trait/builder_test.go                          | 20 +++++
 13 files changed, 244 insertions(+), 50 deletions(-)

diff --git a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc 
b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
index b11fe645a..195ada4f8 100644
--- a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
+++ b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
@@ -5029,6 +5029,7 @@ Properties -- .
 * <<#_camel_apache_org_v1_BuildahTask, BuildahTask>>
 * <<#_camel_apache_org_v1_JibTask, JibTask>>
 * <<#_camel_apache_org_v1_KanikoTask, KanikoTask>>
+* <<#_camel_apache_org_v1_S2iTask, S2iTask>>
 * <<#_camel_apache_org_v1_SpectrumTask, SpectrumTask>>
 
 PublishTask image publish configuration.
@@ -5338,12 +5339,12 @@ S2iTask is used to configure S2I.
 
 
 
-|`contextDir` +
-string
-|
+|`PublishTask` +
+*xref:#_camel_apache_org_v1_PublishTask[PublishTask]*
+|(Members of `PublishTask` are embedded into this type.)
+
 
 
-can be useful to share info with other tasks
 
 |`tag` +
 string
diff --git a/helm/camel-k/crds/crd-build.yaml b/helm/camel-k/crds/crd-build.yaml
index 31635f79d..44a2cb99d 100644
--- a/helm/camel-k/crds/crd-build.yaml
+++ b/helm/camel-k/crds/crd-build.yaml
@@ -1717,6 +1717,9 @@ spec:
                     s2i:
                       description: a S2iTask, for S2I strategy
                       properties:
+                        baseImage:
+                          description: base image layer
+                          type: string
                         configuration:
                           description: The configuration that should be used 
to perform
                             the Build.
@@ -1781,9 +1784,33 @@ spec:
                         contextDir:
                           description: can be useful to share info with other 
tasks
                           type: string
+                        image:
+                          description: final image name
+                          type: string
                         name:
                           description: name of the task
                           type: string
+                        registry:
+                          description: where to publish the final image
+                          properties:
+                            address:
+                              description: the URI to access
+                              type: string
+                            ca:
+                              description: the configmap which stores the 
Certificate
+                                Authority
+                              type: string
+                            insecure:
+                              description: if the container registry is 
insecure (ie,
+                                http only)
+                              type: boolean
+                            organization:
+                              description: the registry organization
+                              type: string
+                            secret:
+                              description: the secret where credentials are 
stored
+                              type: string
+                          type: object
                         tag:
                           description: used by the ImageStream
                           type: string
diff --git a/pkg/apis/camel/v1/build_types.go b/pkg/apis/camel/v1/build_types.go
index 7c1dc4e43..273482e22 100644
--- a/pkg/apis/camel/v1/build_types.go
+++ b/pkg/apis/camel/v1/build_types.go
@@ -175,9 +175,8 @@ type SpectrumTask struct {
 
 // S2iTask is used to configure S2I.
 type S2iTask struct {
-       BaseTask `json:",inline"`
-       // can be useful to share info with other tasks
-       ContextDir string `json:"contextDir,omitempty"`
+       BaseTask    `json:",inline"`
+       PublishTask `json:",inline"`
        // used by the ImageStream
        Tag string `json:"tag,omitempty"`
 }
diff --git a/pkg/apis/camel/v1/zz_generated.deepcopy.go 
b/pkg/apis/camel/v1/zz_generated.deepcopy.go
index 8d1e9dc13..c1e2625c0 100644
--- a/pkg/apis/camel/v1/zz_generated.deepcopy.go
+++ b/pkg/apis/camel/v1/zz_generated.deepcopy.go
@@ -2866,6 +2866,7 @@ func (in *RuntimeSpec) DeepCopy() *RuntimeSpec {
 func (in *S2iTask) DeepCopyInto(out *S2iTask) {
        *out = *in
        in.BaseTask.DeepCopyInto(&out.BaseTask)
+       out.PublishTask = in.PublishTask
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, 
creating a new S2iTask.
diff --git a/pkg/builder/builder_test.go b/pkg/builder/builder_test.go
index 1f8c643b8..dd1277863 100644
--- a/pkg/builder/builder_test.go
+++ b/pkg/builder/builder_test.go
@@ -34,7 +34,7 @@ type errorTestSteps struct {
        Step2 Step
 }
 
-func TestFailure(t *testing.T) {
+func TestBuilderFailure(t *testing.T) {
        c, err := test.NewFakeClient()
        require.NoError(t, err)
 
@@ -74,3 +74,99 @@ func TestFailure(t *testing.T) {
        assert.Equal(t, v1.BuildPhaseFailed, status.Phase)
        assert.Equal(t, "an error", status.Error)
 }
+
+func TestS2IPublishingFailure(t *testing.T) {
+       c, err := test.NewFakeClient()
+       require.NoError(t, err)
+       b := New(c)
+       build := &v1.Build{
+               Spec: v1.BuildSpec{
+                       Tasks: []v1.Task{
+                               {
+                                       S2i: &v1.S2iTask{
+                                               BaseTask: v1.BaseTask{
+                                                       Name: "s2i",
+                                               },
+                                               PublishTask: v1.PublishTask{
+                                                       BaseImage: "base-image",
+                                               },
+                                       },
+                               },
+                       },
+               },
+               Status: v1.BuildStatus{
+                       RootImage: "root-image",
+               },
+       }
+
+       ctx := cancellable.NewContext()
+       status := b.Build(build).TaskByName("s2i").Do(ctx)
+       assert.Equal(t, v1.BuildPhaseFailed, status.Phase)
+       assert.NotEmpty(t, status.Error)
+       assert.Equal(t, "base-image", status.BaseImage)
+       assert.Equal(t, "root-image", status.RootImage)
+}
+
+func TestJibPublishingFailure(t *testing.T) {
+       c, err := test.NewFakeClient()
+       require.NoError(t, err)
+       b := New(c)
+       build := &v1.Build{
+               Spec: v1.BuildSpec{
+                       Tasks: []v1.Task{
+                               {
+                                       Jib: &v1.JibTask{
+                                               BaseTask: v1.BaseTask{
+                                                       Name: "jib",
+                                               },
+                                               PublishTask: v1.PublishTask{
+                                                       BaseImage: "base-image",
+                                               },
+                                       },
+                               },
+                       },
+               },
+               Status: v1.BuildStatus{
+                       RootImage: "root-image",
+               },
+       }
+
+       ctx := cancellable.NewContext()
+       status := b.Build(build).TaskByName("jib").Do(ctx)
+       assert.Equal(t, v1.BuildPhaseFailed, status.Phase)
+       assert.NotEmpty(t, status.Error)
+       assert.Equal(t, "base-image", status.BaseImage)
+       assert.Equal(t, "root-image", status.RootImage)
+}
+
+func TestSpectrumPublishingFailure(t *testing.T) {
+       c, err := test.NewFakeClient()
+       require.NoError(t, err)
+       b := New(c)
+       build := &v1.Build{
+               Spec: v1.BuildSpec{
+                       Tasks: []v1.Task{
+                               {
+                                       Spectrum: &v1.SpectrumTask{
+                                               BaseTask: v1.BaseTask{
+                                                       Name: "spectrum",
+                                               },
+                                               PublishTask: v1.PublishTask{
+                                                       BaseImage: "base-image",
+                                               },
+                                       },
+                               },
+                       },
+               },
+               Status: v1.BuildStatus{
+                       RootImage: "root-image",
+               },
+       }
+
+       ctx := cancellable.NewContext()
+       status := b.Build(build).TaskByName("spectrum").Do(ctx)
+       assert.Equal(t, v1.BuildPhaseFailed, status.Phase)
+       assert.NotEmpty(t, status.Error)
+       assert.Equal(t, "base-image", status.BaseImage)
+       assert.Equal(t, "root-image", status.RootImage)
+}
diff --git a/pkg/builder/jib.go b/pkg/builder/jib.go
index 8285c907e..1c3255ade 100644
--- a/pkg/builder/jib.go
+++ b/pkg/builder/jib.go
@@ -43,18 +43,7 @@ type jibTask struct {
 var _ Task = &jibTask{}
 
 func (t *jibTask) Do(ctx context.Context) v1.BuildStatus {
-       status := v1.BuildStatus{}
-
-       baseImage := t.build.Status.BaseImage
-       if baseImage == "" {
-               baseImage = t.task.BaseImage
-       }
-       status.BaseImage = baseImage
-       rootImage := t.build.Status.RootImage
-       if rootImage == "" {
-               rootImage = t.task.BaseImage
-       }
-       status.RootImage = rootImage
+       status := initializeStatusFrom(t.build.Status, t.task.BaseImage)
 
        contextDir := t.task.ContextDir
        if contextDir == "" {
@@ -80,14 +69,14 @@ func (t *jibTask) Do(ctx context.Context) v1.BuildStatus {
        if !exists || empty {
                // this can only indicate that there are no more resources to 
add to the base image,
                // because transitive resolution is the same even if spec 
differs.
-               log.Infof("No new image to build, reusing existing image %s", 
baseImage)
-               status.Image = baseImage
-               return status
+               status.Image = status.BaseImage
+               log.Infof("No new image to build, reusing existing image %s", 
status.Image)
+               return *status
        }
        mavenDir := strings.ReplaceAll(contextDir, ContextDir, "maven")
 
        log.Debugf("Registry address: %s", t.task.Registry.Address)
-       log.Debugf("Base image: %s", baseImage)
+       log.Debugf("Base image: %s", status.BaseImage)
 
        registryConfigDir := ""
        if t.task.Registry.Secret != "" {
@@ -109,7 +98,7 @@ func (t *jibTask) Do(ctx context.Context) v1.BuildStatus {
        mavenArgs = append(mavenArgs, strings.Split(string(mavenCommand), " 
")...)
        mavenArgs = append(mavenArgs, "-P", "jib")
        mavenArgs = append(mavenArgs, jib.JibMavenToImageParam+t.task.Image)
-       mavenArgs = append(mavenArgs, jib.JibMavenFromImageParam+baseImage)
+       mavenArgs = append(mavenArgs, 
jib.JibMavenFromImageParam+status.BaseImage)
        mavenArgs = append(mavenArgs, 
jib.JibMavenBaseImageCache+mavenDir+"/jib")
        if t.task.Configuration.ImagePlatforms != nil {
                platforms := strings.Join(t.task.Configuration.ImagePlatforms, 
",")
@@ -154,7 +143,7 @@ func (t *jibTask) Do(ctx context.Context) v1.BuildStatus {
                }
        }
 
-       return status
+       return *status
 }
 
 func cleanRegistryConfig(registryConfigDir string) error {
diff --git a/pkg/builder/s2i.go b/pkg/builder/s2i.go
index 718e9eb05..e88387bfa 100644
--- a/pkg/builder/s2i.go
+++ b/pkg/builder/s2i.go
@@ -59,7 +59,7 @@ type s2iTask struct {
 var _ Task = &s2iTask{}
 
 func (t *s2iTask) Do(ctx context.Context) v1.BuildStatus {
-       status := v1.BuildStatus{}
+       status := initializeStatusFrom(t.build.Status, t.task.BaseImage)
 
        bc := &buildv1.BuildConfig{
                TypeMeta: metav1.TypeMeta{
@@ -220,7 +220,7 @@ func (t *s2iTask) Do(ctx context.Context) v1.BuildStatus {
                return status.Failed(err)
        }
 
-       return status
+       return *status
 }
 
 func (t *s2iTask) getControllerReference() metav1.Object {
diff --git a/pkg/builder/spectrum.go b/pkg/builder/spectrum.go
index dbe70d7b5..ffc9ca881 100644
--- a/pkg/builder/spectrum.go
+++ b/pkg/builder/spectrum.go
@@ -44,18 +44,7 @@ type spectrumTask struct {
 var _ Task = &spectrumTask{}
 
 func (t *spectrumTask) Do(ctx context.Context) v1.BuildStatus {
-       status := v1.BuildStatus{}
-
-       baseImage := t.build.Status.BaseImage
-       if baseImage == "" {
-               baseImage = t.task.BaseImage
-       }
-       status.BaseImage = baseImage
-       rootImage := t.build.Status.RootImage
-       if rootImage == "" {
-               rootImage = t.task.BaseImage
-       }
-       status.RootImage = rootImage
+       status := initializeStatusFrom(t.build.Status, t.task.BaseImage)
 
        contextDir := t.task.ContextDir
        if contextDir == "" {
@@ -83,17 +72,17 @@ func (t *spectrumTask) Do(ctx context.Context) 
v1.BuildStatus {
        if !exists || empty {
                // this can only indicate that there are no more resources to 
add to the base image,
                // because transitive resolution is the same even if spec 
differs.
-               log.Infof("No new image to build, reusing existing image %s", 
baseImage)
-               status.Image = baseImage
-               return status
+               status.Image = status.BaseImage
+               log.Infof("No new image to build, reusing existing image %s", 
status.Image)
+               return *status
        }
 
        pullInsecure := t.task.Registry.Insecure // incremental build case
 
        log.Debugf("Registry address: %s", t.task.Registry.Address)
-       log.Debugf("Base image: %s", baseImage)
+       log.Debugf("Base image: %s", status.BaseImage)
 
-       if !strings.HasPrefix(baseImage, t.task.Registry.Address) {
+       if !strings.HasPrefix(status.BaseImage, t.task.Registry.Address) {
                if pullInsecure {
                        log.Info("Assuming secure pull because the registry for 
the base image and the main registry are different")
                        pullInsecure = false
@@ -122,7 +111,7 @@ func (t *spectrumTask) Do(ctx context.Context) 
v1.BuildStatus {
                PushInsecure:  t.task.Registry.Insecure,
                PullConfigDir: registryConfigDir,
                PushConfigDir: registryConfigDir,
-               Base:          baseImage,
+               Base:          status.BaseImage,
                Target:        t.task.Image,
                Stdout:        newStdW,
                Stderr:        newStdW,
@@ -149,7 +138,7 @@ func (t *spectrumTask) Do(ctx context.Context) 
v1.BuildStatus {
                }
        }
 
-       return status
+       return *status
 }
 
 func readSpectrumLogs(newStdOut io.Reader) {
diff --git a/pkg/builder/util.go b/pkg/builder/util.go
index aad11bc3a..721306f6f 100644
--- a/pkg/builder/util.go
+++ b/pkg/builder/util.go
@@ -30,3 +30,20 @@ func artifactIDs(artifacts []v1.Artifact) []string {
 
        return result
 }
+
+// initializeStatusFrom helps creating a BuildStatus from scratch filling with 
base and root images.
+func initializeStatusFrom(buildStatus v1.BuildStatus, taskBaseImage string) 
*v1.BuildStatus {
+       status := v1.BuildStatus{}
+       baseImage := buildStatus.BaseImage
+       if baseImage == "" {
+               baseImage = taskBaseImage
+       }
+       status.BaseImage = baseImage
+       rootImage := buildStatus.RootImage
+       if rootImage == "" {
+               rootImage = taskBaseImage
+       }
+       status.RootImage = rootImage
+
+       return &status
+}
diff --git a/pkg/client/camel/applyconfiguration/camel/v1/s2itask.go 
b/pkg/client/camel/applyconfiguration/camel/v1/s2itask.go
index da1a36d56..820fb4b35 100644
--- a/pkg/client/camel/applyconfiguration/camel/v1/s2itask.go
+++ b/pkg/client/camel/applyconfiguration/camel/v1/s2itask.go
@@ -22,9 +22,9 @@ package v1
 // S2iTaskApplyConfiguration represents an declarative configuration of the 
S2iTask type for use
 // with apply.
 type S2iTaskApplyConfiguration struct {
-       BaseTaskApplyConfiguration `json:",inline"`
-       ContextDir                 *string `json:"contextDir,omitempty"`
-       Tag                        *string `json:"tag,omitempty"`
+       BaseTaskApplyConfiguration    `json:",inline"`
+       PublishTaskApplyConfiguration `json:",inline"`
+       Tag                           *string `json:"tag,omitempty"`
 }
 
 // S2iTaskApplyConfiguration constructs an declarative configuration of the 
S2iTask type for use with
@@ -57,6 +57,30 @@ func (b *S2iTaskApplyConfiguration) WithContextDir(value 
string) *S2iTaskApplyCo
        return b
 }
 
+// WithBaseImage sets the BaseImage field in the declarative configuration to 
the given value
+// and returns the receiver, so that objects can be built by chaining "With" 
function invocations.
+// If called multiple times, the BaseImage field is set to the value of the 
last call.
+func (b *S2iTaskApplyConfiguration) WithBaseImage(value string) 
*S2iTaskApplyConfiguration {
+       b.BaseImage = &value
+       return b
+}
+
+// WithImage sets the Image field in the declarative configuration to the 
given value
+// and returns the receiver, so that objects can be built by chaining "With" 
function invocations.
+// If called multiple times, the Image field is set to the value of the last 
call.
+func (b *S2iTaskApplyConfiguration) WithImage(value string) 
*S2iTaskApplyConfiguration {
+       b.Image = &value
+       return b
+}
+
+// WithRegistry sets the Registry field in the declarative configuration to 
the given value
+// and returns the receiver, so that objects can be built by chaining "With" 
function invocations.
+// If called multiple times, the Registry field is set to the value of the 
last call.
+func (b *S2iTaskApplyConfiguration) WithRegistry(value 
*RegistrySpecApplyConfiguration) *S2iTaskApplyConfiguration {
+       b.Registry = value
+       return b
+}
+
 // WithTag sets the Tag field in the declarative configuration to the given 
value
 // and returns the receiver, so that objects can be built by chaining "With" 
function invocations.
 // If called multiple times, the Tag field is set to the value of the last 
call.
diff --git a/pkg/resources/config/crd/bases/camel.apache.org_builds.yaml 
b/pkg/resources/config/crd/bases/camel.apache.org_builds.yaml
index 31635f79d..44a2cb99d 100644
--- a/pkg/resources/config/crd/bases/camel.apache.org_builds.yaml
+++ b/pkg/resources/config/crd/bases/camel.apache.org_builds.yaml
@@ -1717,6 +1717,9 @@ spec:
                     s2i:
                       description: a S2iTask, for S2I strategy
                       properties:
+                        baseImage:
+                          description: base image layer
+                          type: string
                         configuration:
                           description: The configuration that should be used 
to perform
                             the Build.
@@ -1781,9 +1784,33 @@ spec:
                         contextDir:
                           description: can be useful to share info with other 
tasks
                           type: string
+                        image:
+                          description: final image name
+                          type: string
                         name:
                           description: name of the task
                           type: string
+                        registry:
+                          description: where to publish the final image
+                          properties:
+                            address:
+                              description: the URI to access
+                              type: string
+                            ca:
+                              description: the configmap which stores the 
Certificate
+                                Authority
+                              type: string
+                            insecure:
+                              description: if the container registry is 
insecure (ie,
+                                http only)
+                              type: boolean
+                            organization:
+                              description: the registry organization
+                              type: string
+                            secret:
+                              description: the secret where credentials are 
stored
+                              type: string
+                          type: object
                         tag:
                           description: used by the ImageStream
                           type: string
diff --git a/pkg/trait/builder.go b/pkg/trait/builder.go
index d3c20dc08..fb9272112 100644
--- a/pkg/trait/builder.go
+++ b/pkg/trait/builder.go
@@ -292,6 +292,10 @@ func (t *builderTrait) Apply(e *Environment) error {
                                Name:          "s2i",
                                Configuration: *taskConfOrDefault(tasksConf, 
"s2i"),
                        },
+                       PublishTask: v1.PublishTask{
+                               BaseImage: t.getBaseImage(e),
+                               Image:     imageName,
+                       },
                        Tag: e.IntegrationKit.ResourceVersion,
                }})
        }
diff --git a/pkg/trait/builder_test.go b/pkg/trait/builder_test.go
index dd831b640..fc6b18b56 100644
--- a/pkg/trait/builder_test.go
+++ b/pkg/trait/builder_test.go
@@ -90,6 +90,25 @@ func TestS2IBuilderTrait(t *testing.T) {
        assert.NotNil(t, env.Pipeline[0].Builder)
        assert.NotNil(t, env.Pipeline[1].Package)
        assert.NotNil(t, env.Pipeline[2].S2i)
+       assert.Equal(t, "root-jdk-image", env.Pipeline[2].S2i.BaseImage)
+       assert.Empty(t, env.Pipeline[2].S2i.Registry)
+}
+
+func TestJibBuilderTrait(t *testing.T) {
+       env := createBuilderTestEnv(v1.IntegrationPlatformClusterOpenShift, 
v1.IntegrationPlatformBuildPublishStrategyJib, v1.BuildStrategyRoutine)
+       conditions, err := NewBuilderTestCatalog().apply(env)
+
+       require.NoError(t, err)
+       assert.NotEmpty(t, conditions)
+       assert.NotEmpty(t, env.ExecutedTraits)
+       assert.NotNil(t, env.GetTrait("builder"))
+       assert.NotEmpty(t, env.Pipeline)
+       assert.Len(t, env.Pipeline, 3)
+       assert.NotNil(t, env.Pipeline[0].Builder)
+       assert.NotNil(t, env.Pipeline[1].Package)
+       assert.NotNil(t, env.Pipeline[2].Jib)
+       assert.Equal(t, "root-jdk-image", env.Pipeline[2].Jib.BaseImage)
+       assert.NotEmpty(t, env.Pipeline[2].Jib.Registry)
 }
 
 func createBuilderTestEnv(cluster v1.IntegrationPlatformCluster, strategy 
v1.IntegrationPlatformBuildPublishStrategy, buildStrategy v1.BuildStrategy) 
*Environment {
@@ -134,6 +153,7 @@ func createBuilderTestEnv(cluster 
v1.IntegrationPlatformCluster, strategy v1.Int
                                        BuildConfiguration: 
v1.BuildConfiguration{
                                                Strategy: buildStrategy,
                                        },
+                                       BaseImage: "root-jdk-image",
                                },
                        },
                        Status: v1.IntegrationPlatformStatus{

Reply via email to