You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pc...@apache.org on 2023/10/04 10:52:58 UTC

[camel-k] branch main updated (dc25083a4 -> aee0c5f9c)

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

pcongiusti pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/camel-k.git


    from dc25083a4 fix(e2e): Add installation with helm,kustomize,olm securityContext restricted validation
     new 4de6cc3f6 feat: Quarkus native source
     new 084b771db chore(ctrl): get rid of dynamic builder image
     new 13916436c doc(pipeline): more design details
     new 9ebf9f6b7 fix(ci): lint complains
     new 1cf40d8c0 fix(ci): errors identified by checks
     new 889c4938f feat(pipeline): configure requests and limits for all tasks
     new d8f8104a0 feat(trait): deprecate quarkus package-type
     new de0d1af63 fix(trait): run old native process for runtime pre 3.5.0
     new aee0c5f9c fix(e2e): rename quarkus.mode to build-mode

The 9 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 config/crd/bases/camel.apache.org_builds.yaml      | 803 ++++++++++++++++++++-
 .../bases/camel.apache.org_integrationkits.yaml    |  87 ++-
 .../camel.apache.org_integrationplatforms.yaml     | 170 +++--
 .../crd/bases/camel.apache.org_integrations.yaml   |  79 +-
 .../bases/camel.apache.org_kameletbindings.yaml    |  74 +-
 config/crd/bases/camel.apache.org_pipes.yaml       |  74 +-
 docs/modules/ROOT/camel_k_pipeline.png             | Bin 0 -> 17355 bytes
 .../ROOT/pages/architecture/cr/camel-catalog.adoc  |   4 +-
 .../pages/installation/advanced/build-config.adoc  |   2 +-
 docs/modules/ROOT/pages/pipeline/pipeline.adoc     |  26 +-
 docs/modules/ROOT/pages/pipeline/tekton.adoc       |   7 +-
 .../ROOT/pages/running/runtime-version.adoc        |   2 +-
 docs/modules/ROOT/partials/apis/camel-k-crds.adoc  | 120 ++-
 docs/modules/traits/pages/builder.adoc             |  22 +-
 docs/modules/traits/pages/quarkus.adoc             |  21 +-
 e2e/builder/build_test.go                          |   2 +-
 e2e/common/traits/builder_test.go                  |  13 +-
 .../catalog_builder_test.go                        |  45 +-
 e2e/install/cli/global_test.go                     |   7 -
 e2e/native/native_binding_test.go                  |  21 +-
 e2e/native/native_test.go                          |  22 +-
 e2e/native/native_test_support.go                  |   2 +-
 e2e/native/native_with_sources_test.go             |  35 +-
 e2e/support/test_support.go                        |  10 -
 helm/camel-k/crds/crd-build.yaml                   | 803 ++++++++++++++++++++-
 helm/camel-k/crds/crd-integration-kit.yaml         |  87 ++-
 helm/camel-k/crds/crd-integration-platform.yaml    | 170 +++--
 helm/camel-k/crds/crd-integration.yaml             |  79 +-
 helm/camel-k/crds/crd-kamelet-binding.yaml         |  74 +-
 helm/camel-k/crds/crd-pipe.yaml                    |  74 +-
 pkg/apis/camel/v1/build_types.go                   |  20 +-
 pkg/apis/camel/v1/build_types_support.go           |  33 +-
 pkg/apis/camel/v1/camelcatalog_types.go            |   2 +-
 pkg/apis/camel/v1/integrationkit_types.go          |   4 +-
 pkg/apis/camel/v1/integrationplatform_types.go     |   1 +
 .../camel/v1/integrationplatform_types_support.go  |   8 -
 pkg/apis/camel/v1/trait/builder.go                 |  14 +-
 pkg/apis/camel/v1/trait/quarkus.go                 |  33 +-
 pkg/apis/camel/v1/trait/zz_generated.deepcopy.go   |  25 +
 pkg/apis/camel/v1/zz_generated.deepcopy.go         |  22 +-
 pkg/builder/builder.go                             |  17 +-
 pkg/builder/image.go                               |   5 +-
 pkg/builder/runtime_support.go                     |  91 +++
 pkg/builder/spectrum.go                            |   2 +
 pkg/builder/tasks.go                               |  30 +
 .../camel/applyconfiguration/camel/v1/basetask.go  |  11 +-
 .../applyconfiguration/camel/v1/buildahtask.go     |   8 +
 .../applyconfiguration/camel/v1/buildertask.go     |  15 +-
 .../camel/applyconfiguration/camel/v1/jibtask.go   |   8 +
 .../applyconfiguration/camel/v1/kanikotask.go      |   8 +
 .../camel/applyconfiguration/camel/v1/s2itask.go   |   8 +
 .../applyconfiguration/camel/v1/spectrumtask.go    |   8 +
 .../camel/applyconfiguration/camel/v1/task.go      |  27 +-
 .../camel/applyconfiguration/camel/v1/usertask.go  |  23 +-
 pkg/controller/build/build_monitor.go              |   2 +-
 pkg/controller/build/build_monitor_test.go         |  16 +-
 pkg/controller/build/build_pod.go                  |  22 +-
 pkg/controller/build/monitor_routine.go            |  33 +-
 pkg/controller/catalog/initialize.go               | 529 +-------------
 pkg/controller/integrationkit/build.go             |   8 +-
 pkg/platform/defaults.go                           |  25 -
 pkg/resources/resources.go                         |  17 -
 pkg/trait/builder.go                               | 242 +++++--
 pkg/trait/builder_test.go                          | 151 +++-
 pkg/trait/camel_test.go                            |   2 +-
 pkg/trait/quarkus.go                               | 144 ++--
 pkg/trait/quarkus_test.go                          |   8 +-
 pkg/trait/trait_catalog.go                         |   6 +-
 pkg/trait/trait_test.go                            |   4 +-
 pkg/trait/util.go                                  |   9 +
 resources/traits.yaml                              |  61 +-
 71 files changed, 3397 insertions(+), 1240 deletions(-)
 create mode 100644 docs/modules/ROOT/camel_k_pipeline.png
 create mode 100644 pkg/builder/runtime_support.go


[camel-k] 06/09: feat(pipeline): configure requests and limits for all tasks

Posted by pc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 889c4938f5250ab9f8fbd41d416710c11f3bd9a2
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Tue Sep 26 15:31:02 2023 +0200

    feat(pipeline): configure requests and limits for all tasks
---
 config/crd/bases/camel.apache.org_builds.yaml      | 258 +++++++++++++++++++++
 .../bases/camel.apache.org_integrationkits.yaml    |  46 +++-
 .../camel.apache.org_integrationplatforms.yaml     |  92 ++++++--
 .../crd/bases/camel.apache.org_integrations.yaml   |  46 +++-
 .../bases/camel.apache.org_kameletbindings.yaml    |  46 +++-
 config/crd/bases/camel.apache.org_pipes.yaml       |  46 +++-
 docs/modules/ROOT/pages/pipeline/pipeline.adoc     |   2 +
 docs/modules/ROOT/partials/apis/camel-k-crds.adoc  |  52 ++++-
 docs/modules/traits/pages/builder.adoc             |  22 +-
 helm/camel-k/crds/crd-build.yaml                   | 258 +++++++++++++++++++++
 helm/camel-k/crds/crd-integration-kit.yaml         |  46 +++-
 helm/camel-k/crds/crd-integration-platform.yaml    |  92 ++++++--
 helm/camel-k/crds/crd-integration.yaml             |  46 +++-
 helm/camel-k/crds/crd-kamelet-binding.yaml         |  46 +++-
 helm/camel-k/crds/crd-pipe.yaml                    |  46 +++-
 pkg/apis/camel/v1/build_types.go                   |   4 +-
 pkg/apis/camel/v1/build_types_support.go           |  33 ++-
 pkg/apis/camel/v1/trait/builder.go                 |  14 +-
 pkg/apis/camel/v1/trait/zz_generated.deepcopy.go   |  20 ++
 pkg/apis/camel/v1/zz_generated.deepcopy.go         |   2 +-
 .../camel/applyconfiguration/camel/v1/basetask.go  |  11 +-
 .../applyconfiguration/camel/v1/buildahtask.go     |   8 +
 .../applyconfiguration/camel/v1/buildertask.go     |  15 +-
 .../camel/applyconfiguration/camel/v1/jibtask.go   |   8 +
 .../applyconfiguration/camel/v1/kanikotask.go      |   8 +
 .../camel/applyconfiguration/camel/v1/s2itask.go   |   8 +
 .../applyconfiguration/camel/v1/spectrumtask.go    |   8 +
 .../camel/applyconfiguration/camel/v1/usertask.go  |   8 +
 pkg/controller/build/build_monitor_test.go         |  12 +-
 pkg/controller/build/build_pod.go                  |   9 +-
 pkg/controller/integrationkit/build.go             |   2 +-
 pkg/resources/resources.go                         |  28 +--
 pkg/trait/builder.go                               | 149 ++++++++----
 pkg/trait/builder_test.go                          |  33 ++-
 resources/traits.yaml                              |  34 ++-
 35 files changed, 1343 insertions(+), 215 deletions(-)

diff --git a/config/crd/bases/camel.apache.org_builds.yaml b/config/crd/bases/camel.apache.org_builds.yaml
index 0ff027d69..08a6cc213 100644
--- a/config/crd/bases/camel.apache.org_builds.yaml
+++ b/config/crd/bases/camel.apache.org_builds.yaml
@@ -148,6 +148,49 @@ spec:
                         baseImage:
                           description: base image layer
                           type: string
+                        configuration:
+                          description: The configuration that should be used to perform
+                            the Build.
+                          properties:
+                            limitCPU:
+                              description: The maximum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            limitMemory:
+                              description: The maximum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            operatorNamespace:
+                              description: The namespace where to run the builder
+                                Pod (must be the same of the operator in charge of
+                                this Build reconciliation).
+                              type: string
+                            orderStrategy:
+                              description: the build order strategy to adopt
+                              enum:
+                              - dependencies
+                              - fifo
+                              - sequential
+                              type: string
+                            requestCPU:
+                              description: The minimum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            requestMemory:
+                              description: The minimum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            strategy:
+                              description: the strategy to adopt
+                              enum:
+                              - routine
+                              - pod
+                              type: string
+                            toolImage:
+                              description: The container image to be used to run the
+                                build.
+                              type: string
+                          type: object
                         contextDir:
                           description: can be useful to share info with other tasks
                           type: string
@@ -698,6 +741,49 @@ spec:
                           items:
                             type: string
                           type: array
+                        configuration:
+                          description: The configuration that should be used to perform
+                            the Build.
+                          properties:
+                            limitCPU:
+                              description: The maximum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            limitMemory:
+                              description: The maximum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            operatorNamespace:
+                              description: The namespace where to run the builder
+                                Pod (must be the same of the operator in charge of
+                                this Build reconciliation).
+                              type: string
+                            orderStrategy:
+                              description: the build order strategy to adopt
+                              enum:
+                              - dependencies
+                              - fifo
+                              - sequential
+                              type: string
+                            requestCPU:
+                              description: The minimum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            requestMemory:
+                              description: The minimum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            strategy:
+                              description: the strategy to adopt
+                              enum:
+                              - routine
+                              - pod
+                              type: string
+                            toolImage:
+                              description: The container image to be used to run the
+                                build.
+                              type: string
+                          type: object
                         image:
                           description: the container image to use
                           type: string
@@ -711,6 +797,49 @@ spec:
                         baseImage:
                           description: base image layer
                           type: string
+                        configuration:
+                          description: The configuration that should be used to perform
+                            the Build.
+                          properties:
+                            limitCPU:
+                              description: The maximum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            limitMemory:
+                              description: The maximum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            operatorNamespace:
+                              description: The namespace where to run the builder
+                                Pod (must be the same of the operator in charge of
+                                this Build reconciliation).
+                              type: string
+                            orderStrategy:
+                              description: the build order strategy to adopt
+                              enum:
+                              - dependencies
+                              - fifo
+                              - sequential
+                              type: string
+                            requestCPU:
+                              description: The minimum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            requestMemory:
+                              description: The minimum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            strategy:
+                              description: the strategy to adopt
+                              enum:
+                              - routine
+                              - pod
+                              type: string
+                            toolImage:
+                              description: The container image to be used to run the
+                                build.
+                              type: string
+                          type: object
                         contextDir:
                           description: can be useful to share info with other tasks
                           type: string
@@ -759,6 +888,49 @@ spec:
                               description: the PVC used to store the cache
                               type: string
                           type: object
+                        configuration:
+                          description: The configuration that should be used to perform
+                            the Build.
+                          properties:
+                            limitCPU:
+                              description: The maximum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            limitMemory:
+                              description: The maximum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            operatorNamespace:
+                              description: The namespace where to run the builder
+                                Pod (must be the same of the operator in charge of
+                                this Build reconciliation).
+                              type: string
+                            orderStrategy:
+                              description: the build order strategy to adopt
+                              enum:
+                              - dependencies
+                              - fifo
+                              - sequential
+                              type: string
+                            requestCPU:
+                              description: The minimum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            requestMemory:
+                              description: The minimum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            strategy:
+                              description: the strategy to adopt
+                              enum:
+                              - routine
+                              - pod
+                              type: string
+                            toolImage:
+                              description: The container image to be used to run the
+                                build.
+                              type: string
+                          type: object
                         contextDir:
                           description: can be useful to share info with other tasks
                           type: string
@@ -1298,6 +1470,49 @@ spec:
                     s2i:
                       description: a S2iTask, for S2I strategy
                       properties:
+                        configuration:
+                          description: The configuration that should be used to perform
+                            the Build.
+                          properties:
+                            limitCPU:
+                              description: The maximum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            limitMemory:
+                              description: The maximum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            operatorNamespace:
+                              description: The namespace where to run the builder
+                                Pod (must be the same of the operator in charge of
+                                this Build reconciliation).
+                              type: string
+                            orderStrategy:
+                              description: the build order strategy to adopt
+                              enum:
+                              - dependencies
+                              - fifo
+                              - sequential
+                              type: string
+                            requestCPU:
+                              description: The minimum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            requestMemory:
+                              description: The minimum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            strategy:
+                              description: the strategy to adopt
+                              enum:
+                              - routine
+                              - pod
+                              type: string
+                            toolImage:
+                              description: The container image to be used to run the
+                                build.
+                              type: string
+                          type: object
                         contextDir:
                           description: can be useful to share info with other tasks
                           type: string
@@ -1314,6 +1529,49 @@ spec:
                         baseImage:
                           description: base image layer
                           type: string
+                        configuration:
+                          description: The configuration that should be used to perform
+                            the Build.
+                          properties:
+                            limitCPU:
+                              description: The maximum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            limitMemory:
+                              description: The maximum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            operatorNamespace:
+                              description: The namespace where to run the builder
+                                Pod (must be the same of the operator in charge of
+                                this Build reconciliation).
+                              type: string
+                            orderStrategy:
+                              description: the build order strategy to adopt
+                              enum:
+                              - dependencies
+                              - fifo
+                              - sequential
+                              type: string
+                            requestCPU:
+                              description: The minimum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            requestMemory:
+                              description: The minimum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            strategy:
+                              description: the strategy to adopt
+                              enum:
+                              - routine
+                              - pod
+                              type: string
+                            toolImage:
+                              description: The container image to be used to run the
+                                build.
+                              type: string
+                          type: object
                         contextDir:
                           description: can be useful to share info with other tasks
                           type: string
diff --git a/config/crd/bases/camel.apache.org_integrationkits.yaml b/config/crd/bases/camel.apache.org_integrationkits.yaml
index ea68807a3..359ef577c 100644
--- a/config/crd/bases/camel.apache.org_integrationkits.yaml
+++ b/config/crd/bases/camel.apache.org_integrationkits.yaml
@@ -204,12 +204,14 @@ spec:
                           traits share this common property.
                         type: boolean
                       limitCPU:
-                        description: When using `pod` strategy, the maximum amount
-                          of CPU required by the pod builder.
+                        description: 'When using `pod` strategy, the maximum amount
+                          of CPU required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       limitMemory:
-                        description: When using `pod` strategy, the maximum amount
-                          of memory required by the pod builder.
+                        description: 'When using `pod` strategy, the maximum amount
+                          of memory required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       mavenProfiles:
                         description: 'A list of references pointing to configmaps/secrets
@@ -234,12 +236,14 @@ spec:
                           type: string
                         type: array
                       requestCPU:
-                        description: When using `pod` strategy, the minimum amount
-                          of CPU required by the pod builder.
+                        description: 'When using `pod` strategy, the minimum amount
+                          of CPU required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       requestMemory:
-                        description: When using `pod` strategy, the minimum amount
-                          of memory required by the pod builder.
+                        description: 'When using `pod` strategy, the minimum amount
+                          of memory required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       strategy:
                         description: The strategy to use, either `pod` or `routine`
@@ -247,7 +251,31 @@ spec:
                         type: string
                       tasks:
                         description: A list of tasks to be executed (available only
-                          when using `pod` strategy) with format <name>;<container-image>;<container-command>
+                          when using `pod` strategy) with format `<name>;<container-image>;<container-command>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksLimitCPU:
+                        description: A list of limit cpu configuration for the specific
+                          task with format `<task-name>:<limit-cpu-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksLimitMemory:
+                        description: A list of limit memory configuration for the
+                          specific task with format `<task-name>:<limit-memory-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksRequestCPU:
+                        description: A list of request cpu configuration for the specific
+                          task with format `<task-name>:<request-cpu-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksRequestMemory:
+                        description: A list of request memory configuration for the
+                          specific task with format `<task-name>:<request-memory-conf>`.
                         items:
                           type: string
                         type: array
diff --git a/config/crd/bases/camel.apache.org_integrationplatforms.yaml b/config/crd/bases/camel.apache.org_integrationplatforms.yaml
index a37e7c91d..5d3de2436 100644
--- a/config/crd/bases/camel.apache.org_integrationplatforms.yaml
+++ b/config/crd/bases/camel.apache.org_integrationplatforms.yaml
@@ -507,12 +507,14 @@ spec:
                           traits share this common property.
                         type: boolean
                       limitCPU:
-                        description: When using `pod` strategy, the maximum amount
-                          of CPU required by the pod builder.
+                        description: 'When using `pod` strategy, the maximum amount
+                          of CPU required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       limitMemory:
-                        description: When using `pod` strategy, the maximum amount
-                          of memory required by the pod builder.
+                        description: 'When using `pod` strategy, the maximum amount
+                          of memory required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       mavenProfiles:
                         description: 'A list of references pointing to configmaps/secrets
@@ -537,12 +539,14 @@ spec:
                           type: string
                         type: array
                       requestCPU:
-                        description: When using `pod` strategy, the minimum amount
-                          of CPU required by the pod builder.
+                        description: 'When using `pod` strategy, the minimum amount
+                          of CPU required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       requestMemory:
-                        description: When using `pod` strategy, the minimum amount
-                          of memory required by the pod builder.
+                        description: 'When using `pod` strategy, the minimum amount
+                          of memory required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       strategy:
                         description: The strategy to use, either `pod` or `routine`
@@ -550,7 +554,31 @@ spec:
                         type: string
                       tasks:
                         description: A list of tasks to be executed (available only
-                          when using `pod` strategy) with format <name>;<container-image>;<container-command>
+                          when using `pod` strategy) with format `<name>;<container-image>;<container-command>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksLimitCPU:
+                        description: A list of limit cpu configuration for the specific
+                          task with format `<task-name>:<limit-cpu-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksLimitMemory:
+                        description: A list of limit memory configuration for the
+                          specific task with format `<task-name>:<limit-memory-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksRequestCPU:
+                        description: A list of request cpu configuration for the specific
+                          task with format `<task-name>:<request-cpu-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksRequestMemory:
+                        description: A list of request memory configuration for the
+                          specific task with format `<task-name>:<request-memory-conf>`.
                         items:
                           type: string
                         type: array
@@ -2281,12 +2309,14 @@ spec:
                           traits share this common property.
                         type: boolean
                       limitCPU:
-                        description: When using `pod` strategy, the maximum amount
-                          of CPU required by the pod builder.
+                        description: 'When using `pod` strategy, the maximum amount
+                          of CPU required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       limitMemory:
-                        description: When using `pod` strategy, the maximum amount
-                          of memory required by the pod builder.
+                        description: 'When using `pod` strategy, the maximum amount
+                          of memory required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       mavenProfiles:
                         description: 'A list of references pointing to configmaps/secrets
@@ -2311,12 +2341,14 @@ spec:
                           type: string
                         type: array
                       requestCPU:
-                        description: When using `pod` strategy, the minimum amount
-                          of CPU required by the pod builder.
+                        description: 'When using `pod` strategy, the minimum amount
+                          of CPU required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       requestMemory:
-                        description: When using `pod` strategy, the minimum amount
-                          of memory required by the pod builder.
+                        description: 'When using `pod` strategy, the minimum amount
+                          of memory required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       strategy:
                         description: The strategy to use, either `pod` or `routine`
@@ -2324,7 +2356,31 @@ spec:
                         type: string
                       tasks:
                         description: A list of tasks to be executed (available only
-                          when using `pod` strategy) with format <name>;<container-image>;<container-command>
+                          when using `pod` strategy) with format `<name>;<container-image>;<container-command>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksLimitCPU:
+                        description: A list of limit cpu configuration for the specific
+                          task with format `<task-name>:<limit-cpu-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksLimitMemory:
+                        description: A list of limit memory configuration for the
+                          specific task with format `<task-name>:<limit-memory-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksRequestCPU:
+                        description: A list of request cpu configuration for the specific
+                          task with format `<task-name>:<request-cpu-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksRequestMemory:
+                        description: A list of request memory configuration for the
+                          specific task with format `<task-name>:<request-memory-conf>`.
                         items:
                           type: string
                         type: array
diff --git a/config/crd/bases/camel.apache.org_integrations.yaml b/config/crd/bases/camel.apache.org_integrations.yaml
index 042186be4..f7fefbc25 100644
--- a/config/crd/bases/camel.apache.org_integrations.yaml
+++ b/config/crd/bases/camel.apache.org_integrations.yaml
@@ -6424,12 +6424,14 @@ spec:
                           traits share this common property.
                         type: boolean
                       limitCPU:
-                        description: When using `pod` strategy, the maximum amount
-                          of CPU required by the pod builder.
+                        description: 'When using `pod` strategy, the maximum amount
+                          of CPU required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       limitMemory:
-                        description: When using `pod` strategy, the maximum amount
-                          of memory required by the pod builder.
+                        description: 'When using `pod` strategy, the maximum amount
+                          of memory required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       mavenProfiles:
                         description: 'A list of references pointing to configmaps/secrets
@@ -6454,12 +6456,14 @@ spec:
                           type: string
                         type: array
                       requestCPU:
-                        description: When using `pod` strategy, the minimum amount
-                          of CPU required by the pod builder.
+                        description: 'When using `pod` strategy, the minimum amount
+                          of CPU required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       requestMemory:
-                        description: When using `pod` strategy, the minimum amount
-                          of memory required by the pod builder.
+                        description: 'When using `pod` strategy, the minimum amount
+                          of memory required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       strategy:
                         description: The strategy to use, either `pod` or `routine`
@@ -6467,7 +6471,31 @@ spec:
                         type: string
                       tasks:
                         description: A list of tasks to be executed (available only
-                          when using `pod` strategy) with format <name>;<container-image>;<container-command>
+                          when using `pod` strategy) with format `<name>;<container-image>;<container-command>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksLimitCPU:
+                        description: A list of limit cpu configuration for the specific
+                          task with format `<task-name>:<limit-cpu-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksLimitMemory:
+                        description: A list of limit memory configuration for the
+                          specific task with format `<task-name>:<limit-memory-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksRequestCPU:
+                        description: A list of request cpu configuration for the specific
+                          task with format `<task-name>:<request-cpu-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksRequestMemory:
+                        description: A list of request memory configuration for the
+                          specific task with format `<task-name>:<request-memory-conf>`.
                         items:
                           type: string
                         type: array
diff --git a/config/crd/bases/camel.apache.org_kameletbindings.yaml b/config/crd/bases/camel.apache.org_kameletbindings.yaml
index 1181e466b..69d9aee3d 100644
--- a/config/crd/bases/camel.apache.org_kameletbindings.yaml
+++ b/config/crd/bases/camel.apache.org_kameletbindings.yaml
@@ -6706,12 +6706,14 @@ spec:
                               All traits share this common property.
                             type: boolean
                           limitCPU:
-                            description: When using `pod` strategy, the maximum amount
-                              of CPU required by the pod builder.
+                            description: 'When using `pod` strategy, the maximum amount
+                              of CPU required by the pod builder. Deprecated: use
+                              TasksRequestCPU instead with task name `builder`.'
                             type: string
                           limitMemory:
-                            description: When using `pod` strategy, the maximum amount
-                              of memory required by the pod builder.
+                            description: 'When using `pod` strategy, the maximum amount
+                              of memory required by the pod builder. Deprecated: use
+                              TasksRequestCPU instead with task name `builder`.'
                             type: string
                           mavenProfiles:
                             description: 'A list of references pointing to configmaps/secrets
@@ -6737,12 +6739,14 @@ spec:
                               type: string
                             type: array
                           requestCPU:
-                            description: When using `pod` strategy, the minimum amount
-                              of CPU required by the pod builder.
+                            description: 'When using `pod` strategy, the minimum amount
+                              of CPU required by the pod builder. Deprecated: use
+                              TasksRequestCPU instead with task name `builder`.'
                             type: string
                           requestMemory:
-                            description: When using `pod` strategy, the minimum amount
-                              of memory required by the pod builder.
+                            description: 'When using `pod` strategy, the minimum amount
+                              of memory required by the pod builder. Deprecated: use
+                              TasksRequestCPU instead with task name `builder`.'
                             type: string
                           strategy:
                             description: The strategy to use, either `pod` or `routine`
@@ -6750,7 +6754,31 @@ spec:
                             type: string
                           tasks:
                             description: A list of tasks to be executed (available
-                              only when using `pod` strategy) with format <name>;<container-image>;<container-command>
+                              only when using `pod` strategy) with format `<name>;<container-image>;<container-command>`.
+                            items:
+                              type: string
+                            type: array
+                          tasksLimitCPU:
+                            description: A list of limit cpu configuration for the
+                              specific task with format `<task-name>:<limit-cpu-conf>`.
+                            items:
+                              type: string
+                            type: array
+                          tasksLimitMemory:
+                            description: A list of limit memory configuration for
+                              the specific task with format `<task-name>:<limit-memory-conf>`.
+                            items:
+                              type: string
+                            type: array
+                          tasksRequestCPU:
+                            description: A list of request cpu configuration for the
+                              specific task with format `<task-name>:<request-cpu-conf>`.
+                            items:
+                              type: string
+                            type: array
+                          tasksRequestMemory:
+                            description: A list of request memory configuration for
+                              the specific task with format `<task-name>:<request-memory-conf>`.
                             items:
                               type: string
                             type: array
diff --git a/config/crd/bases/camel.apache.org_pipes.yaml b/config/crd/bases/camel.apache.org_pipes.yaml
index d6b5e1269..23a287c66 100644
--- a/config/crd/bases/camel.apache.org_pipes.yaml
+++ b/config/crd/bases/camel.apache.org_pipes.yaml
@@ -6703,12 +6703,14 @@ spec:
                               All traits share this common property.
                             type: boolean
                           limitCPU:
-                            description: When using `pod` strategy, the maximum amount
-                              of CPU required by the pod builder.
+                            description: 'When using `pod` strategy, the maximum amount
+                              of CPU required by the pod builder. Deprecated: use
+                              TasksRequestCPU instead with task name `builder`.'
                             type: string
                           limitMemory:
-                            description: When using `pod` strategy, the maximum amount
-                              of memory required by the pod builder.
+                            description: 'When using `pod` strategy, the maximum amount
+                              of memory required by the pod builder. Deprecated: use
+                              TasksRequestCPU instead with task name `builder`.'
                             type: string
                           mavenProfiles:
                             description: 'A list of references pointing to configmaps/secrets
@@ -6734,12 +6736,14 @@ spec:
                               type: string
                             type: array
                           requestCPU:
-                            description: When using `pod` strategy, the minimum amount
-                              of CPU required by the pod builder.
+                            description: 'When using `pod` strategy, the minimum amount
+                              of CPU required by the pod builder. Deprecated: use
+                              TasksRequestCPU instead with task name `builder`.'
                             type: string
                           requestMemory:
-                            description: When using `pod` strategy, the minimum amount
-                              of memory required by the pod builder.
+                            description: 'When using `pod` strategy, the minimum amount
+                              of memory required by the pod builder. Deprecated: use
+                              TasksRequestCPU instead with task name `builder`.'
                             type: string
                           strategy:
                             description: The strategy to use, either `pod` or `routine`
@@ -6747,7 +6751,31 @@ spec:
                             type: string
                           tasks:
                             description: A list of tasks to be executed (available
-                              only when using `pod` strategy) with format <name>;<container-image>;<container-command>
+                              only when using `pod` strategy) with format `<name>;<container-image>;<container-command>`.
+                            items:
+                              type: string
+                            type: array
+                          tasksLimitCPU:
+                            description: A list of limit cpu configuration for the
+                              specific task with format `<task-name>:<limit-cpu-conf>`.
+                            items:
+                              type: string
+                            type: array
+                          tasksLimitMemory:
+                            description: A list of limit memory configuration for
+                              the specific task with format `<task-name>:<limit-memory-conf>`.
+                            items:
+                              type: string
+                            type: array
+                          tasksRequestCPU:
+                            description: A list of request cpu configuration for the
+                              specific task with format `<task-name>:<request-cpu-conf>`.
+                            items:
+                              type: string
+                            type: array
+                          tasksRequestMemory:
+                            description: A list of request memory configuration for
+                              the specific task with format `<task-name>:<request-memory-conf>`.
                             items:
                               type: string
                             type: array
diff --git a/docs/modules/ROOT/pages/pipeline/pipeline.adoc b/docs/modules/ROOT/pages/pipeline/pipeline.adoc
index 5e593dfb8..85bbdf3a8 100644
--- a/docs/modules/ROOT/pages/pipeline/pipeline.adoc
+++ b/docs/modules/ROOT/pages/pipeline/pipeline.adoc
@@ -50,6 +50,8 @@ Maintaining the example above as a reference, configuring a custom task will be
 kamel run Test.java -t builder.tasks=custom1;alpine;tree -t builder.tasks="custom2;alpine;cat maven/pom.xml"
 ```
 
+Another interesting configuration you can provide via Builder trait is the (https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/)[Kubernetes requests and limits]. Each of the task you are providing in the pipeline, can be configured with the proper resource settings. You can use, for instance the `-t builder.request-cpu <task-name>:1000m` to configure the container executed by the `task-name`. This configuration works for all the tasks including `builder`, `pack [...]
+
 [[build-pipeline-result]]
 == Getting task execution status
 
diff --git a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
index 3afd80dd3..6fa1d8f2c 100644
--- a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
+++ b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
@@ -429,6 +429,13 @@ string
 
 name of the task
 
+|`configuration` +
+*xref:#_camel_apache_org_v1_BuildConfiguration[BuildConfiguration]*
+|
+
+
+The configuration that should be used to perform the Build.
+
 
 |===
 
@@ -526,8 +533,8 @@ BuildConditionType -- .
 
 *Appears on:*
 
+* <<#_camel_apache_org_v1_BaseTask, BaseTask>>
 * <<#_camel_apache_org_v1_BuildSpec, BuildSpec>>
-* <<#_camel_apache_org_v1_BuilderTask, BuilderTask>>
 * <<#_camel_apache_org_v1_IntegrationPlatformBuildSpec, IntegrationPlatformBuildSpec>>
 
 BuildConfiguration represent the configuration required to build the runtime.
@@ -864,13 +871,6 @@ BuilderTask is the generic task in charge of building the application image.
 
 
 
-|`configuration` +
-*xref:#_camel_apache_org_v1_BuildConfiguration[BuildConfiguration]*
-|
-
-
-The configuration that should be used to perform the Build.
-
 |`baseImage` +
 string
 |
@@ -1169,7 +1169,7 @@ loaders required by this catalog
 
 * <<#_camel_apache_org_v1_CamelCatalog, CamelCatalog>>
 
-CamelCatalogStatus defines the observed state of CamelCatalog. As the catalog is a static resource, we expect it to be empty.
+CamelCatalogStatus defines the observed state of CamelCatalog.
 
 [cols="2,2a",options="header"]
 |===
@@ -5800,6 +5800,7 @@ string
 
 
 When using `pod` strategy, the minimum amount of CPU required by the pod builder.
+Deprecated: use TasksRequestCPU instead with task name `builder`.
 
 |`requestMemory` +
 string
@@ -5807,6 +5808,7 @@ string
 
 
 When using `pod` strategy, the minimum amount of memory required by the pod builder.
+Deprecated: use TasksRequestCPU instead with task name `builder`.
 
 |`limitCPU` +
 string
@@ -5814,6 +5816,7 @@ string
 
 
 When using `pod` strategy, the maximum amount of CPU required by the pod builder.
+Deprecated: use TasksRequestCPU instead with task name `builder`.
 
 |`limitMemory` +
 string
@@ -5821,6 +5824,7 @@ string
 
 
 When using `pod` strategy, the maximum amount of memory required by the pod builder.
+Deprecated: use TasksRequestCPU instead with task name `builder`.
 
 |`mavenProfiles` +
 []string
@@ -5836,7 +5840,35 @@ Syntax: [configmap{vbar}secret]:name[/key], where name represents the resource n
 |
 
 
-A list of tasks to be executed (available only when using `pod` strategy) with format <name>;<container-image>;<container-command>
+A list of tasks to be executed (available only when using `pod` strategy) with format `<name>;<container-image>;<container-command>`.
+
+|`tasksRequestCPU` +
+[]string
+|
+
+
+A list of request cpu configuration for the specific task with format `<task-name>:<request-cpu-conf>`.
+
+|`tasksRequestMemory` +
+[]string
+|
+
+
+A list of request memory configuration for the specific task with format `<task-name>:<request-memory-conf>`.
+
+|`tasksLimitCPU` +
+[]string
+|
+
+
+A list of limit cpu configuration for the specific task with format `<task-name>:<limit-cpu-conf>`.
+
+|`tasksLimitMemory` +
+[]string
+|
+
+
+A list of limit memory configuration for the specific task with format `<task-name>:<limit-memory-conf>`.
 
 
 |===
diff --git a/docs/modules/traits/pages/builder.adoc b/docs/modules/traits/pages/builder.adoc
index 891bd196d..e990024ab 100755
--- a/docs/modules/traits/pages/builder.adoc
+++ b/docs/modules/traits/pages/builder.adoc
@@ -47,18 +47,22 @@ The following configuration options are available:
 | builder.request-cpu
 | string
 | When using `pod` strategy, the minimum amount of CPU required by the pod builder.
+Deprecated: use TasksRequestCPU instead with task name `builder`.
 
 | builder.request-memory
 | string
 | When using `pod` strategy, the minimum amount of memory required by the pod builder.
+Deprecated: use TasksRequestCPU instead with task name `builder`.
 
 | builder.limit-cpu
 | string
 | When using `pod` strategy, the maximum amount of CPU required by the pod builder.
+Deprecated: use TasksRequestCPU instead with task name `builder`.
 
 | builder.limit-memory
 | string
 | When using `pod` strategy, the maximum amount of memory required by the pod builder.
+Deprecated: use TasksRequestCPU instead with task name `builder`.
 
 | builder.maven-profiles
 | []string
@@ -68,7 +72,23 @@ Syntax: [configmap\|secret]:name[/key], where name represents the resource name,
 
 | builder.tasks
 | []string
-| A list of tasks to be executed (available only when using `pod` strategy) with format <name>;<container-image>;<container-command>
+| A list of tasks to be executed (available only when using `pod` strategy) with format `<name>;<container-image>;<container-command>`.
+
+| builder.tasks-request-cpu
+| []string
+| A list of request cpu configuration for the specific task with format `<task-name>:<request-cpu-conf>`.
+
+| builder.tasks-request-memory
+| []string
+| A list of request memory configuration for the specific task with format `<task-name>:<request-memory-conf>`.
+
+| builder.tasks-limit-cpu
+| []string
+| A list of limit cpu configuration for the specific task with format `<task-name>:<limit-cpu-conf>`.
+
+| builder.tasks-limit-memory
+| []string
+| A list of limit memory configuration for the specific task with format `<task-name>:<limit-memory-conf>`.
 
 |===
 
diff --git a/helm/camel-k/crds/crd-build.yaml b/helm/camel-k/crds/crd-build.yaml
index 0ff027d69..08a6cc213 100644
--- a/helm/camel-k/crds/crd-build.yaml
+++ b/helm/camel-k/crds/crd-build.yaml
@@ -148,6 +148,49 @@ spec:
                         baseImage:
                           description: base image layer
                           type: string
+                        configuration:
+                          description: The configuration that should be used to perform
+                            the Build.
+                          properties:
+                            limitCPU:
+                              description: The maximum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            limitMemory:
+                              description: The maximum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            operatorNamespace:
+                              description: The namespace where to run the builder
+                                Pod (must be the same of the operator in charge of
+                                this Build reconciliation).
+                              type: string
+                            orderStrategy:
+                              description: the build order strategy to adopt
+                              enum:
+                              - dependencies
+                              - fifo
+                              - sequential
+                              type: string
+                            requestCPU:
+                              description: The minimum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            requestMemory:
+                              description: The minimum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            strategy:
+                              description: the strategy to adopt
+                              enum:
+                              - routine
+                              - pod
+                              type: string
+                            toolImage:
+                              description: The container image to be used to run the
+                                build.
+                              type: string
+                          type: object
                         contextDir:
                           description: can be useful to share info with other tasks
                           type: string
@@ -698,6 +741,49 @@ spec:
                           items:
                             type: string
                           type: array
+                        configuration:
+                          description: The configuration that should be used to perform
+                            the Build.
+                          properties:
+                            limitCPU:
+                              description: The maximum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            limitMemory:
+                              description: The maximum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            operatorNamespace:
+                              description: The namespace where to run the builder
+                                Pod (must be the same of the operator in charge of
+                                this Build reconciliation).
+                              type: string
+                            orderStrategy:
+                              description: the build order strategy to adopt
+                              enum:
+                              - dependencies
+                              - fifo
+                              - sequential
+                              type: string
+                            requestCPU:
+                              description: The minimum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            requestMemory:
+                              description: The minimum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            strategy:
+                              description: the strategy to adopt
+                              enum:
+                              - routine
+                              - pod
+                              type: string
+                            toolImage:
+                              description: The container image to be used to run the
+                                build.
+                              type: string
+                          type: object
                         image:
                           description: the container image to use
                           type: string
@@ -711,6 +797,49 @@ spec:
                         baseImage:
                           description: base image layer
                           type: string
+                        configuration:
+                          description: The configuration that should be used to perform
+                            the Build.
+                          properties:
+                            limitCPU:
+                              description: The maximum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            limitMemory:
+                              description: The maximum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            operatorNamespace:
+                              description: The namespace where to run the builder
+                                Pod (must be the same of the operator in charge of
+                                this Build reconciliation).
+                              type: string
+                            orderStrategy:
+                              description: the build order strategy to adopt
+                              enum:
+                              - dependencies
+                              - fifo
+                              - sequential
+                              type: string
+                            requestCPU:
+                              description: The minimum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            requestMemory:
+                              description: The minimum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            strategy:
+                              description: the strategy to adopt
+                              enum:
+                              - routine
+                              - pod
+                              type: string
+                            toolImage:
+                              description: The container image to be used to run the
+                                build.
+                              type: string
+                          type: object
                         contextDir:
                           description: can be useful to share info with other tasks
                           type: string
@@ -759,6 +888,49 @@ spec:
                               description: the PVC used to store the cache
                               type: string
                           type: object
+                        configuration:
+                          description: The configuration that should be used to perform
+                            the Build.
+                          properties:
+                            limitCPU:
+                              description: The maximum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            limitMemory:
+                              description: The maximum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            operatorNamespace:
+                              description: The namespace where to run the builder
+                                Pod (must be the same of the operator in charge of
+                                this Build reconciliation).
+                              type: string
+                            orderStrategy:
+                              description: the build order strategy to adopt
+                              enum:
+                              - dependencies
+                              - fifo
+                              - sequential
+                              type: string
+                            requestCPU:
+                              description: The minimum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            requestMemory:
+                              description: The minimum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            strategy:
+                              description: the strategy to adopt
+                              enum:
+                              - routine
+                              - pod
+                              type: string
+                            toolImage:
+                              description: The container image to be used to run the
+                                build.
+                              type: string
+                          type: object
                         contextDir:
                           description: can be useful to share info with other tasks
                           type: string
@@ -1298,6 +1470,49 @@ spec:
                     s2i:
                       description: a S2iTask, for S2I strategy
                       properties:
+                        configuration:
+                          description: The configuration that should be used to perform
+                            the Build.
+                          properties:
+                            limitCPU:
+                              description: The maximum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            limitMemory:
+                              description: The maximum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            operatorNamespace:
+                              description: The namespace where to run the builder
+                                Pod (must be the same of the operator in charge of
+                                this Build reconciliation).
+                              type: string
+                            orderStrategy:
+                              description: the build order strategy to adopt
+                              enum:
+                              - dependencies
+                              - fifo
+                              - sequential
+                              type: string
+                            requestCPU:
+                              description: The minimum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            requestMemory:
+                              description: The minimum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            strategy:
+                              description: the strategy to adopt
+                              enum:
+                              - routine
+                              - pod
+                              type: string
+                            toolImage:
+                              description: The container image to be used to run the
+                                build.
+                              type: string
+                          type: object
                         contextDir:
                           description: can be useful to share info with other tasks
                           type: string
@@ -1314,6 +1529,49 @@ spec:
                         baseImage:
                           description: base image layer
                           type: string
+                        configuration:
+                          description: The configuration that should be used to perform
+                            the Build.
+                          properties:
+                            limitCPU:
+                              description: The maximum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            limitMemory:
+                              description: The maximum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            operatorNamespace:
+                              description: The namespace where to run the builder
+                                Pod (must be the same of the operator in charge of
+                                this Build reconciliation).
+                              type: string
+                            orderStrategy:
+                              description: the build order strategy to adopt
+                              enum:
+                              - dependencies
+                              - fifo
+                              - sequential
+                              type: string
+                            requestCPU:
+                              description: The minimum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            requestMemory:
+                              description: The minimum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            strategy:
+                              description: the strategy to adopt
+                              enum:
+                              - routine
+                              - pod
+                              type: string
+                            toolImage:
+                              description: The container image to be used to run the
+                                build.
+                              type: string
+                          type: object
                         contextDir:
                           description: can be useful to share info with other tasks
                           type: string
diff --git a/helm/camel-k/crds/crd-integration-kit.yaml b/helm/camel-k/crds/crd-integration-kit.yaml
index ea68807a3..359ef577c 100644
--- a/helm/camel-k/crds/crd-integration-kit.yaml
+++ b/helm/camel-k/crds/crd-integration-kit.yaml
@@ -204,12 +204,14 @@ spec:
                           traits share this common property.
                         type: boolean
                       limitCPU:
-                        description: When using `pod` strategy, the maximum amount
-                          of CPU required by the pod builder.
+                        description: 'When using `pod` strategy, the maximum amount
+                          of CPU required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       limitMemory:
-                        description: When using `pod` strategy, the maximum amount
-                          of memory required by the pod builder.
+                        description: 'When using `pod` strategy, the maximum amount
+                          of memory required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       mavenProfiles:
                         description: 'A list of references pointing to configmaps/secrets
@@ -234,12 +236,14 @@ spec:
                           type: string
                         type: array
                       requestCPU:
-                        description: When using `pod` strategy, the minimum amount
-                          of CPU required by the pod builder.
+                        description: 'When using `pod` strategy, the minimum amount
+                          of CPU required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       requestMemory:
-                        description: When using `pod` strategy, the minimum amount
-                          of memory required by the pod builder.
+                        description: 'When using `pod` strategy, the minimum amount
+                          of memory required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       strategy:
                         description: The strategy to use, either `pod` or `routine`
@@ -247,7 +251,31 @@ spec:
                         type: string
                       tasks:
                         description: A list of tasks to be executed (available only
-                          when using `pod` strategy) with format <name>;<container-image>;<container-command>
+                          when using `pod` strategy) with format `<name>;<container-image>;<container-command>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksLimitCPU:
+                        description: A list of limit cpu configuration for the specific
+                          task with format `<task-name>:<limit-cpu-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksLimitMemory:
+                        description: A list of limit memory configuration for the
+                          specific task with format `<task-name>:<limit-memory-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksRequestCPU:
+                        description: A list of request cpu configuration for the specific
+                          task with format `<task-name>:<request-cpu-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksRequestMemory:
+                        description: A list of request memory configuration for the
+                          specific task with format `<task-name>:<request-memory-conf>`.
                         items:
                           type: string
                         type: array
diff --git a/helm/camel-k/crds/crd-integration-platform.yaml b/helm/camel-k/crds/crd-integration-platform.yaml
index a37e7c91d..5d3de2436 100644
--- a/helm/camel-k/crds/crd-integration-platform.yaml
+++ b/helm/camel-k/crds/crd-integration-platform.yaml
@@ -507,12 +507,14 @@ spec:
                           traits share this common property.
                         type: boolean
                       limitCPU:
-                        description: When using `pod` strategy, the maximum amount
-                          of CPU required by the pod builder.
+                        description: 'When using `pod` strategy, the maximum amount
+                          of CPU required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       limitMemory:
-                        description: When using `pod` strategy, the maximum amount
-                          of memory required by the pod builder.
+                        description: 'When using `pod` strategy, the maximum amount
+                          of memory required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       mavenProfiles:
                         description: 'A list of references pointing to configmaps/secrets
@@ -537,12 +539,14 @@ spec:
                           type: string
                         type: array
                       requestCPU:
-                        description: When using `pod` strategy, the minimum amount
-                          of CPU required by the pod builder.
+                        description: 'When using `pod` strategy, the minimum amount
+                          of CPU required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       requestMemory:
-                        description: When using `pod` strategy, the minimum amount
-                          of memory required by the pod builder.
+                        description: 'When using `pod` strategy, the minimum amount
+                          of memory required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       strategy:
                         description: The strategy to use, either `pod` or `routine`
@@ -550,7 +554,31 @@ spec:
                         type: string
                       tasks:
                         description: A list of tasks to be executed (available only
-                          when using `pod` strategy) with format <name>;<container-image>;<container-command>
+                          when using `pod` strategy) with format `<name>;<container-image>;<container-command>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksLimitCPU:
+                        description: A list of limit cpu configuration for the specific
+                          task with format `<task-name>:<limit-cpu-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksLimitMemory:
+                        description: A list of limit memory configuration for the
+                          specific task with format `<task-name>:<limit-memory-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksRequestCPU:
+                        description: A list of request cpu configuration for the specific
+                          task with format `<task-name>:<request-cpu-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksRequestMemory:
+                        description: A list of request memory configuration for the
+                          specific task with format `<task-name>:<request-memory-conf>`.
                         items:
                           type: string
                         type: array
@@ -2281,12 +2309,14 @@ spec:
                           traits share this common property.
                         type: boolean
                       limitCPU:
-                        description: When using `pod` strategy, the maximum amount
-                          of CPU required by the pod builder.
+                        description: 'When using `pod` strategy, the maximum amount
+                          of CPU required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       limitMemory:
-                        description: When using `pod` strategy, the maximum amount
-                          of memory required by the pod builder.
+                        description: 'When using `pod` strategy, the maximum amount
+                          of memory required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       mavenProfiles:
                         description: 'A list of references pointing to configmaps/secrets
@@ -2311,12 +2341,14 @@ spec:
                           type: string
                         type: array
                       requestCPU:
-                        description: When using `pod` strategy, the minimum amount
-                          of CPU required by the pod builder.
+                        description: 'When using `pod` strategy, the minimum amount
+                          of CPU required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       requestMemory:
-                        description: When using `pod` strategy, the minimum amount
-                          of memory required by the pod builder.
+                        description: 'When using `pod` strategy, the minimum amount
+                          of memory required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       strategy:
                         description: The strategy to use, either `pod` or `routine`
@@ -2324,7 +2356,31 @@ spec:
                         type: string
                       tasks:
                         description: A list of tasks to be executed (available only
-                          when using `pod` strategy) with format <name>;<container-image>;<container-command>
+                          when using `pod` strategy) with format `<name>;<container-image>;<container-command>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksLimitCPU:
+                        description: A list of limit cpu configuration for the specific
+                          task with format `<task-name>:<limit-cpu-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksLimitMemory:
+                        description: A list of limit memory configuration for the
+                          specific task with format `<task-name>:<limit-memory-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksRequestCPU:
+                        description: A list of request cpu configuration for the specific
+                          task with format `<task-name>:<request-cpu-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksRequestMemory:
+                        description: A list of request memory configuration for the
+                          specific task with format `<task-name>:<request-memory-conf>`.
                         items:
                           type: string
                         type: array
diff --git a/helm/camel-k/crds/crd-integration.yaml b/helm/camel-k/crds/crd-integration.yaml
index 042186be4..f7fefbc25 100644
--- a/helm/camel-k/crds/crd-integration.yaml
+++ b/helm/camel-k/crds/crd-integration.yaml
@@ -6424,12 +6424,14 @@ spec:
                           traits share this common property.
                         type: boolean
                       limitCPU:
-                        description: When using `pod` strategy, the maximum amount
-                          of CPU required by the pod builder.
+                        description: 'When using `pod` strategy, the maximum amount
+                          of CPU required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       limitMemory:
-                        description: When using `pod` strategy, the maximum amount
-                          of memory required by the pod builder.
+                        description: 'When using `pod` strategy, the maximum amount
+                          of memory required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       mavenProfiles:
                         description: 'A list of references pointing to configmaps/secrets
@@ -6454,12 +6456,14 @@ spec:
                           type: string
                         type: array
                       requestCPU:
-                        description: When using `pod` strategy, the minimum amount
-                          of CPU required by the pod builder.
+                        description: 'When using `pod` strategy, the minimum amount
+                          of CPU required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       requestMemory:
-                        description: When using `pod` strategy, the minimum amount
-                          of memory required by the pod builder.
+                        description: 'When using `pod` strategy, the minimum amount
+                          of memory required by the pod builder. Deprecated: use TasksRequestCPU
+                          instead with task name `builder`.'
                         type: string
                       strategy:
                         description: The strategy to use, either `pod` or `routine`
@@ -6467,7 +6471,31 @@ spec:
                         type: string
                       tasks:
                         description: A list of tasks to be executed (available only
-                          when using `pod` strategy) with format <name>;<container-image>;<container-command>
+                          when using `pod` strategy) with format `<name>;<container-image>;<container-command>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksLimitCPU:
+                        description: A list of limit cpu configuration for the specific
+                          task with format `<task-name>:<limit-cpu-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksLimitMemory:
+                        description: A list of limit memory configuration for the
+                          specific task with format `<task-name>:<limit-memory-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksRequestCPU:
+                        description: A list of request cpu configuration for the specific
+                          task with format `<task-name>:<request-cpu-conf>`.
+                        items:
+                          type: string
+                        type: array
+                      tasksRequestMemory:
+                        description: A list of request memory configuration for the
+                          specific task with format `<task-name>:<request-memory-conf>`.
                         items:
                           type: string
                         type: array
diff --git a/helm/camel-k/crds/crd-kamelet-binding.yaml b/helm/camel-k/crds/crd-kamelet-binding.yaml
index 1181e466b..69d9aee3d 100644
--- a/helm/camel-k/crds/crd-kamelet-binding.yaml
+++ b/helm/camel-k/crds/crd-kamelet-binding.yaml
@@ -6706,12 +6706,14 @@ spec:
                               All traits share this common property.
                             type: boolean
                           limitCPU:
-                            description: When using `pod` strategy, the maximum amount
-                              of CPU required by the pod builder.
+                            description: 'When using `pod` strategy, the maximum amount
+                              of CPU required by the pod builder. Deprecated: use
+                              TasksRequestCPU instead with task name `builder`.'
                             type: string
                           limitMemory:
-                            description: When using `pod` strategy, the maximum amount
-                              of memory required by the pod builder.
+                            description: 'When using `pod` strategy, the maximum amount
+                              of memory required by the pod builder. Deprecated: use
+                              TasksRequestCPU instead with task name `builder`.'
                             type: string
                           mavenProfiles:
                             description: 'A list of references pointing to configmaps/secrets
@@ -6737,12 +6739,14 @@ spec:
                               type: string
                             type: array
                           requestCPU:
-                            description: When using `pod` strategy, the minimum amount
-                              of CPU required by the pod builder.
+                            description: 'When using `pod` strategy, the minimum amount
+                              of CPU required by the pod builder. Deprecated: use
+                              TasksRequestCPU instead with task name `builder`.'
                             type: string
                           requestMemory:
-                            description: When using `pod` strategy, the minimum amount
-                              of memory required by the pod builder.
+                            description: 'When using `pod` strategy, the minimum amount
+                              of memory required by the pod builder. Deprecated: use
+                              TasksRequestCPU instead with task name `builder`.'
                             type: string
                           strategy:
                             description: The strategy to use, either `pod` or `routine`
@@ -6750,7 +6754,31 @@ spec:
                             type: string
                           tasks:
                             description: A list of tasks to be executed (available
-                              only when using `pod` strategy) with format <name>;<container-image>;<container-command>
+                              only when using `pod` strategy) with format `<name>;<container-image>;<container-command>`.
+                            items:
+                              type: string
+                            type: array
+                          tasksLimitCPU:
+                            description: A list of limit cpu configuration for the
+                              specific task with format `<task-name>:<limit-cpu-conf>`.
+                            items:
+                              type: string
+                            type: array
+                          tasksLimitMemory:
+                            description: A list of limit memory configuration for
+                              the specific task with format `<task-name>:<limit-memory-conf>`.
+                            items:
+                              type: string
+                            type: array
+                          tasksRequestCPU:
+                            description: A list of request cpu configuration for the
+                              specific task with format `<task-name>:<request-cpu-conf>`.
+                            items:
+                              type: string
+                            type: array
+                          tasksRequestMemory:
+                            description: A list of request memory configuration for
+                              the specific task with format `<task-name>:<request-memory-conf>`.
                             items:
                               type: string
                             type: array
diff --git a/helm/camel-k/crds/crd-pipe.yaml b/helm/camel-k/crds/crd-pipe.yaml
index d6b5e1269..23a287c66 100644
--- a/helm/camel-k/crds/crd-pipe.yaml
+++ b/helm/camel-k/crds/crd-pipe.yaml
@@ -6703,12 +6703,14 @@ spec:
                               All traits share this common property.
                             type: boolean
                           limitCPU:
-                            description: When using `pod` strategy, the maximum amount
-                              of CPU required by the pod builder.
+                            description: 'When using `pod` strategy, the maximum amount
+                              of CPU required by the pod builder. Deprecated: use
+                              TasksRequestCPU instead with task name `builder`.'
                             type: string
                           limitMemory:
-                            description: When using `pod` strategy, the maximum amount
-                              of memory required by the pod builder.
+                            description: 'When using `pod` strategy, the maximum amount
+                              of memory required by the pod builder. Deprecated: use
+                              TasksRequestCPU instead with task name `builder`.'
                             type: string
                           mavenProfiles:
                             description: 'A list of references pointing to configmaps/secrets
@@ -6734,12 +6736,14 @@ spec:
                               type: string
                             type: array
                           requestCPU:
-                            description: When using `pod` strategy, the minimum amount
-                              of CPU required by the pod builder.
+                            description: 'When using `pod` strategy, the minimum amount
+                              of CPU required by the pod builder. Deprecated: use
+                              TasksRequestCPU instead with task name `builder`.'
                             type: string
                           requestMemory:
-                            description: When using `pod` strategy, the minimum amount
-                              of memory required by the pod builder.
+                            description: 'When using `pod` strategy, the minimum amount
+                              of memory required by the pod builder. Deprecated: use
+                              TasksRequestCPU instead with task name `builder`.'
                             type: string
                           strategy:
                             description: The strategy to use, either `pod` or `routine`
@@ -6747,7 +6751,31 @@ spec:
                             type: string
                           tasks:
                             description: A list of tasks to be executed (available
-                              only when using `pod` strategy) with format <name>;<container-image>;<container-command>
+                              only when using `pod` strategy) with format `<name>;<container-image>;<container-command>`.
+                            items:
+                              type: string
+                            type: array
+                          tasksLimitCPU:
+                            description: A list of limit cpu configuration for the
+                              specific task with format `<task-name>:<limit-cpu-conf>`.
+                            items:
+                              type: string
+                            type: array
+                          tasksLimitMemory:
+                            description: A list of limit memory configuration for
+                              the specific task with format `<task-name>:<limit-memory-conf>`.
+                            items:
+                              type: string
+                            type: array
+                          tasksRequestCPU:
+                            description: A list of request cpu configuration for the
+                              specific task with format `<task-name>:<request-cpu-conf>`.
+                            items:
+                              type: string
+                            type: array
+                          tasksRequestMemory:
+                            description: A list of request memory configuration for
+                              the specific task with format `<task-name>:<request-memory-conf>`.
                             items:
                               type: string
                             type: array
diff --git a/pkg/apis/camel/v1/build_types.go b/pkg/apis/camel/v1/build_types.go
index 581ec47dd..c78a1d732 100644
--- a/pkg/apis/camel/v1/build_types.go
+++ b/pkg/apis/camel/v1/build_types.go
@@ -84,13 +84,13 @@ type Task struct {
 type BaseTask struct {
 	// name of the task
 	Name string `json:"name,omitempty"`
+	// The configuration that should be used to perform the Build.
+	Configuration BuildConfiguration `json:"configuration,omitempty"`
 }
 
 // BuilderTask is the generic task in charge of building the application image.
 type BuilderTask struct {
 	BaseTask `json:",inline"`
-	// The configuration that should be used to perform the Build.
-	Configuration BuildConfiguration `json:"configuration,omitempty"`
 	// the base image layer
 	BaseImage string `json:"baseImage,omitempty"`
 	// the configuration required for the runtime application
diff --git a/pkg/apis/camel/v1/build_types_support.go b/pkg/apis/camel/v1/build_types_support.go
index 396997fa1..a9777b65f 100644
--- a/pkg/apis/camel/v1/build_types_support.go
+++ b/pkg/apis/camel/v1/build_types_support.go
@@ -56,8 +56,12 @@ func (build *Build) BuilderPodNamespace() string {
 
 // BuilderConfiguration returns the builder configuration for this Build.
 func (build *Build) BuilderConfiguration() *BuildConfiguration {
-	return BuilderConfigurationTasks(build.Spec.Tasks)
+	return build.TaskConfiguration("builder")
+}
 
+// TaskConfiguration returns the task configuration of this Build.
+func (build *Build) TaskConfiguration(name string) *BuildConfiguration {
+	return ConfigurationTasksByName(build.Spec.Tasks, name)
 }
 
 // BuilderDependencies returns the list of dependencies configured on by the builder task for this Build.
@@ -79,12 +83,33 @@ func FindBuilderTask(tasks []Task) (*BuilderTask, bool) {
 	return nil, false
 }
 
-// BuilderConfigurationTasks returns the builder configuration from the task list.
-func BuilderConfigurationTasks(tasks []Task) *BuildConfiguration {
+// ConfigurationTasksByName returns the container configuration from the task list.
+func ConfigurationTasksByName(tasks []Task, name string) *BuildConfiguration {
 	for _, t := range tasks {
-		if t.Builder != nil {
+		if t.Builder != nil && t.Builder.Name == name {
 			return &t.Builder.Configuration
 		}
+		if t.Custom != nil && t.Custom.Name == name {
+			return &t.Custom.Configuration
+		}
+		if t.Package != nil && t.Package.Name == name {
+			return &t.Package.Configuration
+		}
+		if t.Spectrum != nil && t.Spectrum.Name == name {
+			return &t.Spectrum.Configuration
+		}
+		if t.S2i != nil && t.S2i.Name == name {
+			return &t.S2i.Configuration
+		}
+		if t.Jib != nil && t.Jib.Name == name {
+			return &t.Jib.Configuration
+		}
+		if t.Buildah != nil && t.Buildah.Name == name {
+			return &t.Buildah.Configuration
+		}
+		if t.Kaniko != nil && t.Kaniko.Name == name {
+			return &t.Kaniko.Configuration
+		}
 	}
 	return &BuildConfiguration{}
 }
diff --git a/pkg/apis/camel/v1/trait/builder.go b/pkg/apis/camel/v1/trait/builder.go
index 166975c3b..38d4b0729 100644
--- a/pkg/apis/camel/v1/trait/builder.go
+++ b/pkg/apis/camel/v1/trait/builder.go
@@ -32,17 +32,29 @@ type BuilderTrait struct {
 	// The build order strategy to use, either `dependencies`, `fifo` or `sequential` (default sequential)
 	OrderStrategy string `property:"order-strategy" json:"orderStrategy,omitempty"`
 	// When using `pod` strategy, the minimum amount of CPU required by the pod builder.
+	// Deprecated: use TasksRequestCPU instead with task name `builder`.
 	RequestCPU string `property:"request-cpu" json:"requestCPU,omitempty"`
 	// When using `pod` strategy, the minimum amount of memory required by the pod builder.
+	// Deprecated: use TasksRequestCPU instead with task name `builder`.
 	RequestMemory string `property:"request-memory" json:"requestMemory,omitempty"`
 	// When using `pod` strategy, the maximum amount of CPU required by the pod builder.
+	// Deprecated: use TasksRequestCPU instead with task name `builder`.
 	LimitCPU string `property:"limit-cpu" json:"limitCPU,omitempty"`
 	// When using `pod` strategy, the maximum amount of memory required by the pod builder.
+	// Deprecated: use TasksRequestCPU instead with task name `builder`.
 	LimitMemory string `property:"limit-memory" json:"limitMemory,omitempty"`
 	// A list of references pointing to configmaps/secrets that contains a maven profile.
 	// The content of the maven profile is expected to be a text containing a valid maven profile starting with `<profile>` and ending with `</profile>` that will be integrated as an inline profile in the POM.
 	// Syntax: [configmap|secret]:name[/key], where name represents the resource name, key optionally represents the resource key to be filtered (default key value = profile.xml).
 	MavenProfiles []string `property:"maven-profiles" json:"mavenProfiles,omitempty"`
-	// A list of tasks to be executed (available only when using `pod` strategy) with format <name>;<container-image>;<container-command>
+	// A list of tasks to be executed (available only when using `pod` strategy) with format `<name>;<container-image>;<container-command>`.
 	Tasks []string `property:"tasks" json:"tasks,omitempty"`
+	// A list of request cpu configuration for the specific task with format `<task-name>:<request-cpu-conf>`.
+	TasksRequestCPU []string `property:"tasks-request-cpu" json:"tasksRequestCPU,omitempty"`
+	// A list of request memory configuration for the specific task with format `<task-name>:<request-memory-conf>`.
+	TasksRequestMemory []string `property:"tasks-request-memory" json:"tasksRequestMemory,omitempty"`
+	// A list of limit cpu configuration for the specific task with format `<task-name>:<limit-cpu-conf>`.
+	TasksLimitCPU []string `property:"tasks-limit-cpu" json:"tasksLimitCPU,omitempty"`
+	// A list of limit memory configuration for the specific task with format `<task-name>:<limit-memory-conf>`.
+	TasksLimitMemory []string `property:"tasks-limit-memory" json:"tasksLimitMemory,omitempty"`
 }
diff --git a/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go b/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go
index 505fbfd0a..471156af8 100644
--- a/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go
+++ b/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go
@@ -74,6 +74,26 @@ func (in *BuilderTrait) DeepCopyInto(out *BuilderTrait) {
 		*out = make([]string, len(*in))
 		copy(*out, *in)
 	}
+	if in.TasksRequestCPU != nil {
+		in, out := &in.TasksRequestCPU, &out.TasksRequestCPU
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.TasksRequestMemory != nil {
+		in, out := &in.TasksRequestMemory, &out.TasksRequestMemory
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.TasksLimitCPU != nil {
+		in, out := &in.TasksLimitCPU, &out.TasksLimitCPU
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.TasksLimitMemory != nil {
+		in, out := &in.TasksLimitMemory, &out.TasksLimitMemory
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BuilderTrait.
diff --git a/pkg/apis/camel/v1/zz_generated.deepcopy.go b/pkg/apis/camel/v1/zz_generated.deepcopy.go
index b77a301d9..34a3fb6c8 100644
--- a/pkg/apis/camel/v1/zz_generated.deepcopy.go
+++ b/pkg/apis/camel/v1/zz_generated.deepcopy.go
@@ -66,6 +66,7 @@ func (in *Artifact) DeepCopy() *Artifact {
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *BaseTask) DeepCopyInto(out *BaseTask) {
 	*out = *in
+	out.Configuration = in.Configuration
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BaseTask.
@@ -275,7 +276,6 @@ func (in *BuildahTask) DeepCopy() *BuildahTask {
 func (in *BuilderTask) DeepCopyInto(out *BuilderTask) {
 	*out = *in
 	out.BaseTask = in.BaseTask
-	out.Configuration = in.Configuration
 	in.Runtime.DeepCopyInto(&out.Runtime)
 	if in.Dependencies != nil {
 		in, out := &in.Dependencies, &out.Dependencies
diff --git a/pkg/client/camel/applyconfiguration/camel/v1/basetask.go b/pkg/client/camel/applyconfiguration/camel/v1/basetask.go
index 72bc6c228..575fb3cc3 100644
--- a/pkg/client/camel/applyconfiguration/camel/v1/basetask.go
+++ b/pkg/client/camel/applyconfiguration/camel/v1/basetask.go
@@ -22,7 +22,8 @@ package v1
 // BaseTaskApplyConfiguration represents an declarative configuration of the BaseTask type for use
 // with apply.
 type BaseTaskApplyConfiguration struct {
-	Name *string `json:"name,omitempty"`
+	Name          *string                               `json:"name,omitempty"`
+	Configuration *BuildConfigurationApplyConfiguration `json:"configuration,omitempty"`
 }
 
 // BaseTaskApplyConfiguration constructs an declarative configuration of the BaseTask type for use with
@@ -38,3 +39,11 @@ func (b *BaseTaskApplyConfiguration) WithName(value string) *BaseTaskApplyConfig
 	b.Name = &value
 	return b
 }
+
+// WithConfiguration sets the Configuration 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 Configuration field is set to the value of the last call.
+func (b *BaseTaskApplyConfiguration) WithConfiguration(value *BuildConfigurationApplyConfiguration) *BaseTaskApplyConfiguration {
+	b.Configuration = value
+	return b
+}
diff --git a/pkg/client/camel/applyconfiguration/camel/v1/buildahtask.go b/pkg/client/camel/applyconfiguration/camel/v1/buildahtask.go
index 3c34e512b..eb5c5b10e 100644
--- a/pkg/client/camel/applyconfiguration/camel/v1/buildahtask.go
+++ b/pkg/client/camel/applyconfiguration/camel/v1/buildahtask.go
@@ -43,6 +43,14 @@ func (b *BuildahTaskApplyConfiguration) WithName(value string) *BuildahTaskApply
 	return b
 }
 
+// WithConfiguration sets the Configuration 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 Configuration field is set to the value of the last call.
+func (b *BuildahTaskApplyConfiguration) WithConfiguration(value *BuildConfigurationApplyConfiguration) *BuildahTaskApplyConfiguration {
+	b.Configuration = value
+	return b
+}
+
 // WithContextDir sets the ContextDir 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 ContextDir field is set to the value of the last call.
diff --git a/pkg/client/camel/applyconfiguration/camel/v1/buildertask.go b/pkg/client/camel/applyconfiguration/camel/v1/buildertask.go
index 8198337eb..e7a0dc9af 100644
--- a/pkg/client/camel/applyconfiguration/camel/v1/buildertask.go
+++ b/pkg/client/camel/applyconfiguration/camel/v1/buildertask.go
@@ -23,14 +23,13 @@ package v1
 // with apply.
 type BuilderTaskApplyConfiguration struct {
 	BaseTaskApplyConfiguration `json:",inline"`
-	Configuration              *BuildConfigurationApplyConfiguration `json:"configuration,omitempty"`
-	BaseImage                  *string                               `json:"baseImage,omitempty"`
-	Runtime                    *RuntimeSpecApplyConfiguration        `json:"runtime,omitempty"`
-	Dependencies               []string                              `json:"dependencies,omitempty"`
-	Steps                      []string                              `json:"steps,omitempty"`
-	Maven                      *MavenBuildSpecApplyConfiguration     `json:"maven,omitempty"`
-	BuildDir                   *string                               `json:"buildDir,omitempty"`
-	Sources                    []SourceSpecApplyConfiguration        `json:"sources,omitempty"`
+	BaseImage                  *string                           `json:"baseImage,omitempty"`
+	Runtime                    *RuntimeSpecApplyConfiguration    `json:"runtime,omitempty"`
+	Dependencies               []string                          `json:"dependencies,omitempty"`
+	Steps                      []string                          `json:"steps,omitempty"`
+	Maven                      *MavenBuildSpecApplyConfiguration `json:"maven,omitempty"`
+	BuildDir                   *string                           `json:"buildDir,omitempty"`
+	Sources                    []SourceSpecApplyConfiguration    `json:"sources,omitempty"`
 }
 
 // BuilderTaskApplyConfiguration constructs an declarative configuration of the BuilderTask type for use with
diff --git a/pkg/client/camel/applyconfiguration/camel/v1/jibtask.go b/pkg/client/camel/applyconfiguration/camel/v1/jibtask.go
index 1e87d4281..c9d98ecfc 100644
--- a/pkg/client/camel/applyconfiguration/camel/v1/jibtask.go
+++ b/pkg/client/camel/applyconfiguration/camel/v1/jibtask.go
@@ -40,6 +40,14 @@ func (b *JibTaskApplyConfiguration) WithName(value string) *JibTaskApplyConfigur
 	return b
 }
 
+// WithConfiguration sets the Configuration 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 Configuration field is set to the value of the last call.
+func (b *JibTaskApplyConfiguration) WithConfiguration(value *BuildConfigurationApplyConfiguration) *JibTaskApplyConfiguration {
+	b.Configuration = value
+	return b
+}
+
 // WithContextDir sets the ContextDir 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 ContextDir field is set to the value of the last call.
diff --git a/pkg/client/camel/applyconfiguration/camel/v1/kanikotask.go b/pkg/client/camel/applyconfiguration/camel/v1/kanikotask.go
index 1b0a1e12c..67aeea0c3 100644
--- a/pkg/client/camel/applyconfiguration/camel/v1/kanikotask.go
+++ b/pkg/client/camel/applyconfiguration/camel/v1/kanikotask.go
@@ -43,6 +43,14 @@ func (b *KanikoTaskApplyConfiguration) WithName(value string) *KanikoTaskApplyCo
 	return b
 }
 
+// WithConfiguration sets the Configuration 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 Configuration field is set to the value of the last call.
+func (b *KanikoTaskApplyConfiguration) WithConfiguration(value *BuildConfigurationApplyConfiguration) *KanikoTaskApplyConfiguration {
+	b.Configuration = value
+	return b
+}
+
 // WithContextDir sets the ContextDir 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 ContextDir field is set to the value of the last call.
diff --git a/pkg/client/camel/applyconfiguration/camel/v1/s2itask.go b/pkg/client/camel/applyconfiguration/camel/v1/s2itask.go
index 232e2355e..da1a36d56 100644
--- a/pkg/client/camel/applyconfiguration/camel/v1/s2itask.go
+++ b/pkg/client/camel/applyconfiguration/camel/v1/s2itask.go
@@ -41,6 +41,14 @@ func (b *S2iTaskApplyConfiguration) WithName(value string) *S2iTaskApplyConfigur
 	return b
 }
 
+// WithConfiguration sets the Configuration 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 Configuration field is set to the value of the last call.
+func (b *S2iTaskApplyConfiguration) WithConfiguration(value *BuildConfigurationApplyConfiguration) *S2iTaskApplyConfiguration {
+	b.Configuration = value
+	return b
+}
+
 // WithContextDir sets the ContextDir 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 ContextDir field is set to the value of the last call.
diff --git a/pkg/client/camel/applyconfiguration/camel/v1/spectrumtask.go b/pkg/client/camel/applyconfiguration/camel/v1/spectrumtask.go
index c70d4d629..6ba50a2ae 100644
--- a/pkg/client/camel/applyconfiguration/camel/v1/spectrumtask.go
+++ b/pkg/client/camel/applyconfiguration/camel/v1/spectrumtask.go
@@ -40,6 +40,14 @@ func (b *SpectrumTaskApplyConfiguration) WithName(value string) *SpectrumTaskApp
 	return b
 }
 
+// WithConfiguration sets the Configuration 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 Configuration field is set to the value of the last call.
+func (b *SpectrumTaskApplyConfiguration) WithConfiguration(value *BuildConfigurationApplyConfiguration) *SpectrumTaskApplyConfiguration {
+	b.Configuration = value
+	return b
+}
+
 // WithContextDir sets the ContextDir 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 ContextDir field is set to the value of the last call.
diff --git a/pkg/client/camel/applyconfiguration/camel/v1/usertask.go b/pkg/client/camel/applyconfiguration/camel/v1/usertask.go
index 65b7c5c2a..f4fc11c89 100644
--- a/pkg/client/camel/applyconfiguration/camel/v1/usertask.go
+++ b/pkg/client/camel/applyconfiguration/camel/v1/usertask.go
@@ -42,6 +42,14 @@ func (b *UserTaskApplyConfiguration) WithName(value string) *UserTaskApplyConfig
 	return b
 }
 
+// WithConfiguration sets the Configuration 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 Configuration field is set to the value of the last call.
+func (b *UserTaskApplyConfiguration) WithConfiguration(value *BuildConfigurationApplyConfiguration) *UserTaskApplyConfiguration {
+	b.Configuration = value
+	return b
+}
+
 // WithContainerImage sets the ContainerImage 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 ContainerImage field is set to the value of the last call.
diff --git a/pkg/controller/build/build_monitor_test.go b/pkg/controller/build/build_monitor_test.go
index 1cde7301e..7a0dbec57 100644
--- a/pkg/controller/build/build_monitor_test.go
+++ b/pkg/controller/build/build_monitor_test.go
@@ -606,11 +606,13 @@ func newBuildWithLayoutInPhase(namespace string, name string, layout string, pha
 			Tasks: []v1.Task{
 				{
 					Builder: &v1.BuilderTask{
-						Configuration: v1.BuildConfiguration{
-							Strategy:            v1.BuildStrategyRoutine,
-							OrderStrategy:       v1.BuildOrderStrategySequential,
-							ToolImage:           "camel:latest",
-							BuilderPodNamespace: "ns",
+						BaseTask: v1.BaseTask{
+							Configuration: v1.BuildConfiguration{
+								Strategy:            v1.BuildStrategyRoutine,
+								OrderStrategy:       v1.BuildOrderStrategySequential,
+								ToolImage:           "camel:latest",
+								BuilderPodNamespace: "ns",
+							},
 						},
 						Dependencies: dependencies,
 					},
diff --git a/pkg/controller/build/build_pod.go b/pkg/controller/build/build_pod.go
index 27ccd0f68..1051b974b 100644
--- a/pkg/controller/build/build_pod.go
+++ b/pkg/controller/build/build_pod.go
@@ -191,8 +191,8 @@ func newBuildPod(ctx context.Context, c ctrl.Reader, client client.Client, build
 	return pod, nil
 }
 
-func configureResources(build *v1.Build, container *corev1.Container) {
-	conf := *build.BuilderConfiguration()
+func configureResources(taskName string, build *v1.Build, container *corev1.Container) {
+	conf := build.TaskConfiguration(taskName)
 	requestsList := container.Resources.Requests
 	limitsList := container.Resources.Limits
 	var err error
@@ -312,7 +312,7 @@ func addBuildTaskToPod(ctx context.Context, client client.Client, build *v1.Buil
 		}
 	}
 
-	configureResources(build, &container)
+	configureResources(taskName, build, &container)
 	addContainerToPod(build, container, pod)
 }
 
@@ -427,6 +427,7 @@ func addBuildahTaskToPod(ctx context.Context, c ctrl.Reader, build *v1.Build, ta
 
 	pod.Spec.Volumes = append(pod.Spec.Volumes, volumes...)
 
+	configureResources(task.Name, build, &container)
 	addContainerToPod(build, container, pod)
 
 	return nil
@@ -555,6 +556,7 @@ func addKanikoTaskToPod(ctx context.Context, c ctrl.Reader, build *v1.Build, tas
 		FSGroup:    &ugfid,
 	}
 
+	configureResources(task.Name, build, &container)
 	addContainerToPod(build, container, pod)
 
 	return nil
@@ -570,6 +572,7 @@ func addCustomTaskToPod(build *v1.Build, task *v1.UserTask, pod *corev1.Pod) {
 		Env:             proxyFromEnvironment(),
 	}
 
+	configureResources(task.Name, build, &container)
 	addContainerToPod(build, container, pod)
 }
 
diff --git a/pkg/controller/integrationkit/build.go b/pkg/controller/integrationkit/build.go
index faa32c72d..a60ccc6c7 100644
--- a/pkg/controller/integrationkit/build.go
+++ b/pkg/controller/integrationkit/build.go
@@ -109,7 +109,7 @@ func (action *buildAction) handleBuildSubmitted(ctx context.Context, kit *v1.Int
 
 		// We may need to change certain builder configuration values
 		operatorNamespace := platform.GetOperatorNamespace()
-		buildConfig := v1.BuilderConfigurationTasks(env.Pipeline)
+		buildConfig := v1.ConfigurationTasksByName(env.Pipeline, "builder")
 		if buildConfig.IsEmpty() {
 			// default to IntegrationPlatform configuration
 			buildConfig = &env.Platform.Status.Build.BuildConfiguration
diff --git a/pkg/resources/resources.go b/pkg/resources/resources.go
index fb3c4547b..23f91a87f 100644
--- a/pkg/resources/resources.go
+++ b/pkg/resources/resources.go
@@ -117,9 +117,9 @@ var assets = func() http.FileSystem {
 		"/crd/bases/camel.apache.org_builds.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_builds.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 78450,
+			uncompressedSize: 91926,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6d\x73\x1b\x37\x92\xf0\x77\xfd\x8a\xae\xf8\x43\xe4\x2a\x91\x4a\x9c\xec\x5e\x4e\x4f\x5d\x3d\xa5\x95\x93\x3d\xad\x1d\xdb\x67\x2a\xde\xdd\xba\xba\x2a\x81\x33\x4d\x12\xe1\x0c\x30\x07\x60\x24\x33\x4f\x3d\xff\xfd\x0a\x6f\xf3\x42\xce\x0b\x40\x91\xb6\xaf\x4c\x7c\x49\x2c\x62\x80\x6e\xa0\xd1\x6f\x68\x74\x3f\x83\xc9\xe1\xda\xd9\x33\x78\x4d\x13\x64\x12\x53\x50\x1c\xd4\x0a\xe1\xba\x20\xc9\x0a\x61\xc6\x17\xea\x91\x08\x84\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\x1b\x37\x96\xe8\x77\xfd\x8a\x53\xf1\x07\xcb\x55\x22\x35\xe3\xc9\xce\x66\x75\x6b\xeb\x96\x56\x4e\x66\x35\x4e\x6c\xaf\x29\x7b\x32\xb5\xb5\x55\x02\xbb\x0f\x49\x84\xdd\x40\x5f\x00\x2d\x9a\xb9\x75\xff\xfb\x2d\xbc\xfa\x21\xb2\xbb\x01\x8a\xf4\xa3\xd2\xf8\x92\x58\x44\x03\xe7\xe0\x71\xde\x38\xe7\x19\x4c\x8e\xd7\xce\x9e\xc1\xcf\x34\x41\x26\x31\x05\xc5\x41\xad\x10\xae\x0b\x92\xac\x10\x66\x7c\xa1\x36\x44\x20\xfc\x [...]
 		},
 		"/crd/bases/camel.apache.org_camelcatalogs.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_camelcatalogs.yaml",
@@ -131,30 +131,30 @@ var assets = func() http.FileSystem {
 		"/crd/bases/camel.apache.org_integrationkits.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_integrationkits.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 21757,
+			uncompressedSize: 23390,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3c\xdb\x72\xdb\x38\x96\xef\xfa\x8a\x53\xf1\x43\xec\x2a\x89\x9e\xde\xed\xea\xda\xf2\xf4\x74\x95\xc7\x9d\xf4\xb8\xe2\x24\xde\xc8\xe9\xde\xae\xe9\xa9\x12\x44\x1e\x49\x68\x91\x00\x1b\x00\x25\x6b\x2f\xff\xbe\x85\x03\x80\x17\x89\xa4\x68\x39\xde\xd9\x87\xf0\x25\x31\x09\x1c\x9c\xfb\x0d\x80\xce\x60\xf2\xe5\x9e\xd1\x19\xdc\xf1\x18\x85\xc6\x04\x8c\x04\xb3\x42\xb8\xce\x59\xbc\x42\x98\xca\x85\xd9\x32\x85\xf0\x56\x16\x22\x61\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3c\x5d\x73\xdb\x38\x92\xef\xfa\x15\x5d\xf1\x43\xec\x2a\x49\xde\xb9\x9b\x9a\xba\xf2\xce\x4e\x95\xd7\x49\x66\x5d\x71\x12\x9f\xa5\xcc\xdc\xd4\xce\x56\x09\x22\x5b\x12\x46\x24\xc0\x05\x40\xc9\xba\x8f\xff\x7e\x85\x06\xc0\x0f\x89\xa4\x68\x39\xde\x9b\xbd\x8a\x5e\x12\x93\x40\xa3\xd1\xdf\xdd\x40\xf3\x0c\x46\x5f\xee\x37\x38\x83\x3b\x1e\xa1\xd0\x18\x83\x91\x60\x56\x08\xd7\x19\x8b\x56\x08\x13\xb9\x30\x5b\xa6\x10\xde\xc9\x5c\x [...]
 		},
 		"/crd/bases/camel.apache.org_integrationplatforms.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_integrationplatforms.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 192534,
+			uncompressedSize: 195800,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7d\x73\xdb\x36\xb6\x38\xfc\x7f\x3f\x05\xc6\x9d\x3b\x71\x32\x96\x94\xec\xde\xee\xf6\xfa\xde\xde\xe7\xe7\x3a\x69\xeb\x26\x8e\x7d\x6d\x27\xbb\x3b\x6d\xa7\x82\xc8\x23\x09\x35\x09\x70\x01\x50\xb6\x3a\xfb\xe1\x9f\xc1\x01\x40\x52\x12\x09\x52\x2f\xb6\xb3\x8d\x98\x99\xd6\x92\x48\xf0\x1c\xe0\xe0\xbc\xe1\xbc\x7c\x49\x7a\xbb\xbb\xbe\xf8\x92\xbc\x63\x11\x70\x05\x31\xd1\x82\xe8\x29\x90\x93\x8c\x46\x53\x20\xd7\x62\xac\xef\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\xfb\x72\xe3\x36\xb2\x38\xfc\x7f\x9e\x02\xe5\xd4\xa9\xf1\x4c\x59\xd2\xcc\xee\xc9\x6e\x8e\xcf\x66\xbf\x9f\xe3\x99\x24\xce\x5c\xec\x63\x7b\x66\x77\x2b\x49\x45\x10\xd9\x92\x10\x93\x00\x17\x00\x65\x2b\xb5\x0f\xff\x15\x1a\x00\x49\x49\x24\x48\x5d\x7c\x49\x22\x4e\x55\x62\x49\x24\xd8\x68\x34\xfa\x86\xbe\x7c\x4e\x7a\xbb\xbb\x3e\xfb\x9c\xbc\x63\x11\x70\x05\x31\xd1\x82\xe8\x29\x90\x93\x8c\x46\x53\x20\x57\x62\xac\x6f\xa9\x [...]
 		},
 		"/crd/bases/camel.apache.org_integrations.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_integrations.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 514712,
+			uncompressedSize: 516345,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\x1b\x37\x96\x30\x8c\xff\x9f\x4f\x81\x72\x52\x8f\xa4\x8d\x48\xd9\x99\xd9\xa9\x1d\xff\xa6\x9e\x94\x56\x92\x13\xfd\x62\xcb\x2a\x49\x49\x9e\x94\x93\x4d\xc0\x6e\x90\xc4\xa3\x6e\xa0\x17\x40\x53\xe2\xbc\x79\xbf\xfb\x5b\x38\x00\xfa\xc2\x5b\x1f\xb4\x44\xc7\x99\x6d\x4c\x55\xc6\x14\xd9\xa7\x71\x39\x38\xf7\xcb\xe7\x64\xf4\x7c\xe3\xb3\xcf\xc9\x5b\x9e\x30\xa1\x59\x4a\x8c\x24\x66\xce\xc8\x69\x41\x93\x39\x23\xb7\x72\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\x1b\x37\x96\x30\x8c\xff\x9f\x4f\x81\x72\x52\x8f\xa4\x8d\x48\xd9\x99\xd9\xa9\x1d\xff\xa6\x9e\x94\x56\x92\x13\xfd\x62\xcb\x2a\x49\x49\x9e\x94\x93\x4d\xc0\x6e\x90\xc4\xa3\x6e\xa0\x17\x40\x53\xe2\xbc\x79\xbf\xfb\x5b\x38\x00\xfa\xc2\x5b\x1f\xb4\x44\xc7\x99\x6d\x4c\x55\xc6\x14\xd9\xa7\x71\x39\x38\xf7\xcb\xe7\x64\xf4\x7c\xe3\xb3\xcf\xc9\x5b\x9e\x30\xa1\x59\x4a\x8c\x24\x66\xce\xc8\x69\x41\x93\x39\x23\xb7\x72\x [...]
 		},
 		"/crd/bases/camel.apache.org_kameletbindings.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_kameletbindings.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 595998,
+			uncompressedSize: 597743,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x6b\x73\x1b\x37\xb6\x30\x0a\x7f\xf7\xaf\x40\xc9\xa9\x47\xd2\x8e\x48\xd9\x99\x99\xd4\x8c\xdf\xa9\x9d\xd2\xc8\x72\xa2\x37\xb6\xcc\xb2\x94\xe4\x49\x39\xd9\x09\xd8\x0d\x92\xd8\xea\x06\x7a\x00\x34\x25\xe6\xf8\xfc\xf7\x53\x58\x00\xfa\xc2\x9b\xb0\x9a\x92\x46\x9e\x69\x4c\x55\xc6\xa4\xd8\xab\x71\x59\x58\xf7\xcb\x73\x32\xb8\xbf\xf1\xec\x39\x79\xcb\x13\x26\x34\x4b\x89\x91\xc4\xcc\x18\x39\x29\x68\x32\x63\xe4\x52\x4e\xcc\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x6b\x73\x1b\x37\xb6\x30\x0a\x7f\xf7\xaf\x40\xc9\xa9\x47\xd2\x8e\x48\xd9\x99\x99\xd4\x8c\xdf\xa9\x9d\xd2\xc8\x72\xa2\x37\xb6\xcc\xb2\x94\xe4\x49\x39\xd9\x09\xd8\x0d\x92\xd8\xea\x06\x7a\x00\x34\x25\xe6\xf8\xfc\xf7\x53\x58\x00\xfa\xc2\x9b\xb0\x9a\x92\x46\x9e\x69\x4c\x55\xc6\xa4\xd8\xab\x71\x59\x58\xf7\xcb\x73\x32\xb8\xbf\xf1\xec\x39\x79\xcb\x13\x26\x34\x4b\x89\x91\xc4\xcc\x18\x39\x29\x68\x32\x63\xe4\x52\x4e\xcc\x [...]
 		},
 		"/crd/bases/camel.apache.org_kamelets.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_kamelets.yaml",
@@ -166,9 +166,9 @@ var assets = func() http.FileSystem {
 		"/crd/bases/camel.apache.org_pipes.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_pipes.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 563260,
+			uncompressedSize: 565005,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\x1b\x37\xb6\x28\x8a\xff\x9f\x4f\x81\xb2\x53\x47\xd2\x0e\x49\xd9\x99\x99\xd4\x1e\xff\xa6\x4e\x4a\x5b\x96\x13\xfd\x62\xcb\x2c\x4b\x49\x4e\xca\xc9\x4e\xc0\x6e\x90\xc4\x51\x37\xd0\x1b\x40\x53\x62\xae\xef\x77\xbf\x85\x05\xa0\x1f\x7c\x09\xab\x29\x69\xe4\x99\xc6\x54\x65\x4c\x8a\xbd\x1a\x8f\x85\xf5\x7e\x3c\x27\xc3\xfb\x1b\x5f\x3c\x27\x6f\x79\xc2\x84\x66\x29\x31\x92\x98\x39\x23\x27\x05\x4d\xe6\x8c\x5c\xca\xa9\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\x1b\x37\xb6\x28\x8a\xff\x9f\x4f\x81\xb2\x53\x47\xd2\x0e\x49\xd9\x99\x99\xd4\x1e\xff\xa6\x4e\x4a\x5b\x96\x13\xfd\x62\xcb\x2c\x4b\x49\x4e\xca\xc9\x4e\xc0\x6e\x90\xc4\x51\x37\xd0\x1b\x40\x53\x62\xae\xef\x77\xbf\x85\x05\xa0\x1f\x7c\x09\xab\x29\x69\xe4\x99\xc6\x54\x65\x4c\x8a\xbd\x1a\x8f\x85\xf5\x7e\x3c\x27\xc3\xfb\x1b\x5f\x3c\x27\x6f\x79\xc2\x84\x66\x29\x31\x92\x98\x39\x23\x27\x05\x4d\xe6\x8c\x5c\xca\xa9\x [...]
 		},
 		"/manager": &vfsgen۰DirInfo{
 			name:    "manager",
@@ -637,9 +637,9 @@ var assets = func() http.FileSystem {
 		"/traits.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "traits.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 68535,
+			uncompressedSize: 69520,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xfd\x77\x1b\xb9\x91\xe0\xef\xfe\x2b\xf0\xb4\xb7\x4f\x92\x8f\x1f\xf2\x64\x93\x9d\xd5\xc6\xd9\xd3\x78\x3c\x89\x32\xfe\xd0\x59\x9a\xc9\xe6\xf9\xfc\x42\xb0\x1b\x24\x61\x36\x81\x0e\x80\x96\xcc\xb9\xdc\xff\x7e\x0f\x55\x85\x8f\x6e\x36\x45\xca\x96\x66\xa3\xcd\x24\xef\x8d\x45\xb2\xbb\x50\x28\x14\x0a\x85\xfa\x74\x86\x4b\x67\x4f\x9f\x0c\x99\xe2\x2b\x71\xca\x7e\x65\x0b\x5e\x89\x27\x8c\xd5\x15\x77\x33\x6d\x56\xa7\x6c\xc6\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xfd\x77\x1b\xb9\x91\xe0\xef\xfe\x2b\xf0\xb4\xb7\x4f\x92\x8f\x1f\xf2\x64\x93\x9d\xd5\xc6\xd9\xd3\x78\x3c\x89\x32\xfe\xd0\x59\x9a\xc9\xe6\xf9\xfc\x42\xb0\x1b\x24\x61\x36\x81\x0e\x80\x96\xcc\xb9\xdc\xff\x7e\x0f\x55\x85\x8f\x6e\x36\x45\xca\x96\x66\xa3\xcd\x24\xef\x8d\x45\xb2\xbb\x50\x28\x14\x0a\x85\xfa\x74\x86\x4b\x67\x4f\x9f\x0c\x99\xe2\x2b\x71\xca\x7e\x65\x0b\x5e\x89\x27\x8c\xd5\x15\x77\x33\x6d\x56\xa7\x6c\xc6\x [...]
 		},
 	}
 	fs["/"].(*vfsgen۰DirInfo).entries = []os.FileInfo{
diff --git a/pkg/trait/builder.go b/pkg/trait/builder.go
index 44c6763b6..e11bd7339 100644
--- a/pkg/trait/builder.go
+++ b/pkg/trait/builder.go
@@ -77,6 +77,13 @@ func (t *builderTrait) Configure(e *Environment) (bool, error) {
 				return false, err
 			}
 			if ok && pointer.BoolDeref(quarkus.Enabled, true) && (isNativeIntegration || isNativeKit) {
+				// Force the build to run in a separate Pod and strictly sequential
+				t.L.Info("This is a Quarkus native build: setting build configuration with build Pod strategy, and native container with 1 CPU core and 4 GiB memory. Make sure your cluster can handle it.")
+				t.Strategy = string(v1.BuildStrategyPod)
+				t.OrderStrategy = string(v1.BuildOrderStrategySequential)
+				t.TasksRequestCPU = append(t.TasksRequestCPU, "quarkus-native:1000m")
+				t.TasksRequestMemory = append(t.TasksRequestMemory, "quarkus-native:4Gi")
+
 				nativeArgsCd := filepath.Join("maven", "target", "native-sources")
 				command := "cd " + nativeArgsCd + " && echo NativeImage version is $(native-image --version) && echo GraalVM expected version is $(cat graalvm.version) && echo WARN: Make sure they are compatible, otherwise the native compilation may results in error && native-image $(cat native-image.args)"
 				// it should be performed as the last custom task
@@ -94,8 +101,13 @@ func (t *builderTrait) Apply(e *Environment) error {
 	// local pipeline tasks
 	var pipelineTasks []v1.Task
 
+	// task configuration resources
+	tasksConf, err := t.parseTasksConf()
+	if err != nil {
+		return err
+	}
 	// Building task
-	builderTask, err := t.builderTask(e)
+	builderTask, err := t.builderTask(e, taskConfOrDefault(tasksConf, "builder"))
 	if err != nil {
 		e.IntegrationKit.Status.Phase = v1.IntegrationKitPhaseError
 		e.IntegrationKit.Status.SetCondition("IntegrationKitPropertiesFormatValid", corev1.ConditionFalse,
@@ -128,7 +140,7 @@ func (t *builderTrait) Apply(e *Environment) error {
 			return nil
 		}
 
-		customTasks, err := t.customTasks()
+		customTasks, err := t.customTasks(tasksConf)
 		if err != nil {
 			return err
 		}
@@ -137,9 +149,10 @@ func (t *builderTrait) Apply(e *Environment) error {
 	}
 
 	// Packaging task
-	// It's the same builder configuration, but with different steps
+	// It's the same builder configuration, but with different steps and conf
 	packageTask := builderTask.DeepCopy()
 	packageTask.Name = "package"
+	packageTask.Configuration = *taskConfOrDefault(tasksConf, "package")
 	packageTask.Steps = make([]string, 0)
 	pipelineTasks = append(pipelineTasks, v1.Task{Package: packageTask})
 
@@ -148,7 +161,8 @@ func (t *builderTrait) Apply(e *Environment) error {
 	case v1.IntegrationPlatformBuildPublishStrategySpectrum:
 		pipelineTasks = append(pipelineTasks, v1.Task{Spectrum: &v1.SpectrumTask{
 			BaseTask: v1.BaseTask{
-				Name: "spectrum",
+				Name:          "spectrum",
+				Configuration: *taskConfOrDefault(tasksConf, "spectrum"),
 			},
 			PublishTask: v1.PublishTask{
 				BaseImage: e.Platform.Status.Build.BaseImage,
@@ -160,7 +174,8 @@ func (t *builderTrait) Apply(e *Environment) error {
 	case v1.IntegrationPlatformBuildPublishStrategyJib:
 		pipelineTasks = append(pipelineTasks, v1.Task{Jib: &v1.JibTask{
 			BaseTask: v1.BaseTask{
-				Name: "jib",
+				Name:          "jib",
+				Configuration: *taskConfOrDefault(tasksConf, "jib"),
 			},
 			PublishTask: v1.PublishTask{
 				BaseImage: e.Platform.Status.Build.BaseImage,
@@ -172,7 +187,8 @@ func (t *builderTrait) Apply(e *Environment) error {
 	case v1.IntegrationPlatformBuildPublishStrategyS2I:
 		pipelineTasks = append(pipelineTasks, v1.Task{S2i: &v1.S2iTask{
 			BaseTask: v1.BaseTask{
-				Name: "s2i",
+				Name:          "s2i",
+				Configuration: *taskConfOrDefault(tasksConf, "s2i"),
 			},
 			Tag: e.IntegrationKit.ResourceVersion,
 		}})
@@ -195,7 +211,8 @@ func (t *builderTrait) Apply(e *Environment) error {
 		pipelineTasks = append(pipelineTasks, v1.Task{Buildah: &v1.BuildahTask{
 			Platform: platform,
 			BaseTask: v1.BaseTask{
-				Name: "buildah",
+				Name:          "buildah",
+				Configuration: *taskConfOrDefault(tasksConf, "buildah"),
 			},
 			PublishTask: v1.PublishTask{
 				Image:    getImageName(e),
@@ -218,7 +235,8 @@ func (t *builderTrait) Apply(e *Environment) error {
 
 		pipelineTasks = append(pipelineTasks, v1.Task{Kaniko: &v1.KanikoTask{
 			BaseTask: v1.BaseTask{
-				Name: "kaniko",
+				Name:          "kaniko",
+				Configuration: *taskConfOrDefault(tasksConf, "kaniko"),
 			},
 			PublishTask: v1.PublishTask{
 				Image:    getImageName(e),
@@ -238,7 +256,7 @@ func (t *builderTrait) Apply(e *Environment) error {
 	return nil
 }
 
-func (t *builderTrait) builderTask(e *Environment) (*v1.BuilderTask, error) {
+func (t *builderTrait) builderTask(e *Environment, taskConf *v1.BuildConfiguration) (*v1.BuilderTask, error) {
 	maven := v1.MavenBuildSpec{
 		MavenSpec: e.Platform.Status.Build.Maven,
 	}
@@ -247,38 +265,13 @@ func (t *builderTrait) builderTask(e *Environment) (*v1.BuilderTask, error) {
 		maven.Repositories = append(maven.Repositories, mvn.NewRepository(repo))
 	}
 
-	if trait := e.Catalog.GetTrait(quarkusTraitID); trait != nil {
-		quarkus, ok := trait.(*quarkusTrait)
-		isNativeIntegration := quarkus.isNativeIntegration(e)
-		isNativeKit, err := quarkus.isNativeKit(e)
-		if err != nil {
-			return nil, err
-		}
-		// The builder trait must define certain resources requirements when we have a native build
-		if ok && pointer.BoolDeref(quarkus.Enabled, true) && (isNativeIntegration || isNativeKit) {
-			// Force the build to run in a separate Pod and strictly sequential
-			t.L.Info("This is a Quarkus native build: setting build configuration with build Pod strategy, 1 CPU core and 4 GiB memory. Make sure your cluster can handle it.")
-			t.Strategy = string(v1.BuildStrategyPod)
-			t.OrderStrategy = string(v1.BuildOrderStrategySequential)
-			t.RequestCPU = "1000m"
-			t.RequestMemory = "4Gi"
-		}
-	}
-
-	buildConfig := v1.BuildConfiguration{
-		RequestCPU:    t.RequestCPU,
-		RequestMemory: t.RequestMemory,
-		LimitCPU:      t.LimitCPU,
-		LimitMemory:   t.LimitMemory,
-	}
-
 	if t.Strategy != "" {
 		t.L.Infof("User defined build strategy %s", t.Strategy)
 		found := false
 		for _, s := range v1.BuildStrategies {
 			if string(s) == t.Strategy {
 				found = true
-				buildConfig.Strategy = s
+				taskConf.Strategy = s
 				break
 			}
 		}
@@ -297,7 +290,7 @@ func (t *builderTrait) builderTask(e *Environment) (*v1.BuilderTask, error) {
 		for _, s := range v1.BuildOrderStrategies {
 			if string(s) == t.OrderStrategy {
 				found = true
-				buildConfig.OrderStrategy = s
+				taskConf.OrderStrategy = s
 				break
 			}
 		}
@@ -312,13 +305,13 @@ func (t *builderTrait) builderTask(e *Environment) (*v1.BuilderTask, error) {
 
 	task := &v1.BuilderTask{
 		BaseTask: v1.BaseTask{
-			Name: "builder",
+			Name:          "builder",
+			Configuration: *taskConf,
 		},
-		Configuration: buildConfig,
-		BaseImage:     e.Platform.Status.Build.BaseImage,
-		Runtime:       e.CamelCatalog.Runtime,
-		Dependencies:  e.IntegrationKit.Spec.Dependencies,
-		Maven:         maven,
+		BaseImage:    e.Platform.Status.Build.BaseImage,
+		Runtime:      e.CamelCatalog.Runtime,
+		Dependencies: e.IntegrationKit.Spec.Dependencies,
+		Maven:        maven,
 	}
 
 	if task.Maven.Properties == nil {
@@ -380,8 +373,9 @@ func getImageName(e *Environment) string {
 	return e.Platform.Status.Build.Registry.Address + "/" + organization + "/camel-k-" + e.IntegrationKit.Name + ":" + e.IntegrationKit.ResourceVersion
 }
 
-func (t *builderTrait) customTasks() ([]v1.Task, error) {
+func (t *builderTrait) customTasks(tasksConf map[string]*v1.BuildConfiguration) ([]v1.Task, error) {
 	customTasks := make([]v1.Task, len(t.Tasks))
+
 	for i, t := range t.Tasks {
 		splitted := strings.Split(t, ";")
 		if len(splitted) < 3 {
@@ -398,7 +392,8 @@ func (t *builderTrait) customTasks() ([]v1.Task, error) {
 		customTasks[i] = v1.Task{
 			Custom: &v1.UserTask{
 				BaseTask: v1.BaseTask{
-					Name: splitted[0],
+					Name:          splitted[0],
+					Configuration: *taskConfOrDefault(tasksConf, splitted[0]),
 				},
 				ContainerImage:    splitted[1],
 				ContainerCommands: containerCommands,
@@ -408,6 +403,72 @@ func (t *builderTrait) customTasks() ([]v1.Task, error) {
 	return customTasks, nil
 }
 
+func taskConfOrDefault(tasksConf map[string]*v1.BuildConfiguration, taskName string) *v1.BuildConfiguration {
+	if tasksConf == nil || tasksConf[taskName] == nil {
+		return &v1.BuildConfiguration{}
+	}
+
+	return tasksConf[taskName]
+}
+
+func (t *builderTrait) parseTasksConf() (map[string]*v1.BuildConfiguration, error) {
+	tasksConf := make(map[string]*v1.BuildConfiguration)
+
+	for _, t := range t.TasksRequestCPU {
+		splits := strings.Split(t, ":")
+		if len(splits) != 2 {
+			return nil, fmt.Errorf("could not parse %s, expected format <task-name>:<task-resource>", t)
+		}
+		taskName := splits[0]
+		taskResource := splits[1]
+		if tasksConf[taskName] == nil {
+			tasksConf[taskName] = &v1.BuildConfiguration{}
+		}
+		tasksConf[taskName].RequestCPU = taskResource
+	}
+
+	for _, t := range t.TasksRequestMemory {
+		splits := strings.Split(t, ":")
+		if len(splits) != 2 {
+			return nil, fmt.Errorf("could not parse %s, expected format <task-name>:<task-resource>", t)
+		}
+		taskName := splits[0]
+		taskResource := splits[1]
+		if tasksConf[taskName] == nil {
+			tasksConf[taskName] = &v1.BuildConfiguration{}
+		}
+		tasksConf[taskName].RequestMemory = taskResource
+	}
+
+	for _, t := range t.TasksLimitCPU {
+		splits := strings.Split(t, ":")
+		if len(splits) != 2 {
+			return nil, fmt.Errorf("could not parse %s, expected format <task-name>:<task-resource>", t)
+		}
+		taskName := splits[0]
+		taskResource := splits[1]
+		if tasksConf[taskName] == nil {
+			tasksConf[taskName] = &v1.BuildConfiguration{}
+		}
+		tasksConf[taskName].LimitCPU = taskResource
+	}
+
+	for _, t := range t.TasksLimitMemory {
+		splits := strings.Split(t, ":")
+		if len(splits) != 2 {
+			return nil, fmt.Errorf("could not parse %s, expected format <task-name>:<task-resource>", t)
+		}
+		taskName := splits[0]
+		taskResource := splits[1]
+		if tasksConf[taskName] == nil {
+			tasksConf[taskName] = &v1.BuildConfiguration{}
+		}
+		tasksConf[taskName].LimitMemory = taskResource
+	}
+
+	return tasksConf, nil
+}
+
 // we may get a command in the following format `/bin/bash -c "ls && echo 'hello'`
 // which should provide a string with {"/bin/bash", "-c", "ls && echo 'hello'"}.
 // if however we have a command which is not quoted, then we leave it the way it is.
diff --git a/pkg/trait/builder_test.go b/pkg/trait/builder_test.go
index 9a5b29472..79f47bd86 100644
--- a/pkg/trait/builder_test.go
+++ b/pkg/trait/builder_test.go
@@ -322,7 +322,7 @@ func TestBuilderCustomTasks(t *testing.T) {
 	builderTrait.Tasks = append(builderTrait.Tasks, "test;alpine;ls")
 	builderTrait.Tasks = append(builderTrait.Tasks, `test;alpine;mvn test`)
 
-	tasks, err := builderTrait.customTasks()
+	tasks, err := builderTrait.customTasks(nil)
 
 	assert.Nil(t, err)
 	assert.Equal(t, 2, len(tasks))
@@ -338,7 +338,7 @@ func TestBuilderCustomTasksFailure(t *testing.T) {
 	builderTrait := createNominalBuilderTraitTest()
 	builderTrait.Tasks = append(builderTrait.Tasks, "test;alpine")
 
-	_, err := builderTrait.customTasks()
+	_, err := builderTrait.customTasks(nil)
 
 	assert.NotNil(t, err)
 }
@@ -347,7 +347,7 @@ func TestBuilderCustomTasksScript(t *testing.T) {
 	builderTrait := createNominalBuilderTraitTest()
 	builderTrait.Tasks = append(builderTrait.Tasks, "test;alpine;/bin/bash -c \"cd test && ls; echo 'helooo'\"")
 
-	tasks, err := builderTrait.customTasks()
+	tasks, err := builderTrait.customTasks(nil)
 
 	assert.Nil(t, err)
 	assert.Equal(t, 1, len(tasks))
@@ -358,6 +358,33 @@ func TestBuilderCustomTasksScript(t *testing.T) {
 	assert.Equal(t, "cd test && ls; echo 'helooo'", tasks[0].Custom.ContainerCommands[2])
 }
 
+func TestBuilderCustomTasksConfiguration(t *testing.T) {
+	builderTrait := createNominalBuilderTraitTest()
+	builderTrait.TasksRequestCPU = append(builderTrait.TasksLimitCPU, "builder:1000m")
+	builderTrait.TasksLimitCPU = append(builderTrait.TasksLimitCPU, "custom1:500m")
+	builderTrait.TasksRequestMemory = append(builderTrait.TasksLimitCPU, "package:8Gi")
+	builderTrait.TasksLimitMemory = append(builderTrait.TasksLimitCPU, "spectrum:4Gi")
+
+	tasksConf, err := builderTrait.parseTasksConf()
+
+	assert.Nil(t, err)
+	assert.Equal(t, 4, len(tasksConf))
+	assert.Equal(t, "1000m", tasksConf["builder"].RequestCPU)
+	assert.Equal(t, "500m", tasksConf["custom1"].LimitCPU)
+	assert.Equal(t, "8Gi", tasksConf["package"].RequestMemory)
+	assert.Equal(t, "4Gi", tasksConf["spectrum"].LimitMemory)
+}
+
+func TestBuilderCustomTasksConfigurationError(t *testing.T) {
+	builderTrait := createNominalBuilderTraitTest()
+	builderTrait.TasksLimitCPU = append(builderTrait.TasksLimitCPU, "syntax error")
+
+	_, err := builderTrait.parseTasksConf()
+
+	assert.NotNil(t, err)
+	assert.Equal(t, "could not parse syntax error, expected format <task-name>:<task-resource>", err.Error())
+}
+
 func TestUserTaskCommands(t *testing.T) {
 	command := `/bin/bash -c "ls && echo 'hello' && $(cat /path/to/a/resource)"`
 	podCommands := splitContainerCommand(command)
diff --git a/resources/traits.yaml b/resources/traits.yaml
index 20d9e9e19..5919692f0 100755
--- a/resources/traits.yaml
+++ b/resources/traits.yaml
@@ -218,20 +218,20 @@ traits:
       `sequential` (default sequential)
   - name: request-cpu
     type: string
-    description: When using `pod` strategy, the minimum amount of CPU required by
-      the pod builder.
+    description: 'When using `pod` strategy, the minimum amount of CPU required by
+      the pod builder. Deprecated: use TasksRequestCPU instead with task name `builder`.'
   - name: request-memory
     type: string
-    description: When using `pod` strategy, the minimum amount of memory required
-      by the pod builder.
+    description: 'When using `pod` strategy, the minimum amount of memory required
+      by the pod builder. Deprecated: use TasksRequestCPU instead with task name `builder`.'
   - name: limit-cpu
     type: string
-    description: When using `pod` strategy, the maximum amount of CPU required by
-      the pod builder.
+    description: 'When using `pod` strategy, the maximum amount of CPU required by
+      the pod builder. Deprecated: use TasksRequestCPU instead with task name `builder`.'
   - name: limit-memory
     type: string
-    description: When using `pod` strategy, the maximum amount of memory required
-      by the pod builder.
+    description: 'When using `pod` strategy, the maximum amount of memory required
+      by the pod builder. Deprecated: use TasksRequestCPU instead with task name `builder`.'
   - name: maven-profiles
     type: '[]string'
     description: 'A list of references pointing to configmaps/secrets that contains
@@ -243,7 +243,23 @@ traits:
   - name: tasks
     type: '[]string'
     description: A list of tasks to be executed (available only when using `pod` strategy)
-      with format <name>;<container-image>;<container-command>
+      with format `<name>;<container-image>;<container-command>`.
+  - name: tasks-request-cpu
+    type: '[]string'
+    description: A list of request cpu configuration for the specific task with format
+      `<task-name>:<request-cpu-conf>`.
+  - name: tasks-request-memory
+    type: '[]string'
+    description: A list of request memory configuration for the specific task with
+      format `<task-name>:<request-memory-conf>`.
+  - name: tasks-limit-cpu
+    type: '[]string'
+    description: A list of limit cpu configuration for the specific task with format
+      `<task-name>:<limit-cpu-conf>`.
+  - name: tasks-limit-memory
+    type: '[]string'
+    description: A list of limit memory configuration for the specific task with format
+      `<task-name>:<limit-memory-conf>`.
 - name: camel
   platform: true
   profiles:


[camel-k] 02/09: chore(ctrl): get rid of dynamic builder image

Posted by pc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 084b771dbb53f26733dccd6e3498a2f3c9e5804e
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Mon Sep 25 12:43:38 2023 +0200

    chore(ctrl): get rid of dynamic builder image
    
    It was introduced to decouple the operator from the runtime. No longer needed as the native phase is executed using catalog tool image directly.
---
 .../catalog_builder_test.go                        |   7 -
 e2e/install/cli/global_test.go                     |   7 -
 pkg/apis/camel/v1/camelcatalog_types.go            |   2 +-
 pkg/controller/catalog/initialize.go               | 539 +--------------------
 pkg/controller/integrationkit/build.go             |   4 +-
 5 files changed, 9 insertions(+), 550 deletions(-)

diff --git a/e2e/commonwithcustominstall/catalog_builder_test.go b/e2e/commonwithcustominstall/catalog_builder_test.go
index 0fe1061ed..436856c82 100644
--- a/e2e/commonwithcustominstall/catalog_builder_test.go
+++ b/e2e/commonwithcustominstall/catalog_builder_test.go
@@ -48,14 +48,7 @@ func TestCamelCatalogBuilder(t *testing.T) {
 			Should(Equal(corev1.ConditionTrue))
 		catalogName := fmt.Sprintf("camel-catalog-%s", strings.ToLower(defaults.DefaultRuntimeVersion))
 		Eventually(CamelCatalog(ns, catalogName)).ShouldNot(BeNil())
-		catalog := CamelCatalog(ns, catalogName)()
-		imageName := fmt.Sprintf("camel-k-runtime-%s-builder:%s", catalog.Spec.Runtime.Provider, strings.ToLower(catalog.Spec.Runtime.Version))
 		Eventually(CamelCatalogPhase(ns, catalogName), TestTimeoutMedium).Should(Equal(v1.CamelCatalogPhaseReady))
-		Eventually(CamelCatalogImage(ns, catalogName), TestTimeoutMedium).Should(ContainSubstring(imageName))
-		// The container may have been created by previous test
-		Eventually(CamelCatalogCondition(ns, catalogName, v1.CamelCatalogConditionReady)().Message).Should(
-			Or(Equal("Container image successfully built"), Equal("Container image exists on registry")),
-		)
 
 		// Run an integration with a catalog not compatible
 		// The operator should create the catalog, but fail on reconciliation as it is not compatible
diff --git a/e2e/install/cli/global_test.go b/e2e/install/cli/global_test.go
index 479264255..27ad16159 100644
--- a/e2e/install/cli/global_test.go
+++ b/e2e/install/cli/global_test.go
@@ -66,14 +66,7 @@ func TestRunGlobalInstall(t *testing.T) {
 				Should(Equal(corev1.ConditionTrue))
 			catalogName := fmt.Sprintf("camel-catalog-%s", strings.ToLower(defaults.DefaultRuntimeVersion))
 			Eventually(CamelCatalog(operatorNamespace, catalogName)).ShouldNot(BeNil())
-			catalog := CamelCatalog(operatorNamespace, catalogName)()
-			imageName := fmt.Sprintf("camel-k-runtime-%s-builder:%s", catalog.Spec.Runtime.Provider, strings.ToLower(catalog.Spec.Runtime.Version))
 			Eventually(CamelCatalogPhase(operatorNamespace, catalogName), TestTimeoutMedium).Should(Equal(v1.CamelCatalogPhaseReady))
-			Eventually(CamelCatalogImage(operatorNamespace, catalogName), TestTimeoutMedium).Should(ContainSubstring(imageName))
-			// The container may have been created by previous test
-			Eventually(CamelCatalogCondition(operatorNamespace, catalogName, v1.CamelCatalogConditionReady)().Message).Should(
-				Or(Equal("Container image successfully built"), Equal("Container image exists on registry")),
-			)
 		})
 
 		t.Run("Global test on namespace with platform", func(t *testing.T) {
diff --git a/pkg/apis/camel/v1/camelcatalog_types.go b/pkg/apis/camel/v1/camelcatalog_types.go
index 9b38eb98b..5b83f378c 100644
--- a/pkg/apis/camel/v1/camelcatalog_types.go
+++ b/pkg/apis/camel/v1/camelcatalog_types.go
@@ -67,7 +67,7 @@ type CamelCatalogSpec struct {
 	Loaders map[string]CamelLoader `json:"loaders" yaml:"loaders"`
 }
 
-// CamelCatalogStatus defines the observed state of CamelCatalog. As the catalog is a static resource, we expect it to be empty.
+// CamelCatalogStatus defines the observed state of CamelCatalog.
 type CamelCatalogStatus struct {
 	// ObservedGeneration is the most recent generation observed for this Catalog.
 	ObservedGeneration int64 `json:"observedGeneration,omitempty"`
diff --git a/pkg/controller/catalog/initialize.go b/pkg/controller/catalog/initialize.go
index a80712e65..20cd365d7 100644
--- a/pkg/controller/catalog/initialize.go
+++ b/pkg/controller/catalog/initialize.go
@@ -18,45 +18,10 @@ limitations under the License.
 package catalog
 
 import (
-	"archive/tar"
-	"bufio"
-	"compress/gzip"
 	"context"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"io"
-	"os"
-	"path/filepath"
-	"runtime"
-	"strings"
-	"time"
 
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
-	"github.com/apache/camel-k/v2/pkg/builder"
-	"github.com/apache/camel-k/v2/pkg/client"
 	platformutil "github.com/apache/camel-k/v2/pkg/platform"
-	"github.com/apache/camel-k/v2/pkg/util"
-	"github.com/apache/camel-k/v2/pkg/util/defaults"
-	"github.com/apache/camel-k/v2/pkg/util/kubernetes"
-	"github.com/apache/camel-k/v2/pkg/util/openshift"
-	"github.com/apache/camel-k/v2/pkg/util/s2i"
-
-	spectrum "github.com/container-tools/spectrum/pkg/builder"
-
-	buildv1 "github.com/openshift/api/build/v1"
-	imagev1 "github.com/openshift/api/image/v1"
-
-	corev1 "k8s.io/api/core/v1"
-	k8serrors "k8s.io/apimachinery/pkg/api/errors"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
-	"k8s.io/apimachinery/pkg/runtime/schema"
-	"k8s.io/apimachinery/pkg/runtime/serializer"
-	"k8s.io/client-go/rest"
-
-	ctrl "sigs.k8s.io/controller-runtime/pkg/client"
-	"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
 )
 
 // NewInitializeAction returns a action that initializes the catalog configuration when not provided by the user.
@@ -90,509 +55,15 @@ func (action *initializeAction) Handle(ctx context.Context, catalog *v1.CamelCat
 		return catalog, nil
 	}
 
-	if platform.Status.Build.PublishStrategy == v1.IntegrationPlatformBuildPublishStrategyS2I {
-		return initializeS2i(ctx, action.client, platform, catalog)
-	}
-	// Default to spectrum
-	// Make basic options for building image in the registry
-	options, err := makeSpectrumOptions(ctx, action.client, platform.Namespace, platform.Status.Build.Registry)
-	if err != nil {
-		return catalog, err
-	}
-	return initializeSpectrum(options, platform, catalog)
+	return initialize(catalog)
 
 }
 
-func initializeSpectrum(options spectrum.Options, ip *v1.IntegrationPlatform, catalog *v1.CamelCatalog) (*v1.CamelCatalog, error) {
+func initialize(catalog *v1.CamelCatalog) (*v1.CamelCatalog, error) {
 	target := catalog.DeepCopy()
-	organization := ip.Status.Build.Registry.Organization
-	if organization == "" {
-		organization = catalog.Namespace
-	}
-	imageName := fmt.Sprintf(
-		"%s/%s/camel-k-runtime-%s-builder:%s",
-		ip.Status.Build.Registry.Address,
-		organization,
-		catalog.Spec.Runtime.Provider,
-		strings.ToLower(catalog.Spec.Runtime.Version),
-	)
-
-	newStdR, newStdW, pipeErr := os.Pipe()
-	defer util.CloseQuietly(newStdW)
-
-	if pipeErr != nil {
-		// In the unlikely case of an error, use stdout instead of aborting
-		Log.Errorf(pipeErr, "Unable to remap I/O. Spectrum messages will be displayed on the stdout")
-		newStdW = os.Stdout
-	}
-	go readSpectrumLogs(newStdR)
-
-	// We use the future target image as a base just for the sake of pulling and verify it exists
-	options.Base = imageName
-	options.Stderr = newStdW
-	options.Stdout = newStdW
-
-	if !imageSnapshot(options.Base) && imageExistsSpectrum(options) {
-		target.Status.Phase = v1.CamelCatalogPhaseReady
-		target.Status.SetCondition(
-			v1.CamelCatalogConditionReady,
-			corev1.ConditionTrue,
-			"Builder Image",
-			"Container image exists on registry",
-		)
-		target.Status.Image = imageName
-
-		return target, nil
-	}
-
-	// Now we properly set the base and the target image
-	options.Base = catalog.Spec.GetQuarkusToolingImage()
-	options.Target = imageName
-
-	err := buildRuntimeBuilderWithTimeoutSpectrum(options, ip.Status.Build.GetBuildCatalogToolTimeout().Duration)
-
-	if err != nil {
-		Log.Error(err, "Error trying to build Camel K builder container")
-		target.Status.Phase = v1.CamelCatalogPhaseError
-		target.Status.SetErrorCondition(
-			v1.CamelCatalogConditionReady,
-			"Builder Image",
-			err,
-		)
-	} else {
-		target.Status.Phase = v1.CamelCatalogPhaseReady
-		target.Status.SetCondition(
-			v1.CamelCatalogConditionReady,
-			corev1.ConditionTrue,
-			"Builder Image",
-			"Container image successfully built",
-		)
-		target.Status.Image = imageName
-	}
-
-	return target, nil
-}
-
-// nolint: maintidx // TODO: refactor the code
-func initializeS2i(ctx context.Context, c client.Client, ip *v1.IntegrationPlatform, catalog *v1.CamelCatalog) (*v1.CamelCatalog, error) {
-	target := catalog.DeepCopy()
-	// No registry in s2i
-	imageName := fmt.Sprintf(
-		"camel-k-runtime-%s-builder",
-		catalog.Spec.Runtime.Provider,
-	)
-	imageTag := strings.ToLower(catalog.Spec.Runtime.Version)
-
-	uidStr := getS2iUserID(ctx, c, ip, catalog)
-
-	// Dockerfile
-	dockerfile := `
-		FROM ` + catalog.Spec.GetQuarkusToolingImage() + `
-		USER ` + uidStr + `:0
-		ADD --chown=` + uidStr + `:0 /usr/local/bin/kamel /usr/local/bin/kamel
-		ADD --chown=` + uidStr + `:0 /usr/share/maven/mvnw/ /usr/share/maven/mvnw/
-	`
-	if imageSnapshot(imageName + ":" + imageTag) {
-		dockerfile = dockerfile + `
-		ADD --chown=` + uidStr + `:0 ` + defaults.LocalRepository + ` ` + defaults.LocalRepository + `
-	`
-	}
-
-	owner := catalogReference(catalog)
-
-	// BuildConfig
-	bc := &buildv1.BuildConfig{
-		TypeMeta: metav1.TypeMeta{
-			APIVersion: buildv1.GroupVersion.String(),
-			Kind:       "BuildConfig",
-		},
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      imageName,
-			Namespace: ip.Namespace,
-			Labels: map[string]string{
-				kubernetes.CamelCreatorLabelKind:      v1.CamelCatalogKind,
-				kubernetes.CamelCreatorLabelName:      catalog.Name,
-				kubernetes.CamelCreatorLabelNamespace: catalog.Namespace,
-				kubernetes.CamelCreatorLabelVersion:   catalog.ResourceVersion,
-				"camel.apache.org/runtime.version":    catalog.Spec.Runtime.Version,
-				"camel.apache.org/runtime.provider":   string(catalog.Spec.Runtime.Provider),
-			},
-		},
-		Spec: buildv1.BuildConfigSpec{
-			CommonSpec: buildv1.CommonSpec{
-				Source: buildv1.BuildSource{
-					Type:       buildv1.BuildSourceBinary,
-					Dockerfile: &dockerfile,
-				},
-				Strategy: buildv1.BuildStrategy{
-					DockerStrategy: &buildv1.DockerBuildStrategy{},
-				},
-				Output: buildv1.BuildOutput{
-					To: &corev1.ObjectReference{
-						Kind: "ImageStreamTag",
-						Name: imageName + ":" + imageTag,
-					},
-				},
-			},
-		},
-	}
-
-	// ImageStream
-	is := &imagev1.ImageStream{
-		TypeMeta: metav1.TypeMeta{
-			APIVersion: imagev1.GroupVersion.String(),
-			Kind:       "ImageStream",
-		},
-		ObjectMeta: metav1.ObjectMeta{
-			Name:      bc.Name,
-			Namespace: bc.Namespace,
-			Labels: map[string]string{
-				kubernetes.CamelCreatorLabelKind:      v1.CamelCatalogKind,
-				kubernetes.CamelCreatorLabelName:      catalog.Name,
-				kubernetes.CamelCreatorLabelNamespace: catalog.Namespace,
-				kubernetes.CamelCreatorLabelVersion:   catalog.ResourceVersion,
-				"camel.apache.org/runtime.provider":   string(catalog.Spec.Runtime.Provider),
-			},
-		},
-		Spec: imagev1.ImageStreamSpec{
-			LookupPolicy: imagev1.ImageLookupPolicy{
-				Local: true,
-			},
-		},
-	}
-
-	if !imageSnapshot(imageName+":"+imageTag) && imageExistsS2i(ctx, c, is) {
-		target.Status.Phase = v1.CamelCatalogPhaseReady
-		target.Status.SetCondition(
-			v1.CamelCatalogConditionReady,
-			corev1.ConditionTrue,
-			"Builder Image",
-			"Container image exists on registry (later)",
-		)
-		target.Status.Image = imageName
-		return target, nil
-	}
-
-	err := s2i.BuildConfig(ctx, c, bc, owner)
-	if err != nil {
-		target.Status.Phase = v1.CamelCatalogPhaseError
-		target.Status.SetErrorCondition(
-			v1.CamelCatalogConditionReady,
-			"Builder Image",
-			err,
-		)
-		return target, err
-	}
-
-	err = s2i.ImageStream(ctx, c, is, owner)
-	if err != nil {
-		target.Status.Phase = v1.CamelCatalogPhaseError
-		target.Status.SetErrorCondition(
-			v1.CamelCatalogConditionReady,
-			"Builder Image",
-			err,
-		)
-		return target, err
-	}
-
-	err = util.WithTempDir(imageName+"-s2i-", func(tmpDir string) error {
-		archive := filepath.Join(tmpDir, "archive.tar.gz")
-
-		archiveFile, err := os.Create(archive)
-		if err != nil {
-			return fmt.Errorf("cannot create tar archive: %w", err)
-		}
-
-		directories := []string{
-			"/usr/local/bin/kamel:/usr/local/bin/kamel",
-			"/usr/share/maven/mvnw/:/usr/share/maven/mvnw/",
-		}
-		if imageSnapshot(imageName + ":" + imageTag) {
-			directories = append(directories, defaults.LocalRepository+":"+defaults.LocalRepository)
-		}
-
-		err = tarEntries(archiveFile, directories...)
-		if err != nil {
-			return fmt.Errorf("cannot tar path entry: %w", err)
-		}
-
-		f, err := util.Open(archive)
-		if err != nil {
-			return err
-		}
-		httpCli, err := rest.HTTPClientFor(c.GetConfig())
-		if err != nil {
-			return err
-		}
-		restClient, err := apiutil.RESTClientForGVK(
-			schema.GroupVersionKind{Group: "build.openshift.io", Version: "v1"}, false,
-			c.GetConfig(), serializer.NewCodecFactory(c.GetScheme()), httpCli)
-		if err != nil {
-			return err
-		}
-
-		r := restClient.Post().
-			Namespace(bc.Namespace).
-			Body(bufio.NewReader(f)).
-			Resource("buildconfigs").
-			Name(bc.Name).
-			SubResource("instantiatebinary").
-			Do(ctx)
-
-		if r.Error() != nil {
-			return fmt.Errorf("cannot instantiate binary: %w", err)
-		}
-
-		data, err := r.Raw()
-		if err != nil {
-			return fmt.Errorf("no raw data retrieved: %w", err)
-		}
-
-		s2iBuild := buildv1.Build{}
-		err = json.Unmarshal(data, &s2iBuild)
-		if err != nil {
-			return fmt.Errorf("cannot unmarshal instantiated binary response: %w", err)
-		}
-
-		err = s2i.WaitForS2iBuildCompletion(ctx, c, &s2iBuild)
-		if err != nil {
-			if errors.Is(err, context.Canceled) || errors.Is(err, context.DeadlineExceeded) {
-				//nolint: contextcheck
-				if err := s2i.CancelBuild(context.Background(), c, &s2iBuild); err != nil {
-					return fmt.Errorf("cannot cancel s2i Build: %s/%s", s2iBuild.Namespace, s2iBuild.Name)
-				}
-			}
-			return err
-		}
-		if s2iBuild.Status.Output.To != nil {
-			Log.Infof("Camel K builder container image %s:%s@%s created", imageName, imageTag, s2iBuild.Status.Output.To.ImageDigest)
-		}
-
-		err = c.Get(ctx, ctrl.ObjectKeyFromObject(is), is)
-		if err != nil {
-			return err
-		}
-
-		if is.Status.DockerImageRepository == "" {
-			return errors.New("dockerImageRepository not available in ImageStream")
-		}
-
-		target.Status.Phase = v1.CamelCatalogPhaseReady
-		target.Status.SetCondition(
-			v1.CamelCatalogConditionReady,
-			corev1.ConditionTrue,
-			"Builder Image",
-			"Container image successfully built",
-		)
-		target.Status.Image = is.Status.DockerImageRepository + ":" + imageTag
-
-		return f.Close()
-	})
-
-	if err != nil {
-		target.Status.Phase = v1.CamelCatalogPhaseError
-		target.Status.SetErrorCondition(
-			v1.CamelCatalogConditionReady,
-			"Builder Image",
-			err,
-		)
-		return target, err
-	}
+	// TODO - we may verify the existence of the catalog image (required by native build)
+	// or any other condition that may make a CamelCatalog to fail.
+	target.Status.Phase = v1.CamelCatalogPhaseReady
 
 	return target, nil
 }
-
-func imageExistsSpectrum(options spectrum.Options) bool {
-	Log.Infof("Checking if Camel K builder container %s already exists...", options.Base)
-	ctrImg, err := spectrum.Pull(options)
-	// Ignore the error-indent-flow as we save the need to declare a dependency explicitly
-	// nolint: revive
-	if ctrImg != nil && err == nil {
-		if hash, err := ctrImg.Digest(); err != nil {
-			Log.Errorf(err, "Cannot calculate digest")
-			return false
-		} else {
-			Log.Infof("Found Camel K builder container with digest %s", hash.String())
-			return true
-		}
-	}
-
-	Log.Infof("Couldn't pull image due to %s", err.Error())
-	return false
-}
-
-func imageExistsS2i(ctx context.Context, c client.Client, is *imagev1.ImageStream) bool {
-	Log.Infof("Checking if Camel K builder container %s already exists...", is.Name)
-	key := ctrl.ObjectKey{
-		Namespace: is.Namespace,
-		Name:      is.Name,
-	}
-
-	err := c.Get(ctx, key, is)
-
-	if err != nil {
-		if !k8serrors.IsNotFound(err) {
-			Log.Infof("Couldn't pull image due to %s", err.Error())
-		}
-		Log.Info("Could not find Camel K builder container")
-		return false
-	}
-	Log.Info("Found Camel K builder container ")
-	return true
-}
-
-func imageSnapshot(imageName string) bool {
-	return strings.HasSuffix(imageName, "snapshot")
-}
-
-func buildRuntimeBuilderWithTimeoutSpectrum(options spectrum.Options, timeout time.Duration) error {
-	// Backward compatibility with IP which had not a timeout field
-	if timeout == 0 {
-		return buildRuntimeBuilderImageSpectrum(options)
-	}
-	result := make(chan error, 1)
-	go func() {
-		result <- buildRuntimeBuilderImageSpectrum(options)
-	}()
-	select {
-	case <-time.After(timeout):
-		return fmt.Errorf("build timeout: %s", timeout.String())
-	case result := <-result:
-		return result
-	}
-}
-
-// This func will take care to dynamically build an image that will contain the tools required
-// by the catalog build plus kamel binary and a maven wrapper required for the build.
-func buildRuntimeBuilderImageSpectrum(options spectrum.Options) error {
-	if options.Base == "" {
-		return fmt.Errorf("missing base image, likely catalog is not compatible with this Camel K version")
-	}
-	Log.Infof("Making up Camel K builder container %s", options.Target)
-
-	if jobs := runtime.GOMAXPROCS(0); jobs > 1 {
-		options.Jobs = jobs
-	}
-
-	directories := []string{
-		"/usr/local/bin/kamel:/usr/local/bin/",
-		"/usr/share/maven/mvnw/:/usr/share/maven/mvnw/",
-	}
-	if imageSnapshot(options.Target) {
-		directories = append(directories, defaults.LocalRepository+":"+defaults.LocalRepository)
-	}
-
-	_, err := spectrum.Build(options, directories...)
-	if err != nil {
-		return err
-	}
-
-	return nil
-}
-
-func readSpectrumLogs(newStdOut io.Reader) {
-	scanner := bufio.NewScanner(newStdOut)
-
-	for scanner.Scan() {
-		line := scanner.Text()
-		Log.Infof(line)
-	}
-}
-
-func makeSpectrumOptions(ctx context.Context, c client.Client, platformNamespace string, registry v1.RegistrySpec) (spectrum.Options, error) {
-	options := spectrum.Options{}
-	var err error
-	registryConfigDir := ""
-	if registry.Secret != "" {
-		registryConfigDir, err = builder.MountSecret(ctx, c, platformNamespace, registry.Secret)
-		if err != nil {
-			return options, err
-		}
-	}
-	options.PullInsecure = registry.Insecure
-	options.PushInsecure = registry.Insecure
-	options.PullConfigDir = registryConfigDir
-	options.PushConfigDir = registryConfigDir
-	options.Recursive = true
-
-	return options, nil
-}
-
-// Add entries (files or folders) into tar with the possibility to change its path.
-func tarEntries(writer io.Writer, files ...string) error {
-
-	gzw := gzip.NewWriter(writer)
-	defer util.CloseQuietly(gzw)
-
-	tw := tar.NewWriter(gzw)
-	defer util.CloseQuietly(tw)
-
-	// Iterate over files and add them to the tar archive
-	for _, fileDetail := range files {
-		fileSource := strings.Split(fileDetail, ":")[0]
-		fileTarget := strings.Split(fileDetail, ":")[1]
-		// ensure the src actually exists before trying to tar it
-		if _, err := os.Stat(fileSource); err != nil {
-			return fmt.Errorf("unable to tar files: %w", err)
-		}
-
-		if err := filepath.Walk(fileSource, func(file string, fi os.FileInfo, err error) error {
-			if err != nil {
-				return err
-			}
-
-			if !fi.Mode().IsRegular() {
-				return nil
-			}
-
-			header, err := tar.FileInfoHeader(fi, fi.Name())
-			if err != nil {
-				return err
-			}
-
-			// update the name to correctly reflect the desired destination when un-taring
-			header.Name = strings.TrimPrefix(strings.ReplaceAll(file, fileSource, fileTarget), string(filepath.Separator))
-
-			if err := tw.WriteHeader(header); err != nil {
-				return err
-			}
-
-			f, err := util.Open(file)
-			if err != nil {
-				return err
-			}
-
-			if _, err := io.Copy(tw, f); err != nil {
-				return err
-			}
-
-			return f.Close()
-		}); err != nil {
-			return fmt.Errorf("unable to tar: %w", err)
-		}
-
-	}
-	return nil
-}
-
-func catalogReference(catalog *v1.CamelCatalog) *unstructured.Unstructured {
-	owner := &unstructured.Unstructured{}
-	owner.SetName(catalog.Name)
-	owner.SetUID(catalog.UID)
-	owner.SetAPIVersion(catalog.APIVersion)
-	owner.SetKind(catalog.Kind)
-	return owner
-}
-
-// get user id from security context constraint configuration in namespace if present.
-func getS2iUserID(ctx context.Context, c client.Client, ip *v1.IntegrationPlatform, catalog *v1.CamelCatalog) string {
-	ugfidStr := "1001"
-	if ip.Status.Cluster == v1.IntegrationPlatformClusterOpenShift {
-		uidStr, err := openshift.GetOpenshiftUser(ctx, c, catalog.GetNamespace())
-		if err != nil {
-			Log.Error(err, "Unable to retieve an Openshift user and group Ids.")
-		}
-		return uidStr
-	}
-	return ugfidStr
-}
diff --git a/pkg/controller/integrationkit/build.go b/pkg/controller/integrationkit/build.go
index d4b49fa97..faa32c72d 100644
--- a/pkg/controller/integrationkit/build.go
+++ b/pkg/controller/integrationkit/build.go
@@ -132,7 +132,9 @@ func (action *buildAction) handleBuildSubmitted(ctx context.Context, kit *v1.Int
 				return nil, fmt.Errorf("error while creating Camel K Builder service account: %w", err)
 			}
 		}
-		buildConfig.ToolImage = env.CamelCatalog.Image
+		// The build operation, when executed as a Pod, should be executed by a container image containing the
+		// `kamel builder` command. Likely the same image running the operator should be fine.
+		buildConfig.ToolImage = defaults.OperatorImage()
 		buildConfig.BuilderPodNamespace = operatorNamespace
 		v1.SetBuilderConfigurationTasks(env.Pipeline, buildConfig)
 


[camel-k] 01/09: feat: Quarkus native source

Posted by pc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 4de6cc3f6cc6a4726c5023cbfb7574d1d90cdec1
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Fri Sep 22 14:39:25 2023 +0200

    feat: Quarkus native source
    
    * Move the previous logic to native-source package type
    * A new task takes care to trigger a pipeline task to run Native Image
    * Split the builder task into 2 tasks
       - builder takes care of the building part (mvn package)
       - package task does the packaging (after custom tasks)
    
    Ref #4648
---
 config/crd/bases/camel.apache.org_builds.yaml      | 513 ++++++++++++++++++++-
 .../bases/camel.apache.org_integrationkits.yaml    |  22 +-
 .../camel.apache.org_integrationplatforms.yaml     |  44 +-
 .../crd/bases/camel.apache.org_integrations.yaml   |  22 +-
 .../bases/camel.apache.org_kameletbindings.yaml    |  23 +-
 config/crd/bases/camel.apache.org_pipes.yaml       |  23 +-
 .../pages/installation/advanced/build-config.adoc  |   2 +-
 docs/modules/ROOT/partials/apis/camel-k-crds.adoc  |  46 +-
 docs/modules/traits/pages/quarkus.adoc             |  12 +-
 helm/camel-k/crds/crd-build.yaml                   | 513 ++++++++++++++++++++-
 helm/camel-k/crds/crd-integration-kit.yaml         |  22 +-
 helm/camel-k/crds/crd-integration-platform.yaml    |  44 +-
 helm/camel-k/crds/crd-integration.yaml             |  22 +-
 helm/camel-k/crds/crd-kamelet-binding.yaml         |  23 +-
 helm/camel-k/crds/crd-pipe.yaml                    |  23 +-
 pkg/apis/camel/v1/build_types.go                   |  16 +-
 pkg/apis/camel/v1/trait/quarkus.go                 |  23 +-
 pkg/apis/camel/v1/zz_generated.deepcopy.go         |  20 +-
 pkg/builder/builder.go                             |  17 +-
 pkg/builder/image.go                               |   3 +-
 pkg/builder/spectrum.go                            |   2 +
 pkg/builder/tasks.go                               |  30 ++
 .../camel/applyconfiguration/camel/v1/task.go      |  27 +-
 .../camel/applyconfiguration/camel/v1/usertask.go  |  15 +-
 pkg/controller/build/build_pod.go                  |  13 +-
 pkg/controller/build/monitor_routine.go            |  33 +-
 pkg/resources/resources.go                         |  28 +-
 pkg/trait/builder.go                               |  70 ++-
 pkg/trait/builder_test.go                          |  91 +++-
 pkg/trait/quarkus.go                               |  67 +--
 pkg/trait/quarkus_test.go                          |   8 +-
 pkg/trait/util.go                                  |   9 +
 resources/traits.yaml                              |  21 +-
 33 files changed, 1566 insertions(+), 281 deletions(-)

diff --git a/config/crd/bases/camel.apache.org_builds.yaml b/config/crd/bases/camel.apache.org_builds.yaml
index 9efe73a2d..0ff027d69 100644
--- a/config/crd/bases/camel.apache.org_builds.yaml
+++ b/config/crd/bases/camel.apache.org_builds.yaml
@@ -189,8 +189,7 @@ spec:
                           type: boolean
                       type: object
                     builder:
-                      description: a BuilderTask, used to generate and package the
-                        project
+                      description: a BuilderTask, used to generate and build the project
                       properties:
                         baseImage:
                           description: the base image layer
@@ -688,12 +687,17 @@ spec:
                           type: array
                       type: object
                     custom:
-                      description: UserTask is used to execute any generic custom
-                        operation.
+                      description: User customizable task execution. These are executed
+                        after the build and before the package task.
                       properties:
                         command:
-                          description: the command to execute
+                          description: 'the command to execute Deprecated: use ContainerCommands'
                           type: string
+                        commands:
+                          description: the command to execute
+                          items:
+                            type: string
+                          type: array
                         image:
                           description: the container image to use
                           type: string
@@ -792,6 +796,505 @@ spec:
                           description: log more information
                           type: boolean
                       type: object
+                    package:
+                      description: Application pre publishing a PackageTask, used
+                        to package the project
+                      properties:
+                        baseImage:
+                          description: the base image layer
+                          type: string
+                        buildDir:
+                          description: workspace directory to use
+                          type: string
+                        configuration:
+                          description: The configuration that should be used to perform
+                            the Build.
+                          properties:
+                            limitCPU:
+                              description: The maximum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            limitMemory:
+                              description: The maximum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            operatorNamespace:
+                              description: The namespace where to run the builder
+                                Pod (must be the same of the operator in charge of
+                                this Build reconciliation).
+                              type: string
+                            orderStrategy:
+                              description: the build order strategy to adopt
+                              enum:
+                              - dependencies
+                              - fifo
+                              - sequential
+                              type: string
+                            requestCPU:
+                              description: The minimum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            requestMemory:
+                              description: The minimum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            strategy:
+                              description: the strategy to adopt
+                              enum:
+                              - routine
+                              - pod
+                              type: string
+                            toolImage:
+                              description: The container image to be used to run the
+                                build.
+                              type: string
+                          type: object
+                        dependencies:
+                          description: the list of dependencies to use for this build
+                          items:
+                            type: string
+                          type: array
+                        maven:
+                          description: the configuration required by Maven for the
+                            application build phase
+                          properties:
+                            caSecrets:
+                              description: The Secrets name and key, containing the
+                                CA certificate(s) used to connect to remote Maven
+                                repositories. It can contain X.509 certificates, and
+                                PKCS#7 formatted certificate chains. A JKS formatted
+                                keystore is automatically created to store the CA
+                                certificate(s), and configured to be used as a trusted
+                                certificate(s) by the Maven commands. Note that the
+                                root CA certificates are also imported into the created
+                                keystore.
+                              items:
+                                description: SecretKeySelector selects a key of a
+                                  Secret.
+                                properties:
+                                  key:
+                                    description: The key of the secret to select from.  Must
+                                      be a valid secret key.
+                                    type: string
+                                  name:
+                                    description: 'Name of the referent. More info:
+                                      https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                      TODO: Add other useful fields. apiVersion, kind,
+                                      uid?'
+                                    type: string
+                                  optional:
+                                    description: Specify whether the Secret or its
+                                      key must be defined
+                                    type: boolean
+                                required:
+                                - key
+                                type: object
+                              type: array
+                            cliOptions:
+                              description: The CLI options that are appended to the
+                                list of arguments for Maven commands, e.g., `-V,--no-transfer-progress,-Dstyle.color=never`.
+                                See https://maven.apache.org/ref/3.8.4/maven-embedder/cli.html.
+                              items:
+                                type: string
+                              type: array
+                            extension:
+                              description: The Maven build extensions. See https://maven.apache.org/guides/mini/guide-using-extensions.html.
+                              items:
+                                description: MavenArtifact defines a GAV (Group:Artifact:Version)
+                                  Maven artifact.
+                                properties:
+                                  artifactId:
+                                    description: Maven Artifact
+                                    type: string
+                                  groupId:
+                                    description: Maven Group
+                                    type: string
+                                  version:
+                                    description: Maven Version
+                                    type: string
+                                required:
+                                - artifactId
+                                - groupId
+                                type: object
+                              type: array
+                            localRepository:
+                              description: The path of the local Maven repository.
+                              type: string
+                            profiles:
+                              description: A reference to the ConfigMap or Secret
+                                key that contains the Maven profile.
+                              items:
+                                description: ValueSource --.
+                                properties:
+                                  configMapKeyRef:
+                                    description: Selects a key of a ConfigMap.
+                                    properties:
+                                      key:
+                                        description: The key to select.
+                                        type: string
+                                      name:
+                                        description: 'Name of the referent. More info:
+                                          https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                          TODO: Add other useful fields. apiVersion,
+                                          kind, uid?'
+                                        type: string
+                                      optional:
+                                        description: Specify whether the ConfigMap
+                                          or its key must be defined
+                                        type: boolean
+                                    required:
+                                    - key
+                                    type: object
+                                  secretKeyRef:
+                                    description: Selects a key of a secret.
+                                    properties:
+                                      key:
+                                        description: The key of the secret to select
+                                          from.  Must be a valid secret key.
+                                        type: string
+                                      name:
+                                        description: 'Name of the referent. More info:
+                                          https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                          TODO: Add other useful fields. apiVersion,
+                                          kind, uid?'
+                                        type: string
+                                      optional:
+                                        description: Specify whether the Secret or
+                                          its key must be defined
+                                        type: boolean
+                                    required:
+                                    - key
+                                    type: object
+                                type: object
+                              type: array
+                            properties:
+                              additionalProperties:
+                                type: string
+                              description: The Maven properties.
+                              type: object
+                            repositories:
+                              description: additional repositories
+                              items:
+                                description: Repository defines a Maven repository.
+                                properties:
+                                  id:
+                                    description: identifies the repository
+                                    type: string
+                                  name:
+                                    description: name of the repository
+                                    type: string
+                                  releases:
+                                    description: can use stable releases
+                                    properties:
+                                      checksumPolicy:
+                                        description: When Maven deploys files to the
+                                          repository, it also deploys corresponding
+                                          checksum files. Your options are to `ignore`,
+                                          `fail`, or `warn` on missing or incorrect
+                                          checksums.
+                                        type: string
+                                      enabled:
+                                        description: is the policy activated or not
+                                        type: boolean
+                                      updatePolicy:
+                                        description: 'This element specifies how often
+                                          updates should attempt to occur. Maven will
+                                          compare the local POM''s timestamp (stored
+                                          in a repository''s maven-metadata file)
+                                          to the remote. The choices are: `always`,
+                                          `daily` (default), `interval:X` (where X
+                                          is an integer in minutes) or `never`'
+                                        type: string
+                                    required:
+                                    - enabled
+                                    type: object
+                                  snapshots:
+                                    description: can use snapshot
+                                    properties:
+                                      checksumPolicy:
+                                        description: When Maven deploys files to the
+                                          repository, it also deploys corresponding
+                                          checksum files. Your options are to `ignore`,
+                                          `fail`, or `warn` on missing or incorrect
+                                          checksums.
+                                        type: string
+                                      enabled:
+                                        description: is the policy activated or not
+                                        type: boolean
+                                      updatePolicy:
+                                        description: 'This element specifies how often
+                                          updates should attempt to occur. Maven will
+                                          compare the local POM''s timestamp (stored
+                                          in a repository''s maven-metadata file)
+                                          to the remote. The choices are: `always`,
+                                          `daily` (default), `interval:X` (where X
+                                          is an integer in minutes) or `never`'
+                                        type: string
+                                    required:
+                                    - enabled
+                                    type: object
+                                  url:
+                                    description: location of the repository
+                                    type: string
+                                required:
+                                - id
+                                - url
+                                type: object
+                              type: array
+                            servers:
+                              description: Servers (auth)
+                              items:
+                                description: Server see link:https://maven.apache.org/settings.html[Maven
+                                  settings].
+                                properties:
+                                  configuration:
+                                    additionalProperties:
+                                      type: string
+                                    description: Properties -- .
+                                    type: object
+                                  id:
+                                    type: string
+                                  password:
+                                    type: string
+                                  username:
+                                    type: string
+                                type: object
+                              type: array
+                            settings:
+                              description: A reference to the ConfigMap or Secret
+                                key that contains the Maven settings.
+                              properties:
+                                configMapKeyRef:
+                                  description: Selects a key of a ConfigMap.
+                                  properties:
+                                    key:
+                                      description: The key to select.
+                                      type: string
+                                    name:
+                                      description: 'Name of the referent. More info:
+                                        https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                        TODO: Add other useful fields. apiVersion,
+                                        kind, uid?'
+                                      type: string
+                                    optional:
+                                      description: Specify whether the ConfigMap or
+                                        its key must be defined
+                                      type: boolean
+                                  required:
+                                  - key
+                                  type: object
+                                secretKeyRef:
+                                  description: Selects a key of a secret.
+                                  properties:
+                                    key:
+                                      description: The key of the secret to select
+                                        from.  Must be a valid secret key.
+                                      type: string
+                                    name:
+                                      description: 'Name of the referent. More info:
+                                        https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                        TODO: Add other useful fields. apiVersion,
+                                        kind, uid?'
+                                      type: string
+                                    optional:
+                                      description: Specify whether the Secret or its
+                                        key must be defined
+                                      type: boolean
+                                  required:
+                                  - key
+                                  type: object
+                              type: object
+                            settingsSecurity:
+                              description: A reference to the ConfigMap or Secret
+                                key that contains the security of the Maven settings.
+                              properties:
+                                configMapKeyRef:
+                                  description: Selects a key of a ConfigMap.
+                                  properties:
+                                    key:
+                                      description: The key to select.
+                                      type: string
+                                    name:
+                                      description: 'Name of the referent. More info:
+                                        https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                        TODO: Add other useful fields. apiVersion,
+                                        kind, uid?'
+                                      type: string
+                                    optional:
+                                      description: Specify whether the ConfigMap or
+                                        its key must be defined
+                                      type: boolean
+                                  required:
+                                  - key
+                                  type: object
+                                secretKeyRef:
+                                  description: Selects a key of a secret.
+                                  properties:
+                                    key:
+                                      description: The key of the secret to select
+                                        from.  Must be a valid secret key.
+                                      type: string
+                                    name:
+                                      description: 'Name of the referent. More info:
+                                        https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                        TODO: Add other useful fields. apiVersion,
+                                        kind, uid?'
+                                      type: string
+                                    optional:
+                                      description: Specify whether the Secret or its
+                                        key must be defined
+                                      type: boolean
+                                  required:
+                                  - key
+                                  type: object
+                              type: object
+                          type: object
+                        name:
+                          description: name of the task
+                          type: string
+                        runtime:
+                          description: the configuration required for the runtime
+                            application
+                          properties:
+                            applicationClass:
+                              description: application entry point (main) to be executed
+                              type: string
+                            capabilities:
+                              additionalProperties:
+                                description: Capability is a particular feature which
+                                  requires a well known set of dependencies which
+                                  are specified in the runtime catalog.
+                                properties:
+                                  dependencies:
+                                    items:
+                                      description: MavenArtifact defines a GAV (Group:Artifact:Version)
+                                        Maven artifact.
+                                      properties:
+                                        artifactId:
+                                          description: Maven Artifact
+                                          type: string
+                                        groupId:
+                                          description: Maven Group
+                                          type: string
+                                        version:
+                                          description: Maven Version
+                                          type: string
+                                      required:
+                                      - artifactId
+                                      - groupId
+                                      type: object
+                                    type: array
+                                required:
+                                - dependencies
+                                type: object
+                              description: features offered by this runtime
+                              type: object
+                            dependencies:
+                              description: list of dependencies needed to run the
+                                application
+                              items:
+                                description: MavenArtifact defines a GAV (Group:Artifact:Version)
+                                  Maven artifact.
+                                properties:
+                                  artifactId:
+                                    description: Maven Artifact
+                                    type: string
+                                  groupId:
+                                    description: Maven Group
+                                    type: string
+                                  version:
+                                    description: Maven Version
+                                    type: string
+                                required:
+                                - artifactId
+                                - groupId
+                                type: object
+                              type: array
+                            metadata:
+                              additionalProperties:
+                                type: string
+                              description: set of metadata
+                              type: object
+                            provider:
+                              description: Camel main application provider, ie, Camel
+                                Quarkus
+                              type: string
+                            version:
+                              description: Camel K Runtime version
+                              type: string
+                          required:
+                          - applicationClass
+                          - dependencies
+                          - provider
+                          - version
+                          type: object
+                        sources:
+                          description: the sources to add at build time
+                          items:
+                            description: SourceSpec defines the configuration for
+                              one or more routes to be executed in a certain Camel
+                              DSL language.
+                            properties:
+                              compression:
+                                description: if the content is compressed (base64
+                                  encrypted)
+                                type: boolean
+                              content:
+                                description: the source code (plain text)
+                                type: string
+                              contentKey:
+                                description: the confimap key holding the source content
+                                type: string
+                              contentRef:
+                                description: the confimap reference holding the source
+                                  content
+                                type: string
+                              contentType:
+                                description: the content type (tipically text or binary)
+                                type: string
+                              interceptors:
+                                description: Interceptors are optional identifiers
+                                  the org.apache.camel.k.RoutesLoader uses to pre/post
+                                  process sources
+                                items:
+                                  type: string
+                                type: array
+                              language:
+                                description: specify which is the language (Camel
+                                  DSL) used to interpret this source code
+                                type: string
+                              loader:
+                                description: Loader is an optional id of the org.apache.camel.k.RoutesLoader
+                                  that will interpret this source at runtime
+                                type: string
+                              name:
+                                description: the name of the specification
+                                type: string
+                              path:
+                                description: the path where the file is stored
+                                type: string
+                              property-names:
+                                description: List of property names defined in the
+                                  source (e.g. if type is "template")
+                                items:
+                                  type: string
+                                type: array
+                              rawContent:
+                                description: the source code (binary)
+                                format: byte
+                                type: string
+                              type:
+                                description: Type defines the kind of source described
+                                  by this object
+                                type: string
+                            type: object
+                          type: array
+                        steps:
+                          description: the list of steps to execute (see pkg/builder/)
+                          items:
+                            type: string
+                          type: array
+                      type: object
                     s2i:
                       description: a S2iTask, for S2I strategy
                       properties:
diff --git a/config/crd/bases/camel.apache.org_integrationkits.yaml b/config/crd/bases/camel.apache.org_integrationkits.yaml
index f70954ab5..ea68807a3 100644
--- a/config/crd/bases/camel.apache.org_integrationkits.yaml
+++ b/config/crd/bases/camel.apache.org_integrationkits.yaml
@@ -300,19 +300,21 @@ spec:
                           traits share this common property.
                         type: boolean
                       packageTypes:
-                        description: The Quarkus package types, either `fast-jar`
-                          or `native` (default `fast-jar`). In case both `fast-jar`
-                          and `native` are specified, two `IntegrationKit` resources
-                          are created, with the `native` kit having precedence over
-                          the `fast-jar` one once ready. The order influences the
-                          resolution of the current kit for the integration. The kit
-                          corresponding to the first package type will be assigned
-                          to the integration in case no existing kit that matches
-                          the integration exists.
+                        description: The Quarkus package types, `fast-jar`, `native-sources`
+                          or `native` (default `fast-jar`). `native` is deprecated.
+                          In case both `fast-jar` and `native` or `native-sources`
+                          are specified, two `IntegrationKit` resources are created,
+                          with the native kit having precedence over the `fast-jar`
+                          one once ready. The order influences the resolution of the
+                          current kit for the integration. The kit corresponding to
+                          the first package type will be assigned to the integration
+                          in case no existing kit that matches the integration exists.
                         items:
-                          description: Quarkus package type.
+                          description: QuarkusPackageType is the type of Quarkus build
+                            packaging.
                           enum:
                           - fast-jar
+                          - native-sources
                           - native
                           type: string
                         type: array
diff --git a/config/crd/bases/camel.apache.org_integrationplatforms.yaml b/config/crd/bases/camel.apache.org_integrationplatforms.yaml
index f65b8207a..a37e7c91d 100644
--- a/config/crd/bases/camel.apache.org_integrationplatforms.yaml
+++ b/config/crd/bases/camel.apache.org_integrationplatforms.yaml
@@ -1589,19 +1589,21 @@ spec:
                           traits share this common property.
                         type: boolean
                       packageTypes:
-                        description: The Quarkus package types, either `fast-jar`
-                          or `native` (default `fast-jar`). In case both `fast-jar`
-                          and `native` are specified, two `IntegrationKit` resources
-                          are created, with the `native` kit having precedence over
-                          the `fast-jar` one once ready. The order influences the
-                          resolution of the current kit for the integration. The kit
-                          corresponding to the first package type will be assigned
-                          to the integration in case no existing kit that matches
-                          the integration exists.
+                        description: The Quarkus package types, `fast-jar`, `native-sources`
+                          or `native` (default `fast-jar`). `native` is deprecated.
+                          In case both `fast-jar` and `native` or `native-sources`
+                          are specified, two `IntegrationKit` resources are created,
+                          with the native kit having precedence over the `fast-jar`
+                          one once ready. The order influences the resolution of the
+                          current kit for the integration. The kit corresponding to
+                          the first package type will be assigned to the integration
+                          in case no existing kit that matches the integration exists.
                         items:
-                          description: Quarkus package type.
+                          description: QuarkusPackageType is the type of Quarkus build
+                            packaging.
                           enum:
                           - fast-jar
+                          - native-sources
                           - native
                           type: string
                         type: array
@@ -3361,19 +3363,21 @@ spec:
                           traits share this common property.
                         type: boolean
                       packageTypes:
-                        description: The Quarkus package types, either `fast-jar`
-                          or `native` (default `fast-jar`). In case both `fast-jar`
-                          and `native` are specified, two `IntegrationKit` resources
-                          are created, with the `native` kit having precedence over
-                          the `fast-jar` one once ready. The order influences the
-                          resolution of the current kit for the integration. The kit
-                          corresponding to the first package type will be assigned
-                          to the integration in case no existing kit that matches
-                          the integration exists.
+                        description: The Quarkus package types, `fast-jar`, `native-sources`
+                          or `native` (default `fast-jar`). `native` is deprecated.
+                          In case both `fast-jar` and `native` or `native-sources`
+                          are specified, two `IntegrationKit` resources are created,
+                          with the native kit having precedence over the `fast-jar`
+                          one once ready. The order influences the resolution of the
+                          current kit for the integration. The kit corresponding to
+                          the first package type will be assigned to the integration
+                          in case no existing kit that matches the integration exists.
                         items:
-                          description: Quarkus package type.
+                          description: QuarkusPackageType is the type of Quarkus build
+                            packaging.
                           enum:
                           - fast-jar
+                          - native-sources
                           - native
                           type: string
                         type: array
diff --git a/config/crd/bases/camel.apache.org_integrations.yaml b/config/crd/bases/camel.apache.org_integrations.yaml
index 7a41808ee..042186be4 100644
--- a/config/crd/bases/camel.apache.org_integrations.yaml
+++ b/config/crd/bases/camel.apache.org_integrations.yaml
@@ -7506,19 +7506,21 @@ spec:
                           traits share this common property.
                         type: boolean
                       packageTypes:
-                        description: The Quarkus package types, either `fast-jar`
-                          or `native` (default `fast-jar`). In case both `fast-jar`
-                          and `native` are specified, two `IntegrationKit` resources
-                          are created, with the `native` kit having precedence over
-                          the `fast-jar` one once ready. The order influences the
-                          resolution of the current kit for the integration. The kit
-                          corresponding to the first package type will be assigned
-                          to the integration in case no existing kit that matches
-                          the integration exists.
+                        description: The Quarkus package types, `fast-jar`, `native-sources`
+                          or `native` (default `fast-jar`). `native` is deprecated.
+                          In case both `fast-jar` and `native` or `native-sources`
+                          are specified, two `IntegrationKit` resources are created,
+                          with the native kit having precedence over the `fast-jar`
+                          one once ready. The order influences the resolution of the
+                          current kit for the integration. The kit corresponding to
+                          the first package type will be assigned to the integration
+                          in case no existing kit that matches the integration exists.
                         items:
-                          description: Quarkus package type.
+                          description: QuarkusPackageType is the type of Quarkus build
+                            packaging.
                           enum:
                           - fast-jar
+                          - native-sources
                           - native
                           type: string
                         type: array
diff --git a/config/crd/bases/camel.apache.org_kameletbindings.yaml b/config/crd/bases/camel.apache.org_kameletbindings.yaml
index d3c4b9a6f..1181e466b 100644
--- a/config/crd/bases/camel.apache.org_kameletbindings.yaml
+++ b/config/crd/bases/camel.apache.org_kameletbindings.yaml
@@ -7801,19 +7801,22 @@ spec:
                               All traits share this common property.
                             type: boolean
                           packageTypes:
-                            description: The Quarkus package types, either `fast-jar`
-                              or `native` (default `fast-jar`). In case both `fast-jar`
-                              and `native` are specified, two `IntegrationKit` resources
-                              are created, with the `native` kit having precedence
-                              over the `fast-jar` one once ready. The order influences
-                              the resolution of the current kit for the integration.
-                              The kit corresponding to the first package type will
-                              be assigned to the integration in case no existing kit
-                              that matches the integration exists.
+                            description: The Quarkus package types, `fast-jar`, `native-sources`
+                              or `native` (default `fast-jar`). `native` is deprecated.
+                              In case both `fast-jar` and `native` or `native-sources`
+                              are specified, two `IntegrationKit` resources are created,
+                              with the native kit having precedence over the `fast-jar`
+                              one once ready. The order influences the resolution
+                              of the current kit for the integration. The kit corresponding
+                              to the first package type will be assigned to the integration
+                              in case no existing kit that matches the integration
+                              exists.
                             items:
-                              description: Quarkus package type.
+                              description: QuarkusPackageType is the type of Quarkus
+                                build packaging.
                               enum:
                               - fast-jar
+                              - native-sources
                               - native
                               type: string
                             type: array
diff --git a/config/crd/bases/camel.apache.org_pipes.yaml b/config/crd/bases/camel.apache.org_pipes.yaml
index 33fb3e7d1..d6b5e1269 100644
--- a/config/crd/bases/camel.apache.org_pipes.yaml
+++ b/config/crd/bases/camel.apache.org_pipes.yaml
@@ -7798,19 +7798,22 @@ spec:
                               All traits share this common property.
                             type: boolean
                           packageTypes:
-                            description: The Quarkus package types, either `fast-jar`
-                              or `native` (default `fast-jar`). In case both `fast-jar`
-                              and `native` are specified, two `IntegrationKit` resources
-                              are created, with the `native` kit having precedence
-                              over the `fast-jar` one once ready. The order influences
-                              the resolution of the current kit for the integration.
-                              The kit corresponding to the first package type will
-                              be assigned to the integration in case no existing kit
-                              that matches the integration exists.
+                            description: The Quarkus package types, `fast-jar`, `native-sources`
+                              or `native` (default `fast-jar`). `native` is deprecated.
+                              In case both `fast-jar` and `native` or `native-sources`
+                              are specified, two `IntegrationKit` resources are created,
+                              with the native kit having precedence over the `fast-jar`
+                              one once ready. The order influences the resolution
+                              of the current kit for the integration. The kit corresponding
+                              to the first package type will be assigned to the integration
+                              in case no existing kit that matches the integration
+                              exists.
                             items:
-                              description: Quarkus package type.
+                              description: QuarkusPackageType is the type of Quarkus
+                                build packaging.
                               enum:
                               - fast-jar
+                              - native-sources
                               - native
                               type: string
                             type: array
diff --git a/docs/modules/ROOT/pages/installation/advanced/build-config.adoc b/docs/modules/ROOT/pages/installation/advanced/build-config.adoc
index 0a16301fa..6c6b6d4a6 100644
--- a/docs/modules/ROOT/pages/installation/advanced/build-config.adoc
+++ b/docs/modules/ROOT/pages/installation/advanced/build-config.adoc
@@ -15,7 +15,7 @@ NOTE: the `pod` strategy was also required when using the now deprecated Buildah
 
 Beside the build strategy, there are other configuration you can fine tune for each single build (via builder trait) or in the `.spec.build.buildConfiguration` of the IntegrationPlatform if you want to apply such configuration to all your builds. See the Builder trait page for more information.
 
-The most relevant are the `resource` and `limit` parameters which can be used to control how much resources to give to builder Pods. Then you can configure the `orderStrategy`, setting a `sequential` (single build), `fifo` (parallel build started in FIFO order) or `dependencies` (parallel build holding those applications which may depends on other because of ** xref:architecture/incremental-image.adoc[incremental image]). Finally you can include any `mavenProfile` to the build in order t [...]
+The most relevant are the `resource` and `limit` parameters which can be used to control how much resources to give to builder Pods. Then you can configure the `orderStrategy`, setting a `sequential` (single build), `fifo` (parallel build started in FIFO order) or `dependencies` (parallel build holding those applications which may depends on other because of xref:architecture/incremental-image.adoc[incremental image]). Finally you can include any `mavenProfile` to the build in order to i [...]
 
 [[publish-strategy]]
 == Publish strategy
diff --git a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
index cfc0f06b2..3afd80dd3 100644
--- a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
+++ b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
@@ -5152,7 +5152,22 @@ Task represents the abstract task. Only one of the task should be configured to
 |
 
 
-a BuilderTask, used to generate and package the project
+a BuilderTask, used to generate and build the project
+
+|`custom` +
+*xref:#_camel_apache_org_v1_UserTask[UserTask]*
+|
+
+
+User customizable task execution. These are executed after the build and before the package task.
+
+|`package` +
+*xref:#_camel_apache_org_v1_BuilderTask[BuilderTask]*
+|
+
+
+Application pre publishing
+a PackageTask, used to package the project
 
 |`buildah` +
 *xref:#_camel_apache_org_v1_BuildahTask[BuildahTask]*
@@ -5191,13 +5206,6 @@ a S2iTask, for S2I strategy
 
 a JibTask, for Jib strategy
 
-|`custom` +
-*xref:#_camel_apache_org_v1_UserTask[UserTask]*
-|
-
-
-
-
 
 |===
 
@@ -5625,6 +5633,14 @@ string
 |
 
 
+the command to execute
+Deprecated: use ContainerCommands
+
+|`commands` +
+[]string
+|
+
+
 the command to execute
 
 
@@ -7537,7 +7553,7 @@ Automatically configures the platform registry secret on the pod if it is of typ
 
 * <<#_camel_apache_org_v1_trait_QuarkusTrait, QuarkusTrait>>
 
-Quarkus package type.
+QuarkusPackageType is the type of Quarkus build packaging.
 
 
 [#_camel_apache_org_v1_trait_QuarkusTrait]
@@ -7552,9 +7568,9 @@ The Quarkus trait configures the Quarkus runtime.
 
 It's enabled by default.
 
-NOTE: Compiling to a native executable, i.e. when using `package-type=native`, requires at least
-4GiB of memory, so the Pod running the native build, that is either the operator Pod, or the build
-Pod (depending on the build strategy configured for the platform), must have enough memory available.
+NOTE: A native based compilation will be forced to use a `pod` build strategy.
+Compiling to a native executable, i.e. when using `package-type=native`, requires at least
+4GiB of memory, so the Pod running the native build, must have enough memory available.
 
 
 [cols="2,2a",options="header"]
@@ -7574,9 +7590,9 @@ Pod (depending on the build strategy configured for the platform), must have eno
 |
 
 
-The Quarkus package types, either `fast-jar` or `native` (default `fast-jar`).
-In case both `fast-jar` and `native` are specified, two `IntegrationKit` resources are created,
-with the `native` kit having precedence over the `fast-jar` one once ready.
+The Quarkus package types, `fast-jar`, `native-sources` or `native` (default `fast-jar`). `native` is deprecated.
+In case both `fast-jar` and `native` or `native-sources` are specified, two `IntegrationKit` resources are created,
+with the native kit having precedence over the `fast-jar` one once ready.
 The order influences the resolution of the current kit for the integration.
 The kit corresponding to the first package type will be assigned to the
 integration in case no existing kit that matches the integration exists.
diff --git a/docs/modules/traits/pages/quarkus.adoc b/docs/modules/traits/pages/quarkus.adoc
index b03444c8b..f5014394f 100755
--- a/docs/modules/traits/pages/quarkus.adoc
+++ b/docs/modules/traits/pages/quarkus.adoc
@@ -5,9 +5,9 @@ The Quarkus trait configures the Quarkus runtime.
 
 It's enabled by default.
 
-NOTE: Compiling to a native executable, i.e. when using `package-type=native`, requires at least
-4GiB of memory, so the Pod running the native build, that is either the operator Pod, or the build
-Pod (depending on the build strategy configured for the platform), must have enough memory available.
+NOTE: A native based compilation will be forced to use a `pod` build strategy.
+Compiling to a native executable, i.e. when using `package-type=native`, requires at least
+4GiB of memory, so the Pod running the native build, must have enough memory available.
 
 
 This trait is available in the following profiles: **Kubernetes, Knative, OpenShift**.
@@ -35,9 +35,9 @@ The following configuration options are available:
 
 | quarkus.package-type
 | []github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait.QuarkusPackageType
-| The Quarkus package types, either `fast-jar` or `native` (default `fast-jar`).
-In case both `fast-jar` and `native` are specified, two `IntegrationKit` resources are created,
-with the `native` kit having precedence over the `fast-jar` one once ready.
+| The Quarkus package types, `fast-jar`, `native-sources` or `native` (default `fast-jar`). `native` is deprecated.
+In case both `fast-jar` and `native` or `native-sources` are specified, two `IntegrationKit` resources are created,
+with the native kit having precedence over the `fast-jar` one once ready.
 The order influences the resolution of the current kit for the integration.
 The kit corresponding to the first package type will be assigned to the
 integration in case no existing kit that matches the integration exists.
diff --git a/helm/camel-k/crds/crd-build.yaml b/helm/camel-k/crds/crd-build.yaml
index 9efe73a2d..0ff027d69 100644
--- a/helm/camel-k/crds/crd-build.yaml
+++ b/helm/camel-k/crds/crd-build.yaml
@@ -189,8 +189,7 @@ spec:
                           type: boolean
                       type: object
                     builder:
-                      description: a BuilderTask, used to generate and package the
-                        project
+                      description: a BuilderTask, used to generate and build the project
                       properties:
                         baseImage:
                           description: the base image layer
@@ -688,12 +687,17 @@ spec:
                           type: array
                       type: object
                     custom:
-                      description: UserTask is used to execute any generic custom
-                        operation.
+                      description: User customizable task execution. These are executed
+                        after the build and before the package task.
                       properties:
                         command:
-                          description: the command to execute
+                          description: 'the command to execute Deprecated: use ContainerCommands'
                           type: string
+                        commands:
+                          description: the command to execute
+                          items:
+                            type: string
+                          type: array
                         image:
                           description: the container image to use
                           type: string
@@ -792,6 +796,505 @@ spec:
                           description: log more information
                           type: boolean
                       type: object
+                    package:
+                      description: Application pre publishing a PackageTask, used
+                        to package the project
+                      properties:
+                        baseImage:
+                          description: the base image layer
+                          type: string
+                        buildDir:
+                          description: workspace directory to use
+                          type: string
+                        configuration:
+                          description: The configuration that should be used to perform
+                            the Build.
+                          properties:
+                            limitCPU:
+                              description: The maximum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            limitMemory:
+                              description: The maximum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            operatorNamespace:
+                              description: The namespace where to run the builder
+                                Pod (must be the same of the operator in charge of
+                                this Build reconciliation).
+                              type: string
+                            orderStrategy:
+                              description: the build order strategy to adopt
+                              enum:
+                              - dependencies
+                              - fifo
+                              - sequential
+                              type: string
+                            requestCPU:
+                              description: The minimum amount of CPU required. Only
+                                used for `pod` strategy
+                              type: string
+                            requestMemory:
+                              description: The minimum amount of memory required.
+                                Only used for `pod` strategy
+                              type: string
+                            strategy:
+                              description: the strategy to adopt
+                              enum:
+                              - routine
+                              - pod
+                              type: string
+                            toolImage:
+                              description: The container image to be used to run the
+                                build.
+                              type: string
+                          type: object
+                        dependencies:
+                          description: the list of dependencies to use for this build
+                          items:
+                            type: string
+                          type: array
+                        maven:
+                          description: the configuration required by Maven for the
+                            application build phase
+                          properties:
+                            caSecrets:
+                              description: The Secrets name and key, containing the
+                                CA certificate(s) used to connect to remote Maven
+                                repositories. It can contain X.509 certificates, and
+                                PKCS#7 formatted certificate chains. A JKS formatted
+                                keystore is automatically created to store the CA
+                                certificate(s), and configured to be used as a trusted
+                                certificate(s) by the Maven commands. Note that the
+                                root CA certificates are also imported into the created
+                                keystore.
+                              items:
+                                description: SecretKeySelector selects a key of a
+                                  Secret.
+                                properties:
+                                  key:
+                                    description: The key of the secret to select from.  Must
+                                      be a valid secret key.
+                                    type: string
+                                  name:
+                                    description: 'Name of the referent. More info:
+                                      https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                      TODO: Add other useful fields. apiVersion, kind,
+                                      uid?'
+                                    type: string
+                                  optional:
+                                    description: Specify whether the Secret or its
+                                      key must be defined
+                                    type: boolean
+                                required:
+                                - key
+                                type: object
+                              type: array
+                            cliOptions:
+                              description: The CLI options that are appended to the
+                                list of arguments for Maven commands, e.g., `-V,--no-transfer-progress,-Dstyle.color=never`.
+                                See https://maven.apache.org/ref/3.8.4/maven-embedder/cli.html.
+                              items:
+                                type: string
+                              type: array
+                            extension:
+                              description: The Maven build extensions. See https://maven.apache.org/guides/mini/guide-using-extensions.html.
+                              items:
+                                description: MavenArtifact defines a GAV (Group:Artifact:Version)
+                                  Maven artifact.
+                                properties:
+                                  artifactId:
+                                    description: Maven Artifact
+                                    type: string
+                                  groupId:
+                                    description: Maven Group
+                                    type: string
+                                  version:
+                                    description: Maven Version
+                                    type: string
+                                required:
+                                - artifactId
+                                - groupId
+                                type: object
+                              type: array
+                            localRepository:
+                              description: The path of the local Maven repository.
+                              type: string
+                            profiles:
+                              description: A reference to the ConfigMap or Secret
+                                key that contains the Maven profile.
+                              items:
+                                description: ValueSource --.
+                                properties:
+                                  configMapKeyRef:
+                                    description: Selects a key of a ConfigMap.
+                                    properties:
+                                      key:
+                                        description: The key to select.
+                                        type: string
+                                      name:
+                                        description: 'Name of the referent. More info:
+                                          https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                          TODO: Add other useful fields. apiVersion,
+                                          kind, uid?'
+                                        type: string
+                                      optional:
+                                        description: Specify whether the ConfigMap
+                                          or its key must be defined
+                                        type: boolean
+                                    required:
+                                    - key
+                                    type: object
+                                  secretKeyRef:
+                                    description: Selects a key of a secret.
+                                    properties:
+                                      key:
+                                        description: The key of the secret to select
+                                          from.  Must be a valid secret key.
+                                        type: string
+                                      name:
+                                        description: 'Name of the referent. More info:
+                                          https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                          TODO: Add other useful fields. apiVersion,
+                                          kind, uid?'
+                                        type: string
+                                      optional:
+                                        description: Specify whether the Secret or
+                                          its key must be defined
+                                        type: boolean
+                                    required:
+                                    - key
+                                    type: object
+                                type: object
+                              type: array
+                            properties:
+                              additionalProperties:
+                                type: string
+                              description: The Maven properties.
+                              type: object
+                            repositories:
+                              description: additional repositories
+                              items:
+                                description: Repository defines a Maven repository.
+                                properties:
+                                  id:
+                                    description: identifies the repository
+                                    type: string
+                                  name:
+                                    description: name of the repository
+                                    type: string
+                                  releases:
+                                    description: can use stable releases
+                                    properties:
+                                      checksumPolicy:
+                                        description: When Maven deploys files to the
+                                          repository, it also deploys corresponding
+                                          checksum files. Your options are to `ignore`,
+                                          `fail`, or `warn` on missing or incorrect
+                                          checksums.
+                                        type: string
+                                      enabled:
+                                        description: is the policy activated or not
+                                        type: boolean
+                                      updatePolicy:
+                                        description: 'This element specifies how often
+                                          updates should attempt to occur. Maven will
+                                          compare the local POM''s timestamp (stored
+                                          in a repository''s maven-metadata file)
+                                          to the remote. The choices are: `always`,
+                                          `daily` (default), `interval:X` (where X
+                                          is an integer in minutes) or `never`'
+                                        type: string
+                                    required:
+                                    - enabled
+                                    type: object
+                                  snapshots:
+                                    description: can use snapshot
+                                    properties:
+                                      checksumPolicy:
+                                        description: When Maven deploys files to the
+                                          repository, it also deploys corresponding
+                                          checksum files. Your options are to `ignore`,
+                                          `fail`, or `warn` on missing or incorrect
+                                          checksums.
+                                        type: string
+                                      enabled:
+                                        description: is the policy activated or not
+                                        type: boolean
+                                      updatePolicy:
+                                        description: 'This element specifies how often
+                                          updates should attempt to occur. Maven will
+                                          compare the local POM''s timestamp (stored
+                                          in a repository''s maven-metadata file)
+                                          to the remote. The choices are: `always`,
+                                          `daily` (default), `interval:X` (where X
+                                          is an integer in minutes) or `never`'
+                                        type: string
+                                    required:
+                                    - enabled
+                                    type: object
+                                  url:
+                                    description: location of the repository
+                                    type: string
+                                required:
+                                - id
+                                - url
+                                type: object
+                              type: array
+                            servers:
+                              description: Servers (auth)
+                              items:
+                                description: Server see link:https://maven.apache.org/settings.html[Maven
+                                  settings].
+                                properties:
+                                  configuration:
+                                    additionalProperties:
+                                      type: string
+                                    description: Properties -- .
+                                    type: object
+                                  id:
+                                    type: string
+                                  password:
+                                    type: string
+                                  username:
+                                    type: string
+                                type: object
+                              type: array
+                            settings:
+                              description: A reference to the ConfigMap or Secret
+                                key that contains the Maven settings.
+                              properties:
+                                configMapKeyRef:
+                                  description: Selects a key of a ConfigMap.
+                                  properties:
+                                    key:
+                                      description: The key to select.
+                                      type: string
+                                    name:
+                                      description: 'Name of the referent. More info:
+                                        https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                        TODO: Add other useful fields. apiVersion,
+                                        kind, uid?'
+                                      type: string
+                                    optional:
+                                      description: Specify whether the ConfigMap or
+                                        its key must be defined
+                                      type: boolean
+                                  required:
+                                  - key
+                                  type: object
+                                secretKeyRef:
+                                  description: Selects a key of a secret.
+                                  properties:
+                                    key:
+                                      description: The key of the secret to select
+                                        from.  Must be a valid secret key.
+                                      type: string
+                                    name:
+                                      description: 'Name of the referent. More info:
+                                        https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                        TODO: Add other useful fields. apiVersion,
+                                        kind, uid?'
+                                      type: string
+                                    optional:
+                                      description: Specify whether the Secret or its
+                                        key must be defined
+                                      type: boolean
+                                  required:
+                                  - key
+                                  type: object
+                              type: object
+                            settingsSecurity:
+                              description: A reference to the ConfigMap or Secret
+                                key that contains the security of the Maven settings.
+                              properties:
+                                configMapKeyRef:
+                                  description: Selects a key of a ConfigMap.
+                                  properties:
+                                    key:
+                                      description: The key to select.
+                                      type: string
+                                    name:
+                                      description: 'Name of the referent. More info:
+                                        https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                        TODO: Add other useful fields. apiVersion,
+                                        kind, uid?'
+                                      type: string
+                                    optional:
+                                      description: Specify whether the ConfigMap or
+                                        its key must be defined
+                                      type: boolean
+                                  required:
+                                  - key
+                                  type: object
+                                secretKeyRef:
+                                  description: Selects a key of a secret.
+                                  properties:
+                                    key:
+                                      description: The key of the secret to select
+                                        from.  Must be a valid secret key.
+                                      type: string
+                                    name:
+                                      description: 'Name of the referent. More info:
+                                        https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
+                                        TODO: Add other useful fields. apiVersion,
+                                        kind, uid?'
+                                      type: string
+                                    optional:
+                                      description: Specify whether the Secret or its
+                                        key must be defined
+                                      type: boolean
+                                  required:
+                                  - key
+                                  type: object
+                              type: object
+                          type: object
+                        name:
+                          description: name of the task
+                          type: string
+                        runtime:
+                          description: the configuration required for the runtime
+                            application
+                          properties:
+                            applicationClass:
+                              description: application entry point (main) to be executed
+                              type: string
+                            capabilities:
+                              additionalProperties:
+                                description: Capability is a particular feature which
+                                  requires a well known set of dependencies which
+                                  are specified in the runtime catalog.
+                                properties:
+                                  dependencies:
+                                    items:
+                                      description: MavenArtifact defines a GAV (Group:Artifact:Version)
+                                        Maven artifact.
+                                      properties:
+                                        artifactId:
+                                          description: Maven Artifact
+                                          type: string
+                                        groupId:
+                                          description: Maven Group
+                                          type: string
+                                        version:
+                                          description: Maven Version
+                                          type: string
+                                      required:
+                                      - artifactId
+                                      - groupId
+                                      type: object
+                                    type: array
+                                required:
+                                - dependencies
+                                type: object
+                              description: features offered by this runtime
+                              type: object
+                            dependencies:
+                              description: list of dependencies needed to run the
+                                application
+                              items:
+                                description: MavenArtifact defines a GAV (Group:Artifact:Version)
+                                  Maven artifact.
+                                properties:
+                                  artifactId:
+                                    description: Maven Artifact
+                                    type: string
+                                  groupId:
+                                    description: Maven Group
+                                    type: string
+                                  version:
+                                    description: Maven Version
+                                    type: string
+                                required:
+                                - artifactId
+                                - groupId
+                                type: object
+                              type: array
+                            metadata:
+                              additionalProperties:
+                                type: string
+                              description: set of metadata
+                              type: object
+                            provider:
+                              description: Camel main application provider, ie, Camel
+                                Quarkus
+                              type: string
+                            version:
+                              description: Camel K Runtime version
+                              type: string
+                          required:
+                          - applicationClass
+                          - dependencies
+                          - provider
+                          - version
+                          type: object
+                        sources:
+                          description: the sources to add at build time
+                          items:
+                            description: SourceSpec defines the configuration for
+                              one or more routes to be executed in a certain Camel
+                              DSL language.
+                            properties:
+                              compression:
+                                description: if the content is compressed (base64
+                                  encrypted)
+                                type: boolean
+                              content:
+                                description: the source code (plain text)
+                                type: string
+                              contentKey:
+                                description: the confimap key holding the source content
+                                type: string
+                              contentRef:
+                                description: the confimap reference holding the source
+                                  content
+                                type: string
+                              contentType:
+                                description: the content type (tipically text or binary)
+                                type: string
+                              interceptors:
+                                description: Interceptors are optional identifiers
+                                  the org.apache.camel.k.RoutesLoader uses to pre/post
+                                  process sources
+                                items:
+                                  type: string
+                                type: array
+                              language:
+                                description: specify which is the language (Camel
+                                  DSL) used to interpret this source code
+                                type: string
+                              loader:
+                                description: Loader is an optional id of the org.apache.camel.k.RoutesLoader
+                                  that will interpret this source at runtime
+                                type: string
+                              name:
+                                description: the name of the specification
+                                type: string
+                              path:
+                                description: the path where the file is stored
+                                type: string
+                              property-names:
+                                description: List of property names defined in the
+                                  source (e.g. if type is "template")
+                                items:
+                                  type: string
+                                type: array
+                              rawContent:
+                                description: the source code (binary)
+                                format: byte
+                                type: string
+                              type:
+                                description: Type defines the kind of source described
+                                  by this object
+                                type: string
+                            type: object
+                          type: array
+                        steps:
+                          description: the list of steps to execute (see pkg/builder/)
+                          items:
+                            type: string
+                          type: array
+                      type: object
                     s2i:
                       description: a S2iTask, for S2I strategy
                       properties:
diff --git a/helm/camel-k/crds/crd-integration-kit.yaml b/helm/camel-k/crds/crd-integration-kit.yaml
index f70954ab5..ea68807a3 100644
--- a/helm/camel-k/crds/crd-integration-kit.yaml
+++ b/helm/camel-k/crds/crd-integration-kit.yaml
@@ -300,19 +300,21 @@ spec:
                           traits share this common property.
                         type: boolean
                       packageTypes:
-                        description: The Quarkus package types, either `fast-jar`
-                          or `native` (default `fast-jar`). In case both `fast-jar`
-                          and `native` are specified, two `IntegrationKit` resources
-                          are created, with the `native` kit having precedence over
-                          the `fast-jar` one once ready. The order influences the
-                          resolution of the current kit for the integration. The kit
-                          corresponding to the first package type will be assigned
-                          to the integration in case no existing kit that matches
-                          the integration exists.
+                        description: The Quarkus package types, `fast-jar`, `native-sources`
+                          or `native` (default `fast-jar`). `native` is deprecated.
+                          In case both `fast-jar` and `native` or `native-sources`
+                          are specified, two `IntegrationKit` resources are created,
+                          with the native kit having precedence over the `fast-jar`
+                          one once ready. The order influences the resolution of the
+                          current kit for the integration. The kit corresponding to
+                          the first package type will be assigned to the integration
+                          in case no existing kit that matches the integration exists.
                         items:
-                          description: Quarkus package type.
+                          description: QuarkusPackageType is the type of Quarkus build
+                            packaging.
                           enum:
                           - fast-jar
+                          - native-sources
                           - native
                           type: string
                         type: array
diff --git a/helm/camel-k/crds/crd-integration-platform.yaml b/helm/camel-k/crds/crd-integration-platform.yaml
index f65b8207a..a37e7c91d 100644
--- a/helm/camel-k/crds/crd-integration-platform.yaml
+++ b/helm/camel-k/crds/crd-integration-platform.yaml
@@ -1589,19 +1589,21 @@ spec:
                           traits share this common property.
                         type: boolean
                       packageTypes:
-                        description: The Quarkus package types, either `fast-jar`
-                          or `native` (default `fast-jar`). In case both `fast-jar`
-                          and `native` are specified, two `IntegrationKit` resources
-                          are created, with the `native` kit having precedence over
-                          the `fast-jar` one once ready. The order influences the
-                          resolution of the current kit for the integration. The kit
-                          corresponding to the first package type will be assigned
-                          to the integration in case no existing kit that matches
-                          the integration exists.
+                        description: The Quarkus package types, `fast-jar`, `native-sources`
+                          or `native` (default `fast-jar`). `native` is deprecated.
+                          In case both `fast-jar` and `native` or `native-sources`
+                          are specified, two `IntegrationKit` resources are created,
+                          with the native kit having precedence over the `fast-jar`
+                          one once ready. The order influences the resolution of the
+                          current kit for the integration. The kit corresponding to
+                          the first package type will be assigned to the integration
+                          in case no existing kit that matches the integration exists.
                         items:
-                          description: Quarkus package type.
+                          description: QuarkusPackageType is the type of Quarkus build
+                            packaging.
                           enum:
                           - fast-jar
+                          - native-sources
                           - native
                           type: string
                         type: array
@@ -3361,19 +3363,21 @@ spec:
                           traits share this common property.
                         type: boolean
                       packageTypes:
-                        description: The Quarkus package types, either `fast-jar`
-                          or `native` (default `fast-jar`). In case both `fast-jar`
-                          and `native` are specified, two `IntegrationKit` resources
-                          are created, with the `native` kit having precedence over
-                          the `fast-jar` one once ready. The order influences the
-                          resolution of the current kit for the integration. The kit
-                          corresponding to the first package type will be assigned
-                          to the integration in case no existing kit that matches
-                          the integration exists.
+                        description: The Quarkus package types, `fast-jar`, `native-sources`
+                          or `native` (default `fast-jar`). `native` is deprecated.
+                          In case both `fast-jar` and `native` or `native-sources`
+                          are specified, two `IntegrationKit` resources are created,
+                          with the native kit having precedence over the `fast-jar`
+                          one once ready. The order influences the resolution of the
+                          current kit for the integration. The kit corresponding to
+                          the first package type will be assigned to the integration
+                          in case no existing kit that matches the integration exists.
                         items:
-                          description: Quarkus package type.
+                          description: QuarkusPackageType is the type of Quarkus build
+                            packaging.
                           enum:
                           - fast-jar
+                          - native-sources
                           - native
                           type: string
                         type: array
diff --git a/helm/camel-k/crds/crd-integration.yaml b/helm/camel-k/crds/crd-integration.yaml
index 7a41808ee..042186be4 100644
--- a/helm/camel-k/crds/crd-integration.yaml
+++ b/helm/camel-k/crds/crd-integration.yaml
@@ -7506,19 +7506,21 @@ spec:
                           traits share this common property.
                         type: boolean
                       packageTypes:
-                        description: The Quarkus package types, either `fast-jar`
-                          or `native` (default `fast-jar`). In case both `fast-jar`
-                          and `native` are specified, two `IntegrationKit` resources
-                          are created, with the `native` kit having precedence over
-                          the `fast-jar` one once ready. The order influences the
-                          resolution of the current kit for the integration. The kit
-                          corresponding to the first package type will be assigned
-                          to the integration in case no existing kit that matches
-                          the integration exists.
+                        description: The Quarkus package types, `fast-jar`, `native-sources`
+                          or `native` (default `fast-jar`). `native` is deprecated.
+                          In case both `fast-jar` and `native` or `native-sources`
+                          are specified, two `IntegrationKit` resources are created,
+                          with the native kit having precedence over the `fast-jar`
+                          one once ready. The order influences the resolution of the
+                          current kit for the integration. The kit corresponding to
+                          the first package type will be assigned to the integration
+                          in case no existing kit that matches the integration exists.
                         items:
-                          description: Quarkus package type.
+                          description: QuarkusPackageType is the type of Quarkus build
+                            packaging.
                           enum:
                           - fast-jar
+                          - native-sources
                           - native
                           type: string
                         type: array
diff --git a/helm/camel-k/crds/crd-kamelet-binding.yaml b/helm/camel-k/crds/crd-kamelet-binding.yaml
index d3c4b9a6f..1181e466b 100644
--- a/helm/camel-k/crds/crd-kamelet-binding.yaml
+++ b/helm/camel-k/crds/crd-kamelet-binding.yaml
@@ -7801,19 +7801,22 @@ spec:
                               All traits share this common property.
                             type: boolean
                           packageTypes:
-                            description: The Quarkus package types, either `fast-jar`
-                              or `native` (default `fast-jar`). In case both `fast-jar`
-                              and `native` are specified, two `IntegrationKit` resources
-                              are created, with the `native` kit having precedence
-                              over the `fast-jar` one once ready. The order influences
-                              the resolution of the current kit for the integration.
-                              The kit corresponding to the first package type will
-                              be assigned to the integration in case no existing kit
-                              that matches the integration exists.
+                            description: The Quarkus package types, `fast-jar`, `native-sources`
+                              or `native` (default `fast-jar`). `native` is deprecated.
+                              In case both `fast-jar` and `native` or `native-sources`
+                              are specified, two `IntegrationKit` resources are created,
+                              with the native kit having precedence over the `fast-jar`
+                              one once ready. The order influences the resolution
+                              of the current kit for the integration. The kit corresponding
+                              to the first package type will be assigned to the integration
+                              in case no existing kit that matches the integration
+                              exists.
                             items:
-                              description: Quarkus package type.
+                              description: QuarkusPackageType is the type of Quarkus
+                                build packaging.
                               enum:
                               - fast-jar
+                              - native-sources
                               - native
                               type: string
                             type: array
diff --git a/helm/camel-k/crds/crd-pipe.yaml b/helm/camel-k/crds/crd-pipe.yaml
index 33fb3e7d1..d6b5e1269 100644
--- a/helm/camel-k/crds/crd-pipe.yaml
+++ b/helm/camel-k/crds/crd-pipe.yaml
@@ -7798,19 +7798,22 @@ spec:
                               All traits share this common property.
                             type: boolean
                           packageTypes:
-                            description: The Quarkus package types, either `fast-jar`
-                              or `native` (default `fast-jar`). In case both `fast-jar`
-                              and `native` are specified, two `IntegrationKit` resources
-                              are created, with the `native` kit having precedence
-                              over the `fast-jar` one once ready. The order influences
-                              the resolution of the current kit for the integration.
-                              The kit corresponding to the first package type will
-                              be assigned to the integration in case no existing kit
-                              that matches the integration exists.
+                            description: The Quarkus package types, `fast-jar`, `native-sources`
+                              or `native` (default `fast-jar`). `native` is deprecated.
+                              In case both `fast-jar` and `native` or `native-sources`
+                              are specified, two `IntegrationKit` resources are created,
+                              with the native kit having precedence over the `fast-jar`
+                              one once ready. The order influences the resolution
+                              of the current kit for the integration. The kit corresponding
+                              to the first package type will be assigned to the integration
+                              in case no existing kit that matches the integration
+                              exists.
                             items:
-                              description: Quarkus package type.
+                              description: QuarkusPackageType is the type of Quarkus
+                                build packaging.
                               enum:
                               - fast-jar
+                              - native-sources
                               - native
                               type: string
                             type: array
diff --git a/pkg/apis/camel/v1/build_types.go b/pkg/apis/camel/v1/build_types.go
index 0d875ceab..581ec47dd 100644
--- a/pkg/apis/camel/v1/build_types.go
+++ b/pkg/apis/camel/v1/build_types.go
@@ -54,9 +54,16 @@ type BuildSpec struct {
 type Task struct {
 	// Application building
 
-	// a BuilderTask, used to generate and package the project
+	// a BuilderTask, used to generate and build the project
 	Builder *BuilderTask `json:"builder,omitempty"`
 
+	// User customizable task execution. These are executed after the build and before the package task.
+	Custom *UserTask `json:"custom,omitempty"`
+
+	// Application pre publishing
+	// a PackageTask, used to package the project
+	Package *BuilderTask `json:"package,omitempty"`
+
 	// Application Publishing
 
 	// a BuildahTask, for Buildah strategy
@@ -71,10 +78,6 @@ type Task struct {
 	S2i *S2iTask `json:"s2i,omitempty"`
 	// a JibTask, for Jib strategy
 	Jib *JibTask `json:"jib,omitempty"`
-
-	// User customizable task execution
-
-	Custom *UserTask `json:"custom,omitempty"`
 }
 
 // BaseTask is a base for the struct hierarchy.
@@ -185,7 +188,10 @@ type UserTask struct {
 	// the container image to use
 	ContainerImage string `json:"image,omitempty"`
 	// the command to execute
+	// Deprecated: use ContainerCommands
 	ContainerCommand string `json:"command,omitempty"`
+	// the command to execute
+	ContainerCommands []string `json:"commands,omitempty"`
 }
 
 // BuildStatus defines the observed state of Build.
diff --git a/pkg/apis/camel/v1/trait/quarkus.go b/pkg/apis/camel/v1/trait/quarkus.go
index 571ad6206..2d5548c1a 100644
--- a/pkg/apis/camel/v1/trait/quarkus.go
+++ b/pkg/apis/camel/v1/trait/quarkus.go
@@ -21,29 +21,32 @@ package trait
 //
 // It's enabled by default.
 //
-// NOTE: Compiling to a native executable, i.e. when using `package-type=native`, requires at least
-// 4GiB of memory, so the Pod running the native build, that is either the operator Pod, or the build
-// Pod (depending on the build strategy configured for the platform), must have enough memory available.
+// NOTE: A native based compilation will be forced to use a `pod` build strategy.
+// Compiling to a native executable, i.e. when using `package-type=native`, requires at least
+// 4GiB of memory, so the Pod running the native build, must have enough memory available.
 //
 // +camel-k:trait=quarkus.
 type QuarkusTrait struct {
 	Trait `property:",squash" json:",inline"`
-	// The Quarkus package types, either `fast-jar` or `native` (default `fast-jar`).
-	// In case both `fast-jar` and `native` are specified, two `IntegrationKit` resources are created,
-	// with the `native` kit having precedence over the `fast-jar` one once ready.
+	// The Quarkus package types, `fast-jar`, `native-sources` or `native` (default `fast-jar`). `native` is deprecated.
+	// In case both `fast-jar` and `native` or `native-sources` are specified, two `IntegrationKit` resources are created,
+	// with the native kit having precedence over the `fast-jar` one once ready.
 	// The order influences the resolution of the current kit for the integration.
 	// The kit corresponding to the first package type will be assigned to the
 	// integration in case no existing kit that matches the integration exists.
 	PackageTypes []QuarkusPackageType `property:"package-type" json:"packageTypes,omitempty"`
 }
 
-// Quarkus package type.
-// +kubebuilder:validation:Enum=fast-jar;native
+// QuarkusPackageType is the type of Quarkus build packaging.
+// +kubebuilder:validation:Enum=fast-jar;native-sources;native
 type QuarkusPackageType string
 
 const (
-	// Quarkus package type representing "fast jar" packaging.
+	// FastJarPackageType represents "fast jar" Quarkus packaging.
 	FastJarPackageType QuarkusPackageType = "fast-jar"
-	// Quarkus package type representing "native" packaging.
+	// NativePackageType represents "native" Quarkus packaging.
+	// Deprecated: use native-sources instead.
 	NativePackageType QuarkusPackageType = "native"
+	// NativeSourcesPackageType represents "native-sources" Quarkus packaging.
+	NativeSourcesPackageType QuarkusPackageType = "native-sources"
 )
diff --git a/pkg/apis/camel/v1/zz_generated.deepcopy.go b/pkg/apis/camel/v1/zz_generated.deepcopy.go
index 533002897..b77a301d9 100644
--- a/pkg/apis/camel/v1/zz_generated.deepcopy.go
+++ b/pkg/apis/camel/v1/zz_generated.deepcopy.go
@@ -2759,6 +2759,16 @@ func (in *Task) DeepCopyInto(out *Task) {
 		*out = new(BuilderTask)
 		(*in).DeepCopyInto(*out)
 	}
+	if in.Custom != nil {
+		in, out := &in.Custom, &out.Custom
+		*out = new(UserTask)
+		(*in).DeepCopyInto(*out)
+	}
+	if in.Package != nil {
+		in, out := &in.Package, &out.Package
+		*out = new(BuilderTask)
+		(*in).DeepCopyInto(*out)
+	}
 	if in.Buildah != nil {
 		in, out := &in.Buildah, &out.Buildah
 		*out = new(BuildahTask)
@@ -2784,11 +2794,6 @@ func (in *Task) DeepCopyInto(out *Task) {
 		*out = new(JibTask)
 		**out = **in
 	}
-	if in.Custom != nil {
-		in, out := &in.Custom, &out.Custom
-		*out = new(UserTask)
-		**out = **in
-	}
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Task.
@@ -3078,6 +3083,11 @@ func (in *Traits) DeepCopy() *Traits {
 func (in *UserTask) DeepCopyInto(out *UserTask) {
 	*out = *in
 	out.BaseTask = in.BaseTask
+	if in.ContainerCommands != nil {
+		in, out := &in.ContainerCommands, &out.ContainerCommands
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UserTask.
diff --git a/pkg/builder/builder.go b/pkg/builder/builder.go
index ec1280eb5..ac2e3ecfd 100644
--- a/pkg/builder/builder.go
+++ b/pkg/builder/builder.go
@@ -63,6 +63,7 @@ func (t *builderTask) Do(ctx context.Context) v1.BuildStatus {
 		Build:     *t.task,
 		BaseImage: t.task.BaseImage,
 	}
+	t.log.Infof("running builder task %s in context directory: %s", c.Build.Name, c.Path)
 
 	steps, err := StepsFrom(t.task.Steps...)
 	if err != nil {
@@ -75,7 +76,7 @@ func (t *builderTask) Do(ctx context.Context) v1.BuildStatus {
 		return steps[i].Phase() < steps[j].Phase()
 	})
 
-	t.log.Infof("steps: %v", steps)
+	t.log.Debugf("steps: %v", steps)
 
 steps:
 	for _, step := range steps {
@@ -94,7 +95,7 @@ steps:
 
 		default:
 			l := t.log.WithValues("step", step.ID(), "phase", strconv.FormatInt(int64(step.Phase()), 10), "task", t.task.Name)
-			l.Infof("executing step")
+			l.Debugf("executing step")
 
 			start := time.Now()
 			err := step.execute(&c)
@@ -104,7 +105,7 @@ steps:
 				break steps
 			}
 
-			l.Infof("step done in %f seconds", time.Since(start).Seconds())
+			l.Debugf("step done in %f seconds", time.Since(start).Seconds())
 		}
 	}
 
@@ -117,11 +118,11 @@ steps:
 	result.Artifacts = make([]v1.Artifact, 0, len(c.Artifacts))
 	result.Artifacts = append(result.Artifacts, c.Artifacts...)
 
-	t.log.Infof("dependencies: %s", t.task.Dependencies)
-	t.log.Infof("artifacts: %s", artifactIDs(c.Artifacts))
-	t.log.Infof("artifacts selected: %s", artifactIDs(c.SelectedArtifacts))
-	t.log.Infof("base image: %s", t.task.BaseImage)
-	t.log.Infof("resolved base image: %s", c.BaseImage)
+	t.log.Debugf("dependencies: %s", t.task.Dependencies)
+	t.log.Debugf("artifacts: %s", artifactIDs(c.Artifacts))
+	t.log.Debugf("artifacts selected: %s", artifactIDs(c.SelectedArtifacts))
+	t.log.Debugf("base image: %s", t.task.BaseImage)
+	t.log.Debugf("resolved base image: %s", c.BaseImage)
 
 	return result
 }
diff --git a/pkg/builder/image.go b/pkg/builder/image.go
index 215f3e435..c6bc6d9b8 100644
--- a/pkg/builder/image.go
+++ b/pkg/builder/image.go
@@ -50,6 +50,7 @@ type imageSteps struct {
 	JvmDockerfile           Step
 }
 
+// Image used to export the steps available on an Image building process
 var Image = imageSteps{
 	IncrementalImageContext: NewStep(ApplicationPackagePhase, incrementalImageContext),
 	NativeImageContext:      NewStep(ApplicationPackagePhase, nativeImageContext),
@@ -68,7 +69,7 @@ func nativeImageContext(ctx *builderContext) error {
 		ctx.Artifacts = []v1.Artifact{
 			{
 				ID:       runner,
-				Location: filepath.Join(ctx.Path, "maven", "target", runner),
+				Location: filepath.Join(ctx.Path, "maven", "target", "native-sources", runner),
 				Target:   runner,
 			},
 		}
diff --git a/pkg/builder/spectrum.go b/pkg/builder/spectrum.go
index 9d28a95cf..2bc3b2673 100644
--- a/pkg/builder/spectrum.go
+++ b/pkg/builder/spectrum.go
@@ -68,6 +68,8 @@ func (t *spectrumTask) Do(ctx context.Context) v1.BuildStatus {
 		contextDir = filepath.Join(pwd, ContextDir)
 	}
 
+	log.Infof("Running spectrum task in context directory: %s", contextDir)
+
 	exists, err := util.DirectoryExists(contextDir)
 	if err != nil {
 		return status.Failed(err)
diff --git a/pkg/builder/tasks.go b/pkg/builder/tasks.go
index 054fe3552..3b35e2db2 100644
--- a/pkg/builder/tasks.go
+++ b/pkg/builder/tasks.go
@@ -24,6 +24,7 @@ import (
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 )
 
+// Build convert the Build CR in a struct that can be executable as an operator routing
 func (b *Builder) Build(build *v1.Build) *Build {
 	return &Build{
 		builder: *b,
@@ -31,6 +32,7 @@ func (b *Builder) Build(build *v1.Build) *Build {
 	}
 }
 
+// Task convert the task in a routine task which can be executed inside operator
 func (b *Build) Task(task v1.Task) Task {
 	switch {
 	case task.Builder != nil:
@@ -40,11 +42,26 @@ func (b *Build) Task(task v1.Task) Task {
 			build: b.build,
 			task:  task.Builder,
 		}
+	// Custom tasks are not supported in routines
+	case task.Custom != nil:
+		return &unsupportedTask{
+			build: b.build,
+			name:  task.Custom.Name,
+		}
+	case task.Package != nil:
+		return &builderTask{
+			c:     b.builder.client,
+			log:   b.builder.log,
+			build: b.build,
+			task:  task.Package,
+		}
+	// Buildah tasks are not supported in routines
 	case task.Buildah != nil:
 		return &unsupportedTask{
 			build: b.build,
 			name:  task.Buildah.Name,
 		}
+	// Kaniko tasks are not supported in routines
 	case task.Kaniko != nil:
 		return &unsupportedTask{
 			build: b.build,
@@ -112,6 +129,7 @@ func (t *unsupportedTask) Do(_ context.Context) v1.BuildStatus {
 
 var _ Task = &missingTask{}
 
+// TaskByName return the task identified by the name parameter
 func (b *Build) TaskByName(name string) Task {
 	for _, task := range b.build.Spec.Tasks {
 		switch {
@@ -122,6 +140,18 @@ func (b *Build) TaskByName(name string) Task {
 				build: b.build,
 				task:  task.Builder,
 			}
+		case task.Custom != nil && task.Custom.Name == name:
+			return &unsupportedTask{
+				build: b.build,
+				name:  task.Custom.Name,
+			}
+		case task.Package != nil && task.Package.Name == name:
+			return &builderTask{
+				c:     b.builder.client,
+				log:   b.builder.log,
+				build: b.build,
+				task:  task.Package,
+			}
 		case task.Buildah != nil && task.Buildah.Name == name:
 			return &unsupportedTask{
 				build: b.build,
diff --git a/pkg/client/camel/applyconfiguration/camel/v1/task.go b/pkg/client/camel/applyconfiguration/camel/v1/task.go
index a4b7912c2..1cef4a8c7 100644
--- a/pkg/client/camel/applyconfiguration/camel/v1/task.go
+++ b/pkg/client/camel/applyconfiguration/camel/v1/task.go
@@ -23,12 +23,13 @@ package v1
 // with apply.
 type TaskApplyConfiguration struct {
 	Builder  *BuilderTaskApplyConfiguration  `json:"builder,omitempty"`
+	Custom   *UserTaskApplyConfiguration     `json:"custom,omitempty"`
+	Package  *BuilderTaskApplyConfiguration  `json:"package,omitempty"`
 	Buildah  *BuildahTaskApplyConfiguration  `json:"buildah,omitempty"`
 	Kaniko   *KanikoTaskApplyConfiguration   `json:"kaniko,omitempty"`
 	Spectrum *SpectrumTaskApplyConfiguration `json:"spectrum,omitempty"`
 	S2i      *S2iTaskApplyConfiguration      `json:"s2i,omitempty"`
 	Jib      *JibTaskApplyConfiguration      `json:"jib,omitempty"`
-	Custom   *UserTaskApplyConfiguration     `json:"custom,omitempty"`
 }
 
 // TaskApplyConfiguration constructs an declarative configuration of the Task type for use with
@@ -45,6 +46,22 @@ func (b *TaskApplyConfiguration) WithBuilder(value *BuilderTaskApplyConfiguratio
 	return b
 }
 
+// WithCustom sets the Custom 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 Custom field is set to the value of the last call.
+func (b *TaskApplyConfiguration) WithCustom(value *UserTaskApplyConfiguration) *TaskApplyConfiguration {
+	b.Custom = value
+	return b
+}
+
+// WithPackage sets the Package 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 Package field is set to the value of the last call.
+func (b *TaskApplyConfiguration) WithPackage(value *BuilderTaskApplyConfiguration) *TaskApplyConfiguration {
+	b.Package = value
+	return b
+}
+
 // WithBuildah sets the Buildah 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 Buildah field is set to the value of the last call.
@@ -84,11 +101,3 @@ func (b *TaskApplyConfiguration) WithJib(value *JibTaskApplyConfiguration) *Task
 	b.Jib = value
 	return b
 }
-
-// WithCustom sets the Custom 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 Custom field is set to the value of the last call.
-func (b *TaskApplyConfiguration) WithCustom(value *UserTaskApplyConfiguration) *TaskApplyConfiguration {
-	b.Custom = value
-	return b
-}
diff --git a/pkg/client/camel/applyconfiguration/camel/v1/usertask.go b/pkg/client/camel/applyconfiguration/camel/v1/usertask.go
index 51dcadc4b..65b7c5c2a 100644
--- a/pkg/client/camel/applyconfiguration/camel/v1/usertask.go
+++ b/pkg/client/camel/applyconfiguration/camel/v1/usertask.go
@@ -23,8 +23,9 @@ package v1
 // with apply.
 type UserTaskApplyConfiguration struct {
 	BaseTaskApplyConfiguration `json:",inline"`
-	ContainerImage             *string `json:"image,omitempty"`
-	ContainerCommand           *string `json:"command,omitempty"`
+	ContainerImage             *string  `json:"image,omitempty"`
+	ContainerCommand           *string  `json:"command,omitempty"`
+	ContainerCommands          []string `json:"commands,omitempty"`
 }
 
 // UserTaskApplyConfiguration constructs an declarative configuration of the UserTask type for use with
@@ -56,3 +57,13 @@ func (b *UserTaskApplyConfiguration) WithContainerCommand(value string) *UserTas
 	b.ContainerCommand = &value
 	return b
 }
+
+// WithContainerCommands adds the given value to the ContainerCommands field in the declarative configuration
+// and returns the receiver, so that objects can be build by chaining "With" function invocations.
+// If called multiple times, values provided by each call will be appended to the ContainerCommands field.
+func (b *UserTaskApplyConfiguration) WithContainerCommands(values ...string) *UserTaskApplyConfiguration {
+	for i := range values {
+		b.ContainerCommands = append(b.ContainerCommands, values[i])
+	}
+	return b
+}
diff --git a/pkg/controller/build/build_pod.go b/pkg/controller/build/build_pod.go
index 686152ab3..27ccd0f68 100644
--- a/pkg/controller/build/build_pod.go
+++ b/pkg/controller/build/build_pod.go
@@ -154,8 +154,17 @@ func newBuildPod(ctx context.Context, c ctrl.Reader, client client.Client, build
 
 	for _, task := range build.Spec.Tasks {
 		switch {
+		// Builder task
 		case task.Builder != nil:
 			addBuildTaskToPod(ctx, client, build, task.Builder.Name, pod)
+		// Custom task
+		case task.Custom != nil:
+			addCustomTaskToPod(build, task.Custom, pod)
+		// Package task
+		// It's a type of builder task, we can reuse the same type
+		case task.Package != nil:
+			addBuildTaskToPod(ctx, client, build, task.Package.Name, pod)
+		// Publish task
 		case task.Buildah != nil:
 			err := addBuildahTaskToPod(ctx, c, build, task.Buildah, pod)
 			if err != nil {
@@ -172,8 +181,6 @@ func newBuildPod(ctx context.Context, c ctrl.Reader, client client.Client, build
 			addBuildTaskToPod(ctx, client, build, task.Spectrum.Name, pod)
 		case task.Jib != nil:
 			addBuildTaskToPod(ctx, client, build, task.Jib.Name, pod)
-		case task.Custom != nil:
-			addCustomTaskToPod(build, task.Custom, pod)
 		}
 	}
 
@@ -558,7 +565,7 @@ func addCustomTaskToPod(build *v1.Build, task *v1.UserTask, pod *corev1.Pod) {
 		Name:            task.Name,
 		Image:           task.ContainerImage,
 		ImagePullPolicy: corev1.PullIfNotPresent,
-		Command:         strings.Split(task.ContainerCommand, " "),
+		Command:         task.ContainerCommands,
 		WorkingDir:      filepath.Join(builderDir, build.Name),
 		Env:             proxyFromEnvironment(),
 	}
diff --git a/pkg/controller/build/monitor_routine.go b/pkg/controller/build/monitor_routine.go
index adc566d04..3c3b3ce52 100644
--- a/pkg/controller/build/monitor_routine.go
+++ b/pkg/controller/build/monitor_routine.go
@@ -122,6 +122,7 @@ tasks:
 			break tasks
 
 		default:
+			// TODO apply code refactoring to the below conditions
 			// Coordinate the build and context directories across the sequence of tasks
 			if t := task.Builder; t != nil {
 				if t.BuildDir == "" {
@@ -136,6 +137,12 @@ tasks:
 					defer os.RemoveAll(tmpDir)
 				}
 				buildDir = t.BuildDir
+			} else if t := task.Package; t != nil {
+				if buildDir == "" {
+					status.Failed(fmt.Errorf("cannot determine builder directory for task %s", t.Name))
+					break tasks
+				}
+				t.BuildDir = buildDir
 			} else if t := task.Spectrum; t != nil && t.ContextDir == "" {
 				if buildDir == "" {
 					status.Failed(fmt.Errorf("cannot determine context directory for task %s", t.Name))
@@ -148,7 +155,6 @@ tasks:
 					break tasks
 				}
 				t.ContextDir = filepath.Join(buildDir, builder.ContextDir)
-
 			} else if t := task.Jib; t != nil && t.ContextDir == "" {
 				if buildDir == "" {
 					status.Failed(fmt.Errorf("cannot determine context directory for task %s", t.Name))
@@ -211,16 +217,21 @@ func (action *monitorRoutineAction) updateBuildStatus(ctx context.Context, build
 	} else if target.Status.Phase == v1.BuildPhaseError {
 		action.L.Errorf(nil, "Build %s errored: %s", build.Name, target.Status.Error)
 	}
-	err = action.client.Status().Patch(ctx, target, ctrl.RawPatch(types.MergePatchType, p))
-	if err != nil {
-		action.L.Errorf(err, "Cannot update build status: %s", build.Name)
-		event.NotifyBuildError(ctx, action.client, action.recorder, build, target, err)
-		return err
-	}
-	if target.Status.Phase != build.Status.Phase {
-		action.L.Info("State transition", "phase-from", build.Status.Phase, "phase-to", target.Status.Phase)
+
+	if len(p) > 0 {
+		err = action.client.Status().Patch(ctx, target, ctrl.RawPatch(types.MergePatchType, p))
+		if err != nil {
+			action.L.Errorf(err, "Cannot update build status: %s", build.Name)
+			event.NotifyBuildError(ctx, action.client, action.recorder, build, target, err)
+			return err
+		}
+
+		if target.Status.Phase != build.Status.Phase {
+			action.L.Info("State transition", "phase-from", build.Status.Phase, "phase-to", target.Status.Phase)
+		}
+		event.NotifyBuildUpdated(ctx, action.client, action.recorder, build, target)
+		build.Status = target.Status
 	}
-	event.NotifyBuildUpdated(ctx, action.client, action.recorder, build, target)
-	build.Status = target.Status
+
 	return nil
 }
diff --git a/pkg/resources/resources.go b/pkg/resources/resources.go
index 1cc6fd060..fb3c4547b 100644
--- a/pkg/resources/resources.go
+++ b/pkg/resources/resources.go
@@ -117,9 +117,9 @@ var assets = func() http.FileSystem {
 		"/crd/bases/camel.apache.org_builds.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_builds.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 49805,
+			uncompressedSize: 78450,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\x1b\x37\x96\xe8\x77\xfd\x8a\x53\xf1\x87\xc8\x55\x22\x95\x38\x33\x73\x73\x75\xeb\xd6\x96\x46\x4e\x32\x1a\xc7\x96\xd7\x94\x3d\x33\xb5\xb5\x55\x02\xbb\x0f\x49\x84\xdd\x40\x2f\x80\x16\xcd\xd9\xda\xff\xbe\x85\x57\x3f\xc8\x7e\x00\x14\x15\x67\x2a\xc4\x17\x5b\x6c\x3c\xce\x39\x38\x38\x2f\x1c\x00\x2f\x60\x72\xbc\x72\xf6\x02\x7e\xa6\x09\x32\x89\x29\x28\x0e\x6a\x85\x70\x5d\x90\x64\x85\x30\xe3\x0b\xb5\x21\x02\xe1\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6d\x73\x1b\x37\x92\xf0\x77\xfd\x8a\xae\xf8\x43\xe4\x2a\x91\x4a\x9c\xec\x5e\x4e\x4f\x5d\x3d\xa5\x95\x93\x3d\xad\x1d\xdb\x67\x2a\xde\xdd\xba\xba\x2a\x81\x33\x4d\x12\xe1\x0c\x30\x07\x60\x24\x33\x4f\x3d\xff\xfd\x0a\x6f\xf3\x42\xce\x0b\x40\x91\xb6\xaf\x4c\x7c\x49\x2c\x62\x80\x6e\xa0\xd1\x6f\x68\x74\x3f\x83\xc9\xe1\xda\xd9\x33\x78\x4d\x13\x64\x12\x53\x50\x1c\xd4\x0a\xe1\xba\x20\xc9\x0a\x61\xc6\x17\xea\x91\x08\x84\x [...]
 		},
 		"/crd/bases/camel.apache.org_camelcatalogs.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_camelcatalogs.yaml",
@@ -131,30 +131,30 @@ var assets = func() http.FileSystem {
 		"/crd/bases/camel.apache.org_integrationkits.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_integrationkits.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 21596,
+			uncompressedSize: 21757,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3c\x5d\x73\xe3\x36\x92\xef\xfa\x15\x5d\xe3\x87\xb1\xab\x24\x79\x73\x97\x4a\x5d\x79\xb3\xa9\xf2\x3a\x93\xac\x6b\x3c\x33\xbe\x91\x27\xb9\xd4\x66\xab\xdc\x22\x5b\x12\x22\x12\x60\x00\x50\xb2\xee\xe3\xbf\x5f\xa1\x01\x50\x94\x44\x52\x1c\x39\xbe\xbd\x87\xe1\xcb\x8c\x49\xa0\xd1\x1f\xe8\x4f\x34\x74\x06\xa3\x3f\xee\x19\x9c\xc1\x9d\x48\x48\x1a\x4a\xc1\x2a\xb0\x0b\x82\xeb\x02\x93\x05\xc1\x44\xcd\xec\x1a\x35\xc1\x0f\xaa\x94\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3c\xdb\x72\xdb\x38\x96\xef\xfa\x8a\x53\xf1\x43\xec\x2a\x89\x9e\xde\xed\xea\xda\xf2\xf4\x74\x95\xc7\x9d\xf4\xb8\xe2\x24\xde\xc8\xe9\xde\xae\xe9\xa9\x12\x44\x1e\x49\x68\x91\x00\x1b\x00\x25\x6b\x2f\xff\xbe\x85\x03\x80\x17\x89\xa4\x68\x39\xde\xd9\x87\xf0\x25\x31\x09\x1c\x9c\xfb\x0d\x80\xce\x60\xf2\xe5\x9e\xd1\x19\xdc\xf1\x18\x85\xc6\x04\x8c\x04\xb3\x42\xb8\xce\x59\xbc\x42\x98\xca\x85\xd9\x32\x85\xf0\x56\x16\x22\x61\x [...]
 		},
 		"/crd/bases/camel.apache.org_integrationplatforms.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_integrationplatforms.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 192212,
+			uncompressedSize: 192534,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7d\x73\xdb\x36\xb6\x38\xfc\x7f\x3f\x05\xc6\x9d\x3b\x71\x32\x96\x94\xec\xde\xee\xf6\xfa\xde\xde\xe7\xe7\x3a\x69\xeb\x26\x8e\x7d\x6d\x27\xbb\x3b\x6d\xa7\x82\xc8\x23\x09\x35\x09\x70\x01\x50\xb6\x3a\xfb\xe1\x9f\xc1\x01\x40\x52\x12\x09\x52\x2f\xb6\xb3\x8d\x98\x99\xd6\x92\x48\xf0\x1c\xe0\xe0\xbc\xe1\xbc\x7c\x49\x7a\xbb\xbb\xbe\xf8\x92\xbc\x63\x11\x70\x05\x31\xd1\x82\xe8\x29\x90\x93\x8c\x46\x53\x20\xd7\x62\xac\xef\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7d\x73\xdb\x36\xb6\x38\xfc\x7f\x3f\x05\xc6\x9d\x3b\x71\x32\x96\x94\xec\xde\xee\xf6\xfa\xde\xde\xe7\xe7\x3a\x69\xeb\x26\x8e\x7d\x6d\x27\xbb\x3b\x6d\xa7\x82\xc8\x23\x09\x35\x09\x70\x01\x50\xb6\x3a\xfb\xe1\x9f\xc1\x01\x40\x52\x12\x09\x52\x2f\xb6\xb3\x8d\x98\x99\xd6\x92\x48\xf0\x1c\xe0\xe0\xbc\xe1\xbc\x7c\x49\x7a\xbb\xbb\xbe\xf8\x92\xbc\x63\x11\x70\x05\x31\xd1\x82\xe8\x29\x90\x93\x8c\x46\x53\x20\xd7\x62\xac\xef\x [...]
 		},
 		"/crd/bases/camel.apache.org_integrations.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_integrations.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 514551,
+			uncompressedSize: 514712,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\x1b\x37\x96\x30\x8c\xff\x9f\x4f\x81\x72\x52\x8f\xa4\x8d\x48\xd9\x99\xd9\xa9\x1d\xff\xa6\x9e\x94\x56\x92\x13\xfd\x62\xcb\x2a\x49\x49\x9e\x94\x93\x4d\xc0\x6e\x90\xc4\xa3\x6e\xa0\x17\x40\x53\xe2\xbc\x79\xbf\xfb\x5b\x38\x00\xfa\xc2\x5b\x1f\xb4\x44\xc7\x99\x6d\x4c\x55\xc6\x14\xd9\xa7\x71\x39\x38\xf7\xcb\xe7\x64\xf4\x7c\xe3\xb3\xcf\xc9\x5b\x9e\x30\xa1\x59\x4a\x8c\x24\x66\xce\xc8\x69\x41\x93\x39\x23\xb7\x72\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\x1b\x37\x96\x30\x8c\xff\x9f\x4f\x81\x72\x52\x8f\xa4\x8d\x48\xd9\x99\xd9\xa9\x1d\xff\xa6\x9e\x94\x56\x92\x13\xfd\x62\xcb\x2a\x49\x49\x9e\x94\x93\x4d\xc0\x6e\x90\xc4\xa3\x6e\xa0\x17\x40\x53\xe2\xbc\x79\xbf\xfb\x5b\x38\x00\xfa\xc2\x5b\x1f\xb4\x44\xc7\x99\x6d\x4c\x55\xc6\x14\xd9\xa7\x71\x39\x38\xf7\xcb\xe7\x64\xf4\x7c\xe3\xb3\xcf\xc9\x5b\x9e\x30\xa1\x59\x4a\x8c\x24\x66\xce\xc8\x69\x41\x93\x39\x23\xb7\x72\x [...]
 		},
 		"/crd/bases/camel.apache.org_kameletbindings.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_kameletbindings.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 595799,
+			uncompressedSize: 595998,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x6b\x73\x1b\x37\xb6\x30\x0a\x7f\xf7\xaf\x40\xc9\xa9\x47\xd2\x8e\x48\xd9\x99\x99\xd4\x8c\xdf\xa9\x9d\xd2\xc8\x72\xa2\x37\xb6\xcc\xb2\x94\xe4\x49\x39\xd9\x09\xd8\x0d\x92\xd8\xea\x06\x7a\x00\x34\x25\xe6\xf8\xfc\xf7\x53\x58\x00\xfa\xc2\x9b\xb0\x9a\x92\x46\x9e\x69\x4c\x55\xc6\xa4\xd8\xab\x71\x59\x58\xf7\xcb\x73\x32\xb8\xbf\xf1\xec\x39\x79\xcb\x13\x26\x34\x4b\x89\x91\xc4\xcc\x18\x39\x29\x68\x32\x63\xe4\x52\x4e\xcc\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x6b\x73\x1b\x37\xb6\x30\x0a\x7f\xf7\xaf\x40\xc9\xa9\x47\xd2\x8e\x48\xd9\x99\x99\xd4\x8c\xdf\xa9\x9d\xd2\xc8\x72\xa2\x37\xb6\xcc\xb2\x94\xe4\x49\x39\xd9\x09\xd8\x0d\x92\xd8\xea\x06\x7a\x00\x34\x25\xe6\xf8\xfc\xf7\x53\x58\x00\xfa\xc2\x9b\xb0\x9a\x92\x46\x9e\x69\x4c\x55\xc6\xa4\xd8\xab\x71\x59\x58\xf7\xcb\x73\x32\xb8\xbf\xf1\xec\x39\x79\xcb\x13\x26\x34\x4b\x89\x91\xc4\xcc\x18\x39\x29\x68\x32\x63\xe4\x52\x4e\xcc\x [...]
 		},
 		"/crd/bases/camel.apache.org_kamelets.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_kamelets.yaml",
@@ -166,9 +166,9 @@ var assets = func() http.FileSystem {
 		"/crd/bases/camel.apache.org_pipes.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_pipes.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 563061,
+			uncompressedSize: 563260,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\x1b\x37\xb6\x28\x8a\xff\x9f\x4f\x81\xb2\x53\x47\xd2\x0e\x49\xd9\x99\x99\xd4\x1e\xff\xa6\x4e\x4a\x5b\x96\x13\xfd\x62\xcb\x2c\x4b\x49\x4e\xca\xc9\x4e\xc0\x6e\x90\xc4\x51\x37\xd0\x1b\x40\x53\x62\xae\xef\x77\xbf\x85\x05\xa0\x1f\x7c\x09\xab\x29\x69\xe4\x99\xc6\x54\x65\x4c\x8a\xbd\x1a\x8f\x85\xf5\x7e\x3c\x27\xc3\xfb\x1b\x5f\x3c\x27\x6f\x79\xc2\x84\x66\x29\x31\x92\x98\x39\x23\x27\x05\x4d\xe6\x8c\x5c\xca\xa9\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\x1b\x37\xb6\x28\x8a\xff\x9f\x4f\x81\xb2\x53\x47\xd2\x0e\x49\xd9\x99\x99\xd4\x1e\xff\xa6\x4e\x4a\x5b\x96\x13\xfd\x62\xcb\x2c\x4b\x49\x4e\xca\xc9\x4e\xc0\x6e\x90\xc4\x51\x37\xd0\x1b\x40\x53\x62\xae\xef\x77\xbf\x85\x05\xa0\x1f\x7c\x09\xab\x29\x69\xe4\x99\xc6\x54\x65\x4c\x8a\xbd\x1a\x8f\x85\xf5\x7e\x3c\x27\xc3\xfb\x1b\x5f\x3c\x27\x6f\x79\xc2\x84\x66\x29\x31\x92\x98\x39\x23\x27\x05\x4d\xe6\x8c\x5c\xca\xa9\x [...]
 		},
 		"/manager": &vfsgen۰DirInfo{
 			name:    "manager",
@@ -637,9 +637,9 @@ var assets = func() http.FileSystem {
 		"/traits.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "traits.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 68516,
+			uncompressedSize: 68535,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xfd\x77\x1b\xb9\x91\xe0\xef\xfe\x2b\xf0\xb4\xb7\x4f\x92\x8f\x1f\xf2\x64\x93\x9d\xd5\xc6\xd9\xd3\x78\x3c\x89\x32\xfe\xd0\x59\x9a\xc9\xe6\xf9\xfc\x42\xb0\x1b\x24\x61\x36\x81\x0e\x80\x96\xcc\xb9\xdc\xff\x7e\x0f\x55\x85\x8f\x6e\x36\x45\xca\x96\x66\xa3\xcd\x24\xef\x8d\x45\xb2\xbb\x50\x28\x14\x0a\x85\xfa\x74\x86\x4b\x67\x4f\x9f\x0c\x99\xe2\x2b\x71\xca\x7e\x65\x0b\x5e\x89\x27\x8c\xd5\x15\x77\x33\x6d\x56\xa7\x6c\xc6\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xfd\x77\x1b\xb9\x91\xe0\xef\xfe\x2b\xf0\xb4\xb7\x4f\x92\x8f\x1f\xf2\x64\x93\x9d\xd5\xc6\xd9\xd3\x78\x3c\x89\x32\xfe\xd0\x59\x9a\xc9\xe6\xf9\xfc\x42\xb0\x1b\x24\x61\x36\x81\x0e\x80\x96\xcc\xb9\xdc\xff\x7e\x0f\x55\x85\x8f\x6e\x36\x45\xca\x96\x66\xa3\xcd\x24\xef\x8d\x45\xb2\xbb\x50\x28\x14\x0a\x85\xfa\x74\x86\x4b\x67\x4f\x9f\x0c\x99\xe2\x2b\x71\xca\x7e\x65\x0b\x5e\x89\x27\x8c\xd5\x15\x77\x33\x6d\x56\xa7\x6c\xc6\x [...]
 		},
 	}
 	fs["/"].(*vfsgen۰DirInfo).entries = []os.FileInfo{
diff --git a/pkg/trait/builder.go b/pkg/trait/builder.go
index 3e9a8c00f..c8a514208 100644
--- a/pkg/trait/builder.go
+++ b/pkg/trait/builder.go
@@ -19,6 +19,8 @@ package trait
 
 import (
 	"fmt"
+	"path/filepath"
+	"regexp"
 	"sort"
 	"strings"
 
@@ -33,6 +35,8 @@ import (
 	"github.com/apache/camel-k/v2/pkg/util/property"
 )
 
+var commandsRegexp = regexp.MustCompile(`"[^"]+"|[\w/-]+`)
+
 type builderTrait struct {
 	BaseTrait
 	traitv1.BuilderTrait `property:",squash"`
@@ -64,12 +68,28 @@ func (t *builderTrait) Configure(e *Environment) (bool, error) {
 		return false, nil
 	}
 
+	if trait := e.Catalog.GetTrait(quarkusTraitID); trait != nil {
+		quarkus, ok := trait.(*quarkusTrait)
+		isNativeIntegration := quarkus.isNativeIntegration(e)
+		isNativeKit, err := quarkus.isNativeKit(e)
+		if err != nil {
+			return false, err
+		}
+		if ok && pointer.BoolDeref(quarkus.Enabled, true) && (isNativeIntegration || isNativeKit) {
+			nativeArgsCd := filepath.Join("maven", "target", "native-sources")
+			command := "cd " + nativeArgsCd + " && echo NativeImage version is $(native-image --version) && echo GraalVM expected version is $(cat graalvm.version) && echo WARN: Make sure they are compatible, otherwise the native compilation may results in error && native-image $(cat native-image.args)"
+			// it should be performed as the last custom task
+			t.Tasks = append(t.Tasks, fmt.Sprintf(`quarkus-native;%s;/bin/bash -c "%s"`, e.CamelCatalog.GetQuarkusToolingImage(), command))
+		}
+	}
+
 	return e.IntegrationKitInPhase(v1.IntegrationKitPhaseBuildSubmitted), nil
 }
 
 func (t *builderTrait) Apply(e *Environment) error {
 	// local pipeline tasks
 	var pipelineTasks []v1.Task
+
 	// Building task
 	builderTask, err := t.builderTask(e)
 	if err != nil {
@@ -81,7 +101,6 @@ func (t *builderTrait) Apply(e *Environment) error {
 		}
 		return nil
 	}
-
 	pipelineTasks = append(pipelineTasks, v1.Task{Builder: builderTask})
 
 	// Custom tasks
@@ -104,9 +123,22 @@ func (t *builderTrait) Apply(e *Environment) error {
 			}
 			return nil
 		}
-		pipelineTasks = append(pipelineTasks, t.customTasks()...)
+
+		customTasks, err := t.customTasks()
+		if err != nil {
+			return err
+		}
+
+		pipelineTasks = append(pipelineTasks, customTasks...)
 	}
 
+	// Packaging task
+	// It's the same builder configuration, but with different steps
+	packageTask := builderTask.DeepCopy()
+	packageTask.Name = "package"
+	packageTask.Steps = make([]string, 0)
+	pipelineTasks = append(pipelineTasks, v1.Task{Package: packageTask})
+
 	// Publishing task
 	switch e.Platform.Status.Build.PublishStrategy {
 	case v1.IntegrationPlatformBuildPublishStrategySpectrum:
@@ -344,20 +376,42 @@ func getImageName(e *Environment) string {
 	return e.Platform.Status.Build.Registry.Address + "/" + organization + "/camel-k-" + e.IntegrationKit.Name + ":" + e.IntegrationKit.ResourceVersion
 }
 
-func (t *builderTrait) customTasks() []v1.Task {
-	customTasks := make([]v1.Task, len(t.Tasks))
+func (t *builderTrait) customTasks() ([]v1.Task, error) {
+	customTasks := make([]v1.Task, len(t.Tasks), len(t.Tasks))
 	for i, t := range t.Tasks {
-		// TODO, better strategy than a simple split!
 		splitted := strings.Split(t, ";")
+		if len(splitted) < 3 {
+			return nil, fmt.Errorf(`You need to provide a custom task with at least 3 arguments, ie "my-task-name;my-image;echo 'hello', was %v"`, t)
+		}
+		var containerCommand string
+		if len(splitted) > 3 {
+			//recompose in case of usage of separator char in the script
+			containerCommand = strings.Join(splitted[2:], ";")
+		} else {
+			containerCommand = splitted[2]
+		}
+		containerCommands := splitContainerCommand(containerCommand)
 		customTasks[i] = v1.Task{
 			Custom: &v1.UserTask{
 				BaseTask: v1.BaseTask{
 					Name: splitted[0],
 				},
-				ContainerImage:   splitted[1],
-				ContainerCommand: splitted[2],
+				ContainerImage:    splitted[1],
+				ContainerCommands: containerCommands,
 			},
 		}
 	}
-	return customTasks
+	return customTasks, nil
+}
+
+// we may get a command in the following format `/bin/bash -c "ls && echo 'hello'`
+// which should provide a string with {"/bin/bash", "-c", "ls && echo 'hello'"}
+func splitContainerCommand(command string) []string {
+	matches := commandsRegexp.FindAllString(command, -1)
+	removeQuotes := make([]string, 0, len(matches))
+	for _, m := range matches {
+		removeQuotes = append(removeQuotes, strings.Replace(m, "\"", "", -1))
+	}
+
+	return removeQuotes
 }
diff --git a/pkg/trait/builder_test.go b/pkg/trait/builder_test.go
index 54151db29..9708a7485 100644
--- a/pkg/trait/builder_test.go
+++ b/pkg/trait/builder_test.go
@@ -84,9 +84,10 @@ func TestS2IBuilderTrait(t *testing.T) {
 	assert.NotEmpty(t, env.ExecutedTraits)
 	assert.NotNil(t, env.GetTrait("builder"))
 	assert.NotEmpty(t, env.Pipeline)
-	assert.Len(t, env.Pipeline, 2)
+	assert.Len(t, env.Pipeline, 3)
 	assert.NotNil(t, env.Pipeline[0].Builder)
-	assert.NotNil(t, env.Pipeline[1].S2i)
+	assert.NotNil(t, env.Pipeline[1].Package)
+	assert.NotNil(t, env.Pipeline[2].S2i)
 }
 
 func TestKanikoBuilderTrait(t *testing.T) {
@@ -97,9 +98,10 @@ func TestKanikoBuilderTrait(t *testing.T) {
 	assert.NotEmpty(t, env.ExecutedTraits)
 	assert.NotNil(t, env.GetTrait("builder"))
 	assert.NotEmpty(t, env.Pipeline)
-	assert.Len(t, env.Pipeline, 2)
+	assert.Len(t, env.Pipeline, 3)
 	assert.NotNil(t, env.Pipeline[0].Builder)
-	assert.NotNil(t, env.Pipeline[1].Kaniko)
+	assert.NotNil(t, env.Pipeline[1].Package)
+	assert.NotNil(t, env.Pipeline[2].Kaniko)
 }
 
 func createBuilderTestEnv(cluster v1.IntegrationPlatformCluster, strategy v1.IntegrationPlatformBuildPublishStrategy, buildStrategy v1.BuildStrategy) *Environment {
@@ -189,15 +191,18 @@ func TestCustomTaskBuilderTrait(t *testing.T) {
 
 	assert.Nil(t, err)
 	builderTask := findCustomTaskByName(env.Pipeline, "builder")
-	publisherTask := findCustomTaskByName(env.Pipeline, "spectrum")
 	customTask := findCustomTaskByName(env.Pipeline, "test")
-	assert.NotNil(t, customTask)
+	packageTask := findCustomTaskByName(env.Pipeline, "package")
+	publisherTask := findCustomTaskByName(env.Pipeline, "spectrum")
+
 	assert.NotNil(t, builderTask)
+	assert.NotNil(t, customTask)
+	assert.NotNil(t, packageTask)
 	assert.NotNil(t, publisherTask)
-	assert.Equal(t, 3, len(env.Pipeline))
+	assert.Equal(t, 4, len(env.Pipeline))
 	assert.Equal(t, "test", customTask.Custom.Name)
 	assert.Equal(t, "alpine", customTask.Custom.ContainerImage)
-	assert.Equal(t, "ls", customTask.Custom.ContainerCommand)
+	assert.Equal(t, "ls", customTask.Custom.ContainerCommands[0])
 }
 
 func TestCustomTaskBuilderTraitValidStrategyOverride(t *testing.T) {
@@ -210,16 +215,12 @@ func TestCustomTaskBuilderTraitValidStrategyOverride(t *testing.T) {
 
 	assert.Nil(t, err)
 
-	builderTask := findCustomTaskByName(env.Pipeline, "builder")
-	publisherTask := findCustomTaskByName(env.Pipeline, "spectrum")
 	customTask := findCustomTaskByName(env.Pipeline, "test")
-	assert.NotNil(t, customTask)
-	assert.NotNil(t, builderTask)
-	assert.NotNil(t, publisherTask)
-	assert.Equal(t, 3, len(env.Pipeline))
+
+	assert.Equal(t, 4, len(env.Pipeline))
 	assert.Equal(t, "test", customTask.Custom.Name)
 	assert.Equal(t, "alpine", customTask.Custom.ContainerImage)
-	assert.Equal(t, "ls", customTask.Custom.ContainerCommand)
+	assert.Equal(t, "ls", customTask.Custom.ContainerCommands[0])
 }
 
 func TestCustomTaskBuilderTraitInvalidStrategy(t *testing.T) {
@@ -315,3 +316,63 @@ func TestMavenBuilderTraitJib(t *testing.T) {
 		},
 	}, env.Pipeline[0].Builder.Maven.MavenSpec.Profiles[0])
 }
+
+func TestBuilderCustomTasks(t *testing.T) {
+	builderTrait := createNominalBuilderTraitTest()
+	builderTrait.Tasks = append(builderTrait.Tasks, "test;alpine;ls")
+	builderTrait.Tasks = append(builderTrait.Tasks, `test;alpine;"mvn test"`)
+
+	tasks, err := builderTrait.customTasks()
+
+	assert.Nil(t, err)
+	assert.Equal(t, 2, len(tasks))
+	assert.Equal(t, "test", tasks[0].Custom.Name)
+	assert.Equal(t, "alpine", tasks[0].Custom.ContainerImage)
+	assert.Equal(t, "ls", tasks[0].Custom.ContainerCommands[0])
+	assert.Equal(t, "test", tasks[1].Custom.Name)
+	assert.Equal(t, "alpine", tasks[1].Custom.ContainerImage)
+	assert.Equal(t, "mvn test", tasks[1].Custom.ContainerCommands[0])
+}
+
+func TestBuilderCustomTasksFailure(t *testing.T) {
+	builderTrait := createNominalBuilderTraitTest()
+	builderTrait.Tasks = append(builderTrait.Tasks, "test;alpine")
+
+	_, err := builderTrait.customTasks()
+
+	assert.NotNil(t, err)
+}
+
+func TestBuilderCustomTasksScript(t *testing.T) {
+	builderTrait := createNominalBuilderTraitTest()
+	builderTrait.Tasks = append(builderTrait.Tasks, "test;alpine;/bin/bash -c \"cd test && ls; echo 'helooo'\"")
+
+	tasks, err := builderTrait.customTasks()
+
+	assert.Nil(t, err)
+	assert.Equal(t, 1, len(tasks))
+	assert.Equal(t, "test", tasks[0].Custom.Name)
+	assert.Equal(t, "alpine", tasks[0].Custom.ContainerImage)
+	assert.Equal(t, "/bin/bash", tasks[0].Custom.ContainerCommands[0])
+	assert.Equal(t, "-c", tasks[0].Custom.ContainerCommands[1])
+	assert.Equal(t, "cd test && ls; echo 'helooo'", tasks[0].Custom.ContainerCommands[2])
+}
+
+func TestUserTaskCommands(t *testing.T) {
+	command := `/bin/bash -c "ls && echo 'hello' && $(cat /path/to/a/resource)"`
+	podCommands := splitContainerCommand(command)
+
+	assert.Len(t, podCommands, 3)
+	assert.Equal(t, "/bin/bash", podCommands[0])
+	assert.Equal(t, "-c", podCommands[1])
+	assert.Equal(t, "ls && echo 'hello' && $(cat /path/to/a/resource)", podCommands[2])
+}
+
+func TestUserTaskSingleCommand(t *testing.T) {
+	command := `cat /path/to/a/resource`
+	podCommands := splitContainerCommand(command)
+
+	assert.Len(t, podCommands, 2)
+	assert.Equal(t, "cat", podCommands[0])
+	assert.Equal(t, "/path/to/a/resource", podCommands[1])
+}
diff --git a/pkg/trait/quarkus.go b/pkg/trait/quarkus.go
index 11c4fdfaf..9bec0c22a 100644
--- a/pkg/trait/quarkus.go
+++ b/pkg/trait/quarkus.go
@@ -40,8 +40,9 @@ const (
 )
 
 var kitPriority = map[traitv1.QuarkusPackageType]string{
-	traitv1.FastJarPackageType: "1000",
-	traitv1.NativePackageType:  "2000",
+	traitv1.FastJarPackageType:       "1000",
+	traitv1.NativeSourcesPackageType: "2000",
+	traitv1.NativePackageType:        "2100",
 }
 
 type quarkusTrait struct {
@@ -261,7 +262,7 @@ func (t *quarkusTrait) newIntegrationKit(e *Environment, packageType traitv1.Qua
 		Traits:       propagateKitTraits(e),
 	}
 
-	if packageType == traitv1.NativePackageType {
+	if packageType == traitv1.NativePackageType || packageType == traitv1.NativeSourcesPackageType {
 		kit.Spec.Sources = propagateSourcesRequiredAtBuildTime(e)
 	}
 	return kit
@@ -290,21 +291,29 @@ func propagateKitTraits(e *Environment) v1.IntegrationKitTraits {
 }
 
 func (t *quarkusTrait) applyWhenBuildSubmitted(e *Environment) error {
-	build := getBuilderTask(e.Pipeline)
-	if build == nil {
+	buildTask := getBuilderTask(e.Pipeline)
+	if buildTask == nil {
 		return fmt.Errorf("unable to find builder task: %s", e.Integration.Name)
 	}
+	packageTask := getPackageTask(e.Pipeline)
+	if packageTask == nil {
+		return fmt.Errorf("unable to find package task: %s", e.Integration.Name)
+	}
 
-	if build.Maven.Properties == nil {
-		build.Maven.Properties = make(map[string]string)
+	buildSteps, err := builder.StepsFrom(buildTask.Steps...)
+	if err != nil {
+		return err
 	}
+	buildSteps = append(buildSteps, builder.Quarkus.CommonSteps...)
 
-	steps, err := builder.StepsFrom(build.Steps...)
+	packageSteps, err := builder.StepsFrom(packageTask.Steps...)
 	if err != nil {
 		return err
 	}
 
-	steps = append(steps, builder.Quarkus.CommonSteps...)
+	if buildTask.Maven.Properties == nil {
+		buildTask.Maven.Properties = make(map[string]string)
+	}
 
 	native, err := t.isNativeKit(e)
 	if err != nil {
@@ -312,31 +321,35 @@ func (t *quarkusTrait) applyWhenBuildSubmitted(e *Environment) error {
 	}
 
 	if native {
-		build.Maven.Properties["quarkus.package.type"] = string(traitv1.NativePackageType)
+		buildTask.Maven.Properties["quarkus.package.type"] = string(traitv1.NativeSourcesPackageType)
 		if len(e.IntegrationKit.Spec.Sources) > 0 {
-			build.Sources = e.IntegrationKit.Spec.Sources
-			steps = append(steps, builder.Quarkus.PrepareProjectWithSources)
-		}
-		steps = append(steps, builder.Image.NativeImageContext)
-		// Spectrum does not rely on Dockerfile to assemble the image
-		if e.Platform.Status.Build.PublishStrategy != v1.IntegrationPlatformBuildPublishStrategySpectrum && e.Platform.Status.Build.PublishStrategy != v1.IntegrationPlatformBuildPublishStrategyJib {
-			steps = append(steps, builder.Image.ExecutableDockerfile)
+			buildTask.Sources = e.IntegrationKit.Spec.Sources
+			buildSteps = append(buildSteps, builder.Quarkus.PrepareProjectWithSources)
 		}
+		packageSteps = append(packageSteps, builder.Image.NativeImageContext)
+		// Create the dockerfile, regardless it's later used or not by the publish strategy
+		packageSteps = append(packageSteps, builder.Image.ExecutableDockerfile)
 	} else {
-		build.Maven.Properties["quarkus.package.type"] = string(traitv1.FastJarPackageType)
-		steps = append(steps, builder.Quarkus.ComputeQuarkusDependencies, builder.Image.IncrementalImageContext)
-		// Spectrum does not rely on Dockerfile to assemble the image
-		if e.Platform.Status.Build.PublishStrategy != v1.IntegrationPlatformBuildPublishStrategySpectrum && e.Platform.Status.Build.PublishStrategy != v1.IntegrationPlatformBuildPublishStrategyJib {
-			steps = append(steps, builder.Image.JvmDockerfile)
-		}
+		// Default, if nothing is specified
+		buildTask.Maven.Properties["quarkus.package.type"] = string(traitv1.FastJarPackageType)
+		packageSteps = append(packageSteps, builder.Quarkus.ComputeQuarkusDependencies)
+		// The LoadCamelQuarkusCatalog is required to have catalog information available by the builder
+		packageSteps = append(packageSteps, builder.Quarkus.LoadCamelQuarkusCatalog)
+		packageSteps = append(packageSteps, builder.Image.IncrementalImageContext)
+		// Create the dockerfile, regardless it's later used or not by the publish strategy
+		packageSteps = append(packageSteps, builder.Image.JvmDockerfile)
 	}
 
 	// Sort steps by phase
-	sort.SliceStable(steps, func(i, j int) bool {
-		return steps[i].Phase() < steps[j].Phase()
+	sort.SliceStable(buildSteps, func(i, j int) bool {
+		return buildSteps[i].Phase() < buildSteps[j].Phase()
+	})
+	sort.SliceStable(packageSteps, func(i, j int) bool {
+		return packageSteps[i].Phase() < packageSteps[j].Phase()
 	})
 
-	build.Steps = builder.StepIDsFor(steps...)
+	buildTask.Steps = builder.StepIDsFor(buildSteps...)
+	packageTask.Steps = builder.StepIDsFor(packageSteps...)
 
 	return nil
 }
@@ -346,7 +359,7 @@ func (t *quarkusTrait) isNativeKit(e *Environment) (bool, error) {
 	case 0:
 		return false, nil
 	case 1:
-		return types[0] == traitv1.NativePackageType, nil
+		return types[0] == traitv1.NativePackageType || types[0] == traitv1.NativeSourcesPackageType, nil
 	default:
 		return false, fmt.Errorf("kit %q has more than one package type", e.IntegrationKit.Name)
 	}
diff --git a/pkg/trait/quarkus_test.go b/pkg/trait/quarkus_test.go
index 3b4ab5de2..331eb8c13 100644
--- a/pkg/trait/quarkus_test.go
+++ b/pkg/trait/quarkus_test.go
@@ -43,8 +43,11 @@ func TestConfigureQuarkusTraitBuildSubmitted(t *testing.T) {
 
 	build := getBuilderTask(environment.Pipeline)
 	assert.NotNil(t, t, build)
+	assert.Len(t, build.Steps, len(builder.Quarkus.CommonSteps))
 
-	assert.Len(t, build.Steps, len(builder.Quarkus.CommonSteps)+3)
+	packageTask := getPackageTask(environment.Pipeline)
+	assert.NotNil(t, t, packageTask)
+	assert.Len(t, packageTask.Steps, 4)
 }
 
 func TestConfigureDisabledQuarkusTraitShouldFail(t *testing.T) {
@@ -109,6 +112,9 @@ func createNominalQuarkusTest() (*quarkusTrait, *Environment) {
 			{
 				Builder: &v1.BuilderTask{},
 			},
+			{
+				Package: &v1.BuilderTask{},
+			},
 		},
 		Platform: &v1.IntegrationPlatform{},
 	}
diff --git a/pkg/trait/util.go b/pkg/trait/util.go
index 0f5f89de1..e047576eb 100644
--- a/pkg/trait/util.go
+++ b/pkg/trait/util.go
@@ -340,6 +340,15 @@ func getBuilderTask(tasks []v1.Task) *v1.BuilderTask {
 	return nil
 }
 
+func getPackageTask(tasks []v1.Task) *v1.BuilderTask {
+	for i, task := range tasks {
+		if task.Package != nil {
+			return tasks[i].Package
+		}
+	}
+	return nil
+}
+
 // Equals return if traits are the same.
 func Equals(i1 Options, i2 Options) bool {
 	return reflect.DeepEqual(i1, i2)
diff --git a/resources/traits.yaml b/resources/traits.yaml
index 5145f1520..20d9e9e19 100755
--- a/resources/traits.yaml
+++ b/resources/traits.yaml
@@ -1304,10 +1304,10 @@ traits:
   - Knative
   - OpenShift
   description: 'The Quarkus trait configures the Quarkus runtime. It''s enabled by
-    default. NOTE: Compiling to a native executable, i.e. when using `package-type=native`,
-    requires at least 4GiB of memory, so the Pod running the native build, that is
-    either the operator Pod, or the build Pod (depending on the build strategy configured
-    for the platform), must have enough memory available.'
+    default. NOTE: A native based compilation will be forced to use a `pod` build
+    strategy. Compiling to a native executable, i.e. when using `package-type=native`,
+    requires at least 4GiB of memory, so the Pod running the native build, must have
+    enough memory available.'
   properties:
   - name: enabled
     type: bool
@@ -1315,12 +1315,13 @@ traits:
       property.
   - name: package-type
     type: '[]github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait.QuarkusPackageType'
-    description: The Quarkus package types, either `fast-jar` or `native` (default
-      `fast-jar`). In case both `fast-jar` and `native` are specified, two `IntegrationKit`
-      resources are created, with the `native` kit having precedence over the `fast-jar`
-      one once ready. The order influences the resolution of the current kit for the
-      integration. The kit corresponding to the first package type will be assigned
-      to the integration in case no existing kit that matches the integration exists.
+    description: The Quarkus package types, `fast-jar`, `native-sources` or `native`
+      (default `fast-jar`). `native` is deprecated. In case both `fast-jar` and `native`
+      or `native-sources` are specified, two `IntegrationKit` resources are created,
+      with the native kit having precedence over the `fast-jar` one once ready. The
+      order influences the resolution of the current kit for the integration. The
+      kit corresponding to the first package type will be assigned to the integration
+      in case no existing kit that matches the integration exists.
 - name: registry
   platform: false
   profiles:


[camel-k] 09/09: fix(e2e): rename quarkus.mode to build-mode

Posted by pc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit aee0c5f9cfbff5f8363bb5d8d06775c3c19fe72f
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Wed Oct 4 10:38:17 2023 +0200

    fix(e2e): rename quarkus.mode to build-mode
    
    It seems that usage of  `mode` create some problem when unmarshalling the CRD
---
 .../bases/camel.apache.org_integrationkits.yaml    | 22 +++++------
 .../camel.apache.org_integrationplatforms.yaml     | 44 +++++++++++-----------
 .../crd/bases/camel.apache.org_integrations.yaml   | 22 +++++------
 .../bases/camel.apache.org_kameletbindings.yaml    | 22 +++++------
 config/crd/bases/camel.apache.org_pipes.yaml       | 22 +++++------
 docs/modules/ROOT/partials/apis/camel-k-crds.adoc  |  6 +--
 docs/modules/traits/pages/quarkus.adoc             |  6 +--
 e2e/builder/build_test.go                          |  2 +-
 e2e/native/native_binding_test.go                  |  2 +-
 e2e/native/native_test.go                          | 10 ++---
 e2e/native/native_with_sources_test.go             | 10 ++---
 helm/camel-k/crds/crd-integration-kit.yaml         | 22 +++++------
 helm/camel-k/crds/crd-integration-platform.yaml    | 44 +++++++++++-----------
 helm/camel-k/crds/crd-integration.yaml             | 22 +++++------
 helm/camel-k/crds/crd-kamelet-binding.yaml         | 22 +++++------
 helm/camel-k/crds/crd-pipe.yaml                    | 22 +++++------
 pkg/apis/camel/v1/trait/quarkus.go                 |  6 +--
 resources/traits.yaml                              |  6 +--
 18 files changed, 156 insertions(+), 156 deletions(-)

diff --git a/config/crd/bases/camel.apache.org_integrationkits.yaml b/config/crd/bases/camel.apache.org_integrationkits.yaml
index b796bc8f4..2a42beee8 100644
--- a/config/crd/bases/camel.apache.org_integrationkits.yaml
+++ b/config/crd/bases/camel.apache.org_integrationkits.yaml
@@ -314,16 +314,7 @@ spec:
                       requires at least 4GiB of memory, so the Pod running the native
                       build must have enough memory available.'
                     properties:
-                      configuration:
-                        description: 'Legacy trait configuration parameters. Deprecated:
-                          for backward compatibility.'
-                        type: object
-                        x-kubernetes-preserve-unknown-fields: true
-                      enabled:
-                        description: Can be used to enable or disable a trait. All
-                          traits share this common property.
-                        type: boolean
-                      mode:
+                      buildMode:
                         description: 'The Quarkus mode to run: either `jvm` or `native`
                           (default `jvm`). In case both `jvm` and `native` are specified,
                           two `IntegrationKit` resources are created, with the `native`
@@ -335,6 +326,15 @@ spec:
                           - native
                           type: string
                         type: array
+                      configuration:
+                        description: 'Legacy trait configuration parameters. Deprecated:
+                          for backward compatibility.'
+                        type: object
+                        x-kubernetes-preserve-unknown-fields: true
+                      enabled:
+                        description: Can be used to enable or disable a trait. All
+                          traits share this common property.
+                        type: boolean
                       packageTypes:
                         description: 'The Quarkus package types, `fast-jar` or `native`
                           (default `fast-jar`). In case both `fast-jar` and `native`
@@ -344,7 +344,7 @@ spec:
                           current kit for the integration. The kit corresponding to
                           the first package type will be assigned to the integration
                           in case no existing kit that matches the integration exists.
-                          Deprecated: use `mode` instead.'
+                          Deprecated: use `build-mode` instead.'
                         items:
                           description: 'QuarkusPackageType is the type of Quarkus
                             build packaging. Deprecated: use `QuarkusMode` instead.'
diff --git a/config/crd/bases/camel.apache.org_integrationplatforms.yaml b/config/crd/bases/camel.apache.org_integrationplatforms.yaml
index 39827cdd4..0f473b801 100644
--- a/config/crd/bases/camel.apache.org_integrationplatforms.yaml
+++ b/config/crd/bases/camel.apache.org_integrationplatforms.yaml
@@ -1607,16 +1607,7 @@ spec:
                   quarkus:
                     description: The configuration of Quarkus trait
                     properties:
-                      configuration:
-                        description: 'Legacy trait configuration parameters. Deprecated:
-                          for backward compatibility.'
-                        type: object
-                        x-kubernetes-preserve-unknown-fields: true
-                      enabled:
-                        description: Can be used to enable or disable a trait. All
-                          traits share this common property.
-                        type: boolean
-                      mode:
+                      buildMode:
                         description: 'The Quarkus mode to run: either `jvm` or `native`
                           (default `jvm`). In case both `jvm` and `native` are specified,
                           two `IntegrationKit` resources are created, with the `native`
@@ -1628,6 +1619,15 @@ spec:
                           - native
                           type: string
                         type: array
+                      configuration:
+                        description: 'Legacy trait configuration parameters. Deprecated:
+                          for backward compatibility.'
+                        type: object
+                        x-kubernetes-preserve-unknown-fields: true
+                      enabled:
+                        description: Can be used to enable or disable a trait. All
+                          traits share this common property.
+                        type: boolean
                       packageTypes:
                         description: 'The Quarkus package types, `fast-jar` or `native`
                           (default `fast-jar`). In case both `fast-jar` and `native`
@@ -1637,7 +1637,7 @@ spec:
                           current kit for the integration. The kit corresponding to
                           the first package type will be assigned to the integration
                           in case no existing kit that matches the integration exists.
-                          Deprecated: use `mode` instead.'
+                          Deprecated: use `build-mode` instead.'
                         items:
                           description: 'QuarkusPackageType is the type of Quarkus
                             build packaging. Deprecated: use `QuarkusMode` instead.'
@@ -3420,16 +3420,7 @@ spec:
                   quarkus:
                     description: The configuration of Quarkus trait
                     properties:
-                      configuration:
-                        description: 'Legacy trait configuration parameters. Deprecated:
-                          for backward compatibility.'
-                        type: object
-                        x-kubernetes-preserve-unknown-fields: true
-                      enabled:
-                        description: Can be used to enable or disable a trait. All
-                          traits share this common property.
-                        type: boolean
-                      mode:
+                      buildMode:
                         description: 'The Quarkus mode to run: either `jvm` or `native`
                           (default `jvm`). In case both `jvm` and `native` are specified,
                           two `IntegrationKit` resources are created, with the `native`
@@ -3441,6 +3432,15 @@ spec:
                           - native
                           type: string
                         type: array
+                      configuration:
+                        description: 'Legacy trait configuration parameters. Deprecated:
+                          for backward compatibility.'
+                        type: object
+                        x-kubernetes-preserve-unknown-fields: true
+                      enabled:
+                        description: Can be used to enable or disable a trait. All
+                          traits share this common property.
+                        type: boolean
                       packageTypes:
                         description: 'The Quarkus package types, `fast-jar` or `native`
                           (default `fast-jar`). In case both `fast-jar` and `native`
@@ -3450,7 +3450,7 @@ spec:
                           current kit for the integration. The kit corresponding to
                           the first package type will be assigned to the integration
                           in case no existing kit that matches the integration exists.
-                          Deprecated: use `mode` instead.'
+                          Deprecated: use `build-mode` instead.'
                         items:
                           description: 'QuarkusPackageType is the type of Quarkus
                             build packaging. Deprecated: use `QuarkusMode` instead.'
diff --git a/config/crd/bases/camel.apache.org_integrations.yaml b/config/crd/bases/camel.apache.org_integrations.yaml
index 21eb27225..9688a46a1 100644
--- a/config/crd/bases/camel.apache.org_integrations.yaml
+++ b/config/crd/bases/camel.apache.org_integrations.yaml
@@ -7524,16 +7524,7 @@ spec:
                   quarkus:
                     description: The configuration of Quarkus trait
                     properties:
-                      configuration:
-                        description: 'Legacy trait configuration parameters. Deprecated:
-                          for backward compatibility.'
-                        type: object
-                        x-kubernetes-preserve-unknown-fields: true
-                      enabled:
-                        description: Can be used to enable or disable a trait. All
-                          traits share this common property.
-                        type: boolean
-                      mode:
+                      buildMode:
                         description: 'The Quarkus mode to run: either `jvm` or `native`
                           (default `jvm`). In case both `jvm` and `native` are specified,
                           two `IntegrationKit` resources are created, with the `native`
@@ -7545,6 +7536,15 @@ spec:
                           - native
                           type: string
                         type: array
+                      configuration:
+                        description: 'Legacy trait configuration parameters. Deprecated:
+                          for backward compatibility.'
+                        type: object
+                        x-kubernetes-preserve-unknown-fields: true
+                      enabled:
+                        description: Can be used to enable or disable a trait. All
+                          traits share this common property.
+                        type: boolean
                       packageTypes:
                         description: 'The Quarkus package types, `fast-jar` or `native`
                           (default `fast-jar`). In case both `fast-jar` and `native`
@@ -7554,7 +7554,7 @@ spec:
                           current kit for the integration. The kit corresponding to
                           the first package type will be assigned to the integration
                           in case no existing kit that matches the integration exists.
-                          Deprecated: use `mode` instead.'
+                          Deprecated: use `build-mode` instead.'
                         items:
                           description: 'QuarkusPackageType is the type of Quarkus
                             build packaging. Deprecated: use `QuarkusMode` instead.'
diff --git a/config/crd/bases/camel.apache.org_kameletbindings.yaml b/config/crd/bases/camel.apache.org_kameletbindings.yaml
index f51b72726..2f5ff7497 100644
--- a/config/crd/bases/camel.apache.org_kameletbindings.yaml
+++ b/config/crd/bases/camel.apache.org_kameletbindings.yaml
@@ -7819,16 +7819,7 @@ spec:
                       quarkus:
                         description: The configuration of Quarkus trait
                         properties:
-                          configuration:
-                            description: 'Legacy trait configuration parameters. Deprecated:
-                              for backward compatibility.'
-                            type: object
-                            x-kubernetes-preserve-unknown-fields: true
-                          enabled:
-                            description: Can be used to enable or disable a trait.
-                              All traits share this common property.
-                            type: boolean
-                          mode:
+                          buildMode:
                             description: 'The Quarkus mode to run: either `jvm` or
                               `native` (default `jvm`). In case both `jvm` and `native`
                               are specified, two `IntegrationKit` resources are created,
@@ -7842,6 +7833,15 @@ spec:
                               - native
                               type: string
                             type: array
+                          configuration:
+                            description: 'Legacy trait configuration parameters. Deprecated:
+                              for backward compatibility.'
+                            type: object
+                            x-kubernetes-preserve-unknown-fields: true
+                          enabled:
+                            description: Can be used to enable or disable a trait.
+                              All traits share this common property.
+                            type: boolean
                           packageTypes:
                             description: 'The Quarkus package types, `fast-jar` or
                               `native` (default `fast-jar`). In case both `fast-jar`
@@ -7852,7 +7852,7 @@ spec:
                               The kit corresponding to the first package type will
                               be assigned to the integration in case no existing kit
                               that matches the integration exists. Deprecated: use
-                              `mode` instead.'
+                              `build-mode` instead.'
                             items:
                               description: 'QuarkusPackageType is the type of Quarkus
                                 build packaging. Deprecated: use `QuarkusMode` instead.'
diff --git a/config/crd/bases/camel.apache.org_pipes.yaml b/config/crd/bases/camel.apache.org_pipes.yaml
index f58e4be83..5bf2d8ff0 100644
--- a/config/crd/bases/camel.apache.org_pipes.yaml
+++ b/config/crd/bases/camel.apache.org_pipes.yaml
@@ -7816,16 +7816,7 @@ spec:
                       quarkus:
                         description: The configuration of Quarkus trait
                         properties:
-                          configuration:
-                            description: 'Legacy trait configuration parameters. Deprecated:
-                              for backward compatibility.'
-                            type: object
-                            x-kubernetes-preserve-unknown-fields: true
-                          enabled:
-                            description: Can be used to enable or disable a trait.
-                              All traits share this common property.
-                            type: boolean
-                          mode:
+                          buildMode:
                             description: 'The Quarkus mode to run: either `jvm` or
                               `native` (default `jvm`). In case both `jvm` and `native`
                               are specified, two `IntegrationKit` resources are created,
@@ -7839,6 +7830,15 @@ spec:
                               - native
                               type: string
                             type: array
+                          configuration:
+                            description: 'Legacy trait configuration parameters. Deprecated:
+                              for backward compatibility.'
+                            type: object
+                            x-kubernetes-preserve-unknown-fields: true
+                          enabled:
+                            description: Can be used to enable or disable a trait.
+                              All traits share this common property.
+                            type: boolean
                           packageTypes:
                             description: 'The Quarkus package types, `fast-jar` or
                               `native` (default `fast-jar`). In case both `fast-jar`
@@ -7849,7 +7849,7 @@ spec:
                               The kit corresponding to the first package type will
                               be assigned to the integration in case no existing kit
                               that matches the integration exists. Deprecated: use
-                              `mode` instead.'
+                              `build-mode` instead.'
                             items:
                               description: 'QuarkusPackageType is the type of Quarkus
                                 build packaging. Deprecated: use `QuarkusMode` instead.'
diff --git a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
index bba0ee6ac..39fe3ed4c 100644
--- a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
+++ b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
@@ -7613,7 +7613,7 @@ The Quarkus trait configures the Quarkus runtime.
 It's enabled by default.
 
 NOTE: A native based compilation will be forced to use a `pod` build strategy.
-Compiling to a native executable, i.e. when using `package-type=native`, requires at least
+Compiling to a native executable, i.e. when using `build-mode=native`, requires at least
 4GiB of memory, so the Pod running the native build, must have enough memory available.
 
 
@@ -7640,9 +7640,9 @@ with the native kit having precedence over the `fast-jar` one once ready.
 The order influences the resolution of the current kit for the integration.
 The kit corresponding to the first package type will be assigned to the
 integration in case no existing kit that matches the integration exists.
-Deprecated: use `mode` instead.
+Deprecated: use `build-mode` instead.
 
-|`mode` +
+|`buildMode` +
 *xref:#_camel_apache_org_v1_trait_QuarkusMode[[\]QuarkusMode]*
 |
 
diff --git a/docs/modules/traits/pages/quarkus.adoc b/docs/modules/traits/pages/quarkus.adoc
index d015deadc..77a7ce021 100755
--- a/docs/modules/traits/pages/quarkus.adoc
+++ b/docs/modules/traits/pages/quarkus.adoc
@@ -6,7 +6,7 @@ The Quarkus trait configures the Quarkus runtime.
 It's enabled by default.
 
 NOTE: A native based compilation will be forced to use a `pod` build strategy.
-Compiling to a native executable, i.e. when using `package-type=native`, requires at least
+Compiling to a native executable, i.e. when using `build-mode=native`, requires at least
 4GiB of memory, so the Pod running the native build, must have enough memory available.
 
 
@@ -41,9 +41,9 @@ with the native kit having precedence over the `fast-jar` one once ready.
 The order influences the resolution of the current kit for the integration.
 The kit corresponding to the first package type will be assigned to the
 integration in case no existing kit that matches the integration exists.
-Deprecated: use `mode` instead.
+Deprecated: use `build-mode` instead.
 
-| quarkus.mode
+| quarkus.build-mode
 | []github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait.QuarkusMode
 | The Quarkus mode to run: either `jvm` or `native` (default `jvm`).
 In case both `jvm` and `native` are specified, two `IntegrationKit` resources are created,
diff --git a/e2e/builder/build_test.go b/e2e/builder/build_test.go
index 204fd7d80..f449f0ef2 100644
--- a/e2e/builder/build_test.go
+++ b/e2e/builder/build_test.go
@@ -310,7 +310,7 @@ func TestKitTimerToLogFullNativeBuild(t *testing.T) {
 			"camel:timer", "camel:log",
 		},
 		traits: []string{
-			"quarkus.mode=native",
+			"quarkus.build-mode=native",
 		},
 	}, v1.BuildPhaseSucceeded, v1.IntegrationKitPhaseReady)
 }
diff --git a/e2e/native/native_binding_test.go b/e2e/native/native_binding_test.go
index 0f754dffa..4ee9ad92d 100644
--- a/e2e/native/native_binding_test.go
+++ b/e2e/native/native_binding_test.go
@@ -45,7 +45,7 @@ func TestNativeBinding(t *testing.T) {
 				"timer-source",
 				"log-sink",
 				"-p", "source.message="+message,
-				"--annotation", "trait.camel.apache.org/quarkus.mode=native",
+				"--annotation", "trait.camel.apache.org/quarkus.build-mode=native",
 				"--annotation", "trait.camel.apache.org/builder.tasks-limit-memory=quarkus-native:6.5Gi",
 				"--name", bindingName,
 			).Execute()).To(Succeed())
diff --git a/e2e/native/native_test.go b/e2e/native/native_test.go
index 2a60b36ea..265080ce7 100644
--- a/e2e/native/native_test.go
+++ b/e2e/native/native_test.go
@@ -45,7 +45,7 @@ func TestNativeIntegrations(t *testing.T) {
 		t.Run("unsupported integration source language", func(t *testing.T) {
 			name := "unsupported-js"
 			Expect(KamelRunWithID(operatorID, ns, "files/JavaScript.js", "--name", name,
-				"-t", "quarkus.mode=native",
+				"-t", "quarkus.build-mode=native",
 				"-t", "builder.tasks-limit-memory=quarkus-native:6.5Gi",
 			).Execute()).To(Succeed())
 
@@ -60,7 +60,7 @@ func TestNativeIntegrations(t *testing.T) {
 		t.Run("xml native support", func(t *testing.T) {
 			name := "xml-native"
 			Expect(KamelRunWithID(operatorID, ns, "files/Xml.xml", "--name", name,
-				"-t", "quarkus.mode=native",
+				"-t", "quarkus.build-mode=native",
 				"-t", "builder.tasks-limit-memory=quarkus-native:6.5Gi",
 			).Execute()).To(Succeed())
 
@@ -81,8 +81,8 @@ func TestNativeIntegrations(t *testing.T) {
 			Expect(DeleteKits(ns)).To(Succeed())
 			name := "yaml-native"
 			Expect(KamelRunWithID(operatorID, ns, "files/yaml.yaml", "--name", name,
-				"-t", "quarkus.mode=jvm",
-				"-t", "quarkus.mode=native",
+				"-t", "quarkus.build-mode=jvm",
+				"-t", "quarkus.build-mode=native",
 				"-t", "builder.tasks-limit-memory=quarkus-native:6.5Gi",
 			).Execute()).To(Succeed())
 
@@ -134,7 +134,7 @@ func TestNativeIntegrations(t *testing.T) {
 			t.Run("yaml native should not rebuild", func(t *testing.T) {
 				name := "yaml-native-2"
 				Expect(KamelRunWithID(operatorID, ns, "files/yaml2.yaml", "--name", name,
-					"-t", "quarkus.mode=native",
+					"-t", "quarkus.build-mode=native",
 					"-t", "builder.tasks-limit-memory=quarkus-native:6.5Gi",
 				).Execute()).To(Succeed())
 
diff --git a/e2e/native/native_with_sources_test.go b/e2e/native/native_with_sources_test.go
index 513479928..fd9304c5c 100644
--- a/e2e/native/native_with_sources_test.go
+++ b/e2e/native/native_with_sources_test.go
@@ -44,7 +44,7 @@ func TestNativeHighMemoryIntegrations(t *testing.T) {
 		t.Run("java native support", func(t *testing.T) {
 			name := "java-native"
 			Expect(KamelRunWithID(operatorID, ns, "files/Java.java", "--name", name,
-				"-t", "quarkus.mode=native",
+				"-t", "quarkus.build-mode=native",
 				"-t", "builder.tasks-limit-memory=quarkus-native:9.5Gi",
 			).Execute()).To(Succeed())
 
@@ -58,7 +58,7 @@ func TestNativeHighMemoryIntegrations(t *testing.T) {
 			t.Run("java native same should not rebuild", func(t *testing.T) {
 				name := "java-native-clone"
 				Expect(KamelRunWithID(operatorID, ns, "files/Java.java", "--name", name,
-					"-t", "quarkus.mode=native",
+					"-t", "quarkus.build-mode=native",
 					"-t", "builder.tasks-limit-memory=quarkus-native:9.5Gi",
 				).Execute()).To(Succeed())
 
@@ -75,7 +75,7 @@ func TestNativeHighMemoryIntegrations(t *testing.T) {
 			t.Run("java native should rebuild", func(t *testing.T) {
 				name := "java-native-2"
 				Expect(KamelRunWithID(operatorID, ns, "files/Java2.java", "--name", name,
-					"-t", "quarkus.mode=native",
+					"-t", "quarkus.build-mode=native",
 					"-t", "builder.tasks-limit-memory=quarkus-native:9.5Gi",
 				).Execute()).To(Succeed())
 
@@ -95,7 +95,7 @@ func TestNativeHighMemoryIntegrations(t *testing.T) {
 		t.Run("groovy native support", func(t *testing.T) {
 			name := "groovy-native"
 			Expect(KamelRunWithID(operatorID, ns, "files/Groovy.groovy", "--name", name,
-				"-t", "quarkus.mode=native",
+				"-t", "quarkus.build-mode=native",
 				"-t", "builder.tasks-limit-memory=quarkus-native:9.5Gi",
 			).Execute()).To(Succeed())
 
@@ -114,7 +114,7 @@ func TestNativeHighMemoryIntegrations(t *testing.T) {
 		t.Run("kotlin native support", func(t *testing.T) {
 			name := "kotlin-native"
 			Expect(KamelRunWithID(operatorID, ns, "files/Kotlin.kts", "--name", name,
-				"-t", "quarkus.mode=native",
+				"-t", "quarkus.build-mode=native",
 				"-t", "builder.tasks-limit-memory=quarkus-native:9.5Gi",
 			).Execute()).To(Succeed())
 
diff --git a/helm/camel-k/crds/crd-integration-kit.yaml b/helm/camel-k/crds/crd-integration-kit.yaml
index b796bc8f4..2a42beee8 100644
--- a/helm/camel-k/crds/crd-integration-kit.yaml
+++ b/helm/camel-k/crds/crd-integration-kit.yaml
@@ -314,16 +314,7 @@ spec:
                       requires at least 4GiB of memory, so the Pod running the native
                       build must have enough memory available.'
                     properties:
-                      configuration:
-                        description: 'Legacy trait configuration parameters. Deprecated:
-                          for backward compatibility.'
-                        type: object
-                        x-kubernetes-preserve-unknown-fields: true
-                      enabled:
-                        description: Can be used to enable or disable a trait. All
-                          traits share this common property.
-                        type: boolean
-                      mode:
+                      buildMode:
                         description: 'The Quarkus mode to run: either `jvm` or `native`
                           (default `jvm`). In case both `jvm` and `native` are specified,
                           two `IntegrationKit` resources are created, with the `native`
@@ -335,6 +326,15 @@ spec:
                           - native
                           type: string
                         type: array
+                      configuration:
+                        description: 'Legacy trait configuration parameters. Deprecated:
+                          for backward compatibility.'
+                        type: object
+                        x-kubernetes-preserve-unknown-fields: true
+                      enabled:
+                        description: Can be used to enable or disable a trait. All
+                          traits share this common property.
+                        type: boolean
                       packageTypes:
                         description: 'The Quarkus package types, `fast-jar` or `native`
                           (default `fast-jar`). In case both `fast-jar` and `native`
@@ -344,7 +344,7 @@ spec:
                           current kit for the integration. The kit corresponding to
                           the first package type will be assigned to the integration
                           in case no existing kit that matches the integration exists.
-                          Deprecated: use `mode` instead.'
+                          Deprecated: use `build-mode` instead.'
                         items:
                           description: 'QuarkusPackageType is the type of Quarkus
                             build packaging. Deprecated: use `QuarkusMode` instead.'
diff --git a/helm/camel-k/crds/crd-integration-platform.yaml b/helm/camel-k/crds/crd-integration-platform.yaml
index 39827cdd4..0f473b801 100644
--- a/helm/camel-k/crds/crd-integration-platform.yaml
+++ b/helm/camel-k/crds/crd-integration-platform.yaml
@@ -1607,16 +1607,7 @@ spec:
                   quarkus:
                     description: The configuration of Quarkus trait
                     properties:
-                      configuration:
-                        description: 'Legacy trait configuration parameters. Deprecated:
-                          for backward compatibility.'
-                        type: object
-                        x-kubernetes-preserve-unknown-fields: true
-                      enabled:
-                        description: Can be used to enable or disable a trait. All
-                          traits share this common property.
-                        type: boolean
-                      mode:
+                      buildMode:
                         description: 'The Quarkus mode to run: either `jvm` or `native`
                           (default `jvm`). In case both `jvm` and `native` are specified,
                           two `IntegrationKit` resources are created, with the `native`
@@ -1628,6 +1619,15 @@ spec:
                           - native
                           type: string
                         type: array
+                      configuration:
+                        description: 'Legacy trait configuration parameters. Deprecated:
+                          for backward compatibility.'
+                        type: object
+                        x-kubernetes-preserve-unknown-fields: true
+                      enabled:
+                        description: Can be used to enable or disable a trait. All
+                          traits share this common property.
+                        type: boolean
                       packageTypes:
                         description: 'The Quarkus package types, `fast-jar` or `native`
                           (default `fast-jar`). In case both `fast-jar` and `native`
@@ -1637,7 +1637,7 @@ spec:
                           current kit for the integration. The kit corresponding to
                           the first package type will be assigned to the integration
                           in case no existing kit that matches the integration exists.
-                          Deprecated: use `mode` instead.'
+                          Deprecated: use `build-mode` instead.'
                         items:
                           description: 'QuarkusPackageType is the type of Quarkus
                             build packaging. Deprecated: use `QuarkusMode` instead.'
@@ -3420,16 +3420,7 @@ spec:
                   quarkus:
                     description: The configuration of Quarkus trait
                     properties:
-                      configuration:
-                        description: 'Legacy trait configuration parameters. Deprecated:
-                          for backward compatibility.'
-                        type: object
-                        x-kubernetes-preserve-unknown-fields: true
-                      enabled:
-                        description: Can be used to enable or disable a trait. All
-                          traits share this common property.
-                        type: boolean
-                      mode:
+                      buildMode:
                         description: 'The Quarkus mode to run: either `jvm` or `native`
                           (default `jvm`). In case both `jvm` and `native` are specified,
                           two `IntegrationKit` resources are created, with the `native`
@@ -3441,6 +3432,15 @@ spec:
                           - native
                           type: string
                         type: array
+                      configuration:
+                        description: 'Legacy trait configuration parameters. Deprecated:
+                          for backward compatibility.'
+                        type: object
+                        x-kubernetes-preserve-unknown-fields: true
+                      enabled:
+                        description: Can be used to enable or disable a trait. All
+                          traits share this common property.
+                        type: boolean
                       packageTypes:
                         description: 'The Quarkus package types, `fast-jar` or `native`
                           (default `fast-jar`). In case both `fast-jar` and `native`
@@ -3450,7 +3450,7 @@ spec:
                           current kit for the integration. The kit corresponding to
                           the first package type will be assigned to the integration
                           in case no existing kit that matches the integration exists.
-                          Deprecated: use `mode` instead.'
+                          Deprecated: use `build-mode` instead.'
                         items:
                           description: 'QuarkusPackageType is the type of Quarkus
                             build packaging. Deprecated: use `QuarkusMode` instead.'
diff --git a/helm/camel-k/crds/crd-integration.yaml b/helm/camel-k/crds/crd-integration.yaml
index 21eb27225..9688a46a1 100644
--- a/helm/camel-k/crds/crd-integration.yaml
+++ b/helm/camel-k/crds/crd-integration.yaml
@@ -7524,16 +7524,7 @@ spec:
                   quarkus:
                     description: The configuration of Quarkus trait
                     properties:
-                      configuration:
-                        description: 'Legacy trait configuration parameters. Deprecated:
-                          for backward compatibility.'
-                        type: object
-                        x-kubernetes-preserve-unknown-fields: true
-                      enabled:
-                        description: Can be used to enable or disable a trait. All
-                          traits share this common property.
-                        type: boolean
-                      mode:
+                      buildMode:
                         description: 'The Quarkus mode to run: either `jvm` or `native`
                           (default `jvm`). In case both `jvm` and `native` are specified,
                           two `IntegrationKit` resources are created, with the `native`
@@ -7545,6 +7536,15 @@ spec:
                           - native
                           type: string
                         type: array
+                      configuration:
+                        description: 'Legacy trait configuration parameters. Deprecated:
+                          for backward compatibility.'
+                        type: object
+                        x-kubernetes-preserve-unknown-fields: true
+                      enabled:
+                        description: Can be used to enable or disable a trait. All
+                          traits share this common property.
+                        type: boolean
                       packageTypes:
                         description: 'The Quarkus package types, `fast-jar` or `native`
                           (default `fast-jar`). In case both `fast-jar` and `native`
@@ -7554,7 +7554,7 @@ spec:
                           current kit for the integration. The kit corresponding to
                           the first package type will be assigned to the integration
                           in case no existing kit that matches the integration exists.
-                          Deprecated: use `mode` instead.'
+                          Deprecated: use `build-mode` instead.'
                         items:
                           description: 'QuarkusPackageType is the type of Quarkus
                             build packaging. Deprecated: use `QuarkusMode` instead.'
diff --git a/helm/camel-k/crds/crd-kamelet-binding.yaml b/helm/camel-k/crds/crd-kamelet-binding.yaml
index f51b72726..2f5ff7497 100644
--- a/helm/camel-k/crds/crd-kamelet-binding.yaml
+++ b/helm/camel-k/crds/crd-kamelet-binding.yaml
@@ -7819,16 +7819,7 @@ spec:
                       quarkus:
                         description: The configuration of Quarkus trait
                         properties:
-                          configuration:
-                            description: 'Legacy trait configuration parameters. Deprecated:
-                              for backward compatibility.'
-                            type: object
-                            x-kubernetes-preserve-unknown-fields: true
-                          enabled:
-                            description: Can be used to enable or disable a trait.
-                              All traits share this common property.
-                            type: boolean
-                          mode:
+                          buildMode:
                             description: 'The Quarkus mode to run: either `jvm` or
                               `native` (default `jvm`). In case both `jvm` and `native`
                               are specified, two `IntegrationKit` resources are created,
@@ -7842,6 +7833,15 @@ spec:
                               - native
                               type: string
                             type: array
+                          configuration:
+                            description: 'Legacy trait configuration parameters. Deprecated:
+                              for backward compatibility.'
+                            type: object
+                            x-kubernetes-preserve-unknown-fields: true
+                          enabled:
+                            description: Can be used to enable or disable a trait.
+                              All traits share this common property.
+                            type: boolean
                           packageTypes:
                             description: 'The Quarkus package types, `fast-jar` or
                               `native` (default `fast-jar`). In case both `fast-jar`
@@ -7852,7 +7852,7 @@ spec:
                               The kit corresponding to the first package type will
                               be assigned to the integration in case no existing kit
                               that matches the integration exists. Deprecated: use
-                              `mode` instead.'
+                              `build-mode` instead.'
                             items:
                               description: 'QuarkusPackageType is the type of Quarkus
                                 build packaging. Deprecated: use `QuarkusMode` instead.'
diff --git a/helm/camel-k/crds/crd-pipe.yaml b/helm/camel-k/crds/crd-pipe.yaml
index f58e4be83..5bf2d8ff0 100644
--- a/helm/camel-k/crds/crd-pipe.yaml
+++ b/helm/camel-k/crds/crd-pipe.yaml
@@ -7816,16 +7816,7 @@ spec:
                       quarkus:
                         description: The configuration of Quarkus trait
                         properties:
-                          configuration:
-                            description: 'Legacy trait configuration parameters. Deprecated:
-                              for backward compatibility.'
-                            type: object
-                            x-kubernetes-preserve-unknown-fields: true
-                          enabled:
-                            description: Can be used to enable or disable a trait.
-                              All traits share this common property.
-                            type: boolean
-                          mode:
+                          buildMode:
                             description: 'The Quarkus mode to run: either `jvm` or
                               `native` (default `jvm`). In case both `jvm` and `native`
                               are specified, two `IntegrationKit` resources are created,
@@ -7839,6 +7830,15 @@ spec:
                               - native
                               type: string
                             type: array
+                          configuration:
+                            description: 'Legacy trait configuration parameters. Deprecated:
+                              for backward compatibility.'
+                            type: object
+                            x-kubernetes-preserve-unknown-fields: true
+                          enabled:
+                            description: Can be used to enable or disable a trait.
+                              All traits share this common property.
+                            type: boolean
                           packageTypes:
                             description: 'The Quarkus package types, `fast-jar` or
                               `native` (default `fast-jar`). In case both `fast-jar`
@@ -7849,7 +7849,7 @@ spec:
                               The kit corresponding to the first package type will
                               be assigned to the integration in case no existing kit
                               that matches the integration exists. Deprecated: use
-                              `mode` instead.'
+                              `build-mode` instead.'
                             items:
                               description: 'QuarkusPackageType is the type of Quarkus
                                 build packaging. Deprecated: use `QuarkusMode` instead.'
diff --git a/pkg/apis/camel/v1/trait/quarkus.go b/pkg/apis/camel/v1/trait/quarkus.go
index fb1f36f89..823bfa10b 100644
--- a/pkg/apis/camel/v1/trait/quarkus.go
+++ b/pkg/apis/camel/v1/trait/quarkus.go
@@ -22,7 +22,7 @@ package trait
 // It's enabled by default.
 //
 // NOTE: A native based compilation will be forced to use a `pod` build strategy.
-// Compiling to a native executable, i.e. when using `package-type=native`, requires at least
+// Compiling to a native executable, i.e. when using `build-mode=native`, requires at least
 // 4GiB of memory, so the Pod running the native build, must have enough memory available.
 //
 // +camel-k:trait=quarkus.
@@ -34,12 +34,12 @@ type QuarkusTrait struct {
 	// The order influences the resolution of the current kit for the integration.
 	// The kit corresponding to the first package type will be assigned to the
 	// integration in case no existing kit that matches the integration exists.
-	// Deprecated: use `mode` instead.
+	// Deprecated: use `build-mode` instead.
 	PackageTypes []QuarkusPackageType `property:"package-type" json:"packageTypes,omitempty"`
 	// The Quarkus mode to run: either `jvm` or `native` (default `jvm`).
 	// In case both `jvm` and `native` are specified, two `IntegrationKit` resources are created,
 	// with the `native` kit having precedence over the `jvm` one once ready.
-	Modes []QuarkusMode `property:"mode" json:"mode,omitempty"`
+	Modes []QuarkusMode `property:"build-mode" json:"buildMode,omitempty"`
 }
 
 // QuarkusMode is the type of Quarkus build packaging.
diff --git a/resources/traits.yaml b/resources/traits.yaml
index 2f2a340ce..8a0e7c586 100755
--- a/resources/traits.yaml
+++ b/resources/traits.yaml
@@ -1321,7 +1321,7 @@ traits:
   - OpenShift
   description: 'The Quarkus trait configures the Quarkus runtime. It''s enabled by
     default. NOTE: A native based compilation will be forced to use a `pod` build
-    strategy. Compiling to a native executable, i.e. when using `package-type=native`,
+    strategy. Compiling to a native executable, i.e. when using `build-mode=native`,
     requires at least 4GiB of memory, so the Pod running the native build, must have
     enough memory available.'
   properties:
@@ -1337,8 +1337,8 @@ traits:
       ready. The order influences the resolution of the current kit for the integration.
       The kit corresponding to the first package type will be assigned to the integration
       in case no existing kit that matches the integration exists. Deprecated: use
-      `mode` instead.'
-  - name: mode
+      `build-mode` instead.'
+  - name: build-mode
     type: '[]github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait.QuarkusMode'
     description: 'The Quarkus mode to run: either `jvm` or `native` (default `jvm`).
       In case both `jvm` and `native` are specified, two `IntegrationKit` resources


[camel-k] 08/09: fix(trait): run old native process for runtime pre 3.5.0

Posted by pc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit de0d1af6345a11106ef9207f32fa3e5debd53039
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Mon Oct 2 16:43:57 2023 +0200

    fix(trait): run old native process for runtime pre 3.5.0
---
 .../bases/camel.apache.org_integrationkits.yaml    |  1 -
 .../camel.apache.org_integrationplatforms.yaml     |  2 -
 .../crd/bases/camel.apache.org_integrations.yaml   |  1 -
 .../bases/camel.apache.org_kameletbindings.yaml    |  1 -
 config/crd/bases/camel.apache.org_pipes.yaml       |  1 -
 docs/modules/ROOT/pages/pipeline/pipeline.adoc     |  2 +-
 e2e/common/traits/builder_test.go                  |  5 +-
 .../catalog_builder_test.go                        |  6 +-
 e2e/native/native_test.go                          | 12 +--
 e2e/native/native_with_sources_test.go             | 12 ++-
 helm/camel-k/crds/crd-integration-kit.yaml         |  1 -
 helm/camel-k/crds/crd-integration-platform.yaml    |  2 -
 helm/camel-k/crds/crd-integration.yaml             |  1 -
 helm/camel-k/crds/crd-kamelet-binding.yaml         |  1 -
 helm/camel-k/crds/crd-pipe.yaml                    |  1 -
 pkg/apis/camel/v1/trait/quarkus.go                 |  2 +-
 pkg/builder/image.go                               |  2 +-
 pkg/builder/runtime_support.go                     | 91 ++++++++++++++++++++++
 pkg/trait/builder.go                               | 10 +--
 pkg/trait/builder_test.go                          |  9 ++-
 pkg/trait/quarkus.go                               |  9 ++-
 21 files changed, 127 insertions(+), 45 deletions(-)

diff --git a/config/crd/bases/camel.apache.org_integrationkits.yaml b/config/crd/bases/camel.apache.org_integrationkits.yaml
index f40c04244..b796bc8f4 100644
--- a/config/crd/bases/camel.apache.org_integrationkits.yaml
+++ b/config/crd/bases/camel.apache.org_integrationkits.yaml
@@ -350,7 +350,6 @@ spec:
                             build packaging. Deprecated: use `QuarkusMode` instead.'
                           enum:
                           - fast-jar
-                          - native-sources
                           - native
                           type: string
                         type: array
diff --git a/config/crd/bases/camel.apache.org_integrationplatforms.yaml b/config/crd/bases/camel.apache.org_integrationplatforms.yaml
index b11b568ed..39827cdd4 100644
--- a/config/crd/bases/camel.apache.org_integrationplatforms.yaml
+++ b/config/crd/bases/camel.apache.org_integrationplatforms.yaml
@@ -1643,7 +1643,6 @@ spec:
                             build packaging. Deprecated: use `QuarkusMode` instead.'
                           enum:
                           - fast-jar
-                          - native-sources
                           - native
                           type: string
                         type: array
@@ -3457,7 +3456,6 @@ spec:
                             build packaging. Deprecated: use `QuarkusMode` instead.'
                           enum:
                           - fast-jar
-                          - native-sources
                           - native
                           type: string
                         type: array
diff --git a/config/crd/bases/camel.apache.org_integrations.yaml b/config/crd/bases/camel.apache.org_integrations.yaml
index e59cb1c45..21eb27225 100644
--- a/config/crd/bases/camel.apache.org_integrations.yaml
+++ b/config/crd/bases/camel.apache.org_integrations.yaml
@@ -7560,7 +7560,6 @@ spec:
                             build packaging. Deprecated: use `QuarkusMode` instead.'
                           enum:
                           - fast-jar
-                          - native-sources
                           - native
                           type: string
                         type: array
diff --git a/config/crd/bases/camel.apache.org_kameletbindings.yaml b/config/crd/bases/camel.apache.org_kameletbindings.yaml
index abde245c9..f51b72726 100644
--- a/config/crd/bases/camel.apache.org_kameletbindings.yaml
+++ b/config/crd/bases/camel.apache.org_kameletbindings.yaml
@@ -7858,7 +7858,6 @@ spec:
                                 build packaging. Deprecated: use `QuarkusMode` instead.'
                               enum:
                               - fast-jar
-                              - native-sources
                               - native
                               type: string
                             type: array
diff --git a/config/crd/bases/camel.apache.org_pipes.yaml b/config/crd/bases/camel.apache.org_pipes.yaml
index a8a40da19..f58e4be83 100644
--- a/config/crd/bases/camel.apache.org_pipes.yaml
+++ b/config/crd/bases/camel.apache.org_pipes.yaml
@@ -7855,7 +7855,6 @@ spec:
                                 build packaging. Deprecated: use `QuarkusMode` instead.'
                               enum:
                               - fast-jar
-                              - native-sources
                               - native
                               type: string
                             type: array
diff --git a/docs/modules/ROOT/pages/pipeline/pipeline.adoc b/docs/modules/ROOT/pages/pipeline/pipeline.adoc
index 85bbdf3a8..b204f338c 100644
--- a/docs/modules/ROOT/pages/pipeline/pipeline.adoc
+++ b/docs/modules/ROOT/pages/pipeline/pipeline.adoc
@@ -4,7 +4,7 @@ Since version 2.0, we've introduced the concept of `Pipeline` in order to provid
 
 In Camel K version 1 we used to have 2 static tasks: `builder` and `publisher` (named after the strategy adopted, ie, `spectrum`). Now you can include any further task in the middle by opportunely configuring the Build. Here a diagram illustrating the pipeline:
 
-image::camel_k_pipeline..png[Camel K Pipeline, width=1024]
+image::camel_k_pipeline.png[Camel K Pipeline, width=1024]
 
 We have 3 tasks which are required by Camel K to perform a build and provide a container image which will be used to start a Camel application. The **build** is a Maven process which is in charge to create a maven project based on the Integration sources provided. Then, after the Maven project is created and compiled, you can add any custom task (see section below). With this part we are introducing that level of flexibility required to accommodate any company build process. This part is [...]
 
diff --git a/e2e/common/traits/builder_test.go b/e2e/common/traits/builder_test.go
index 6b1419174..0062c401e 100644
--- a/e2e/common/traits/builder_test.go
+++ b/e2e/common/traits/builder_test.go
@@ -173,7 +173,7 @@ func TestBuilderTrait(t *testing.T) {
 		integrationKitNamespace := IntegrationKitNamespace(ns, name)()
 		builderKitName := fmt.Sprintf("camel-k-%s-builder", integrationKitName)
 		Eventually(BuilderPod(integrationKitNamespace, builderKitName), TestTimeoutShort).ShouldNot(BeNil())
-		Eventually(len(BuilderPod(integrationKitNamespace, builderKitName)().Spec.InitContainers), TestTimeoutShort).Should(Equal(3))
+		Eventually(len(BuilderPod(integrationKitNamespace, builderKitName)().Spec.InitContainers), TestTimeoutShort).Should(Equal(4))
 		Eventually(BuilderPod(integrationKitNamespace, builderKitName)().Spec.InitContainers[0].Name, TestTimeoutShort).Should(Equal("builder"))
 		Eventually(BuilderPod(integrationKitNamespace, builderKitName)().Spec.InitContainers[1].Name, TestTimeoutShort).Should(Equal("custom1"))
 		Eventually(BuilderPod(integrationKitNamespace, builderKitName)().Spec.InitContainers[2].Name, TestTimeoutShort).Should(Equal("custom2"))
@@ -249,9 +249,10 @@ func TestBuilderTrait(t *testing.T) {
 		integrationKitName := IntegrationKit(ns, name)()
 		builderKitName := fmt.Sprintf("camel-k-%s-builder", integrationKitName)
 		Eventually(BuilderPod(ns, builderKitName), TestTimeoutShort).ShouldNot(BeNil())
-		Eventually(len(BuilderPod(ns, builderKitName)().Spec.InitContainers), TestTimeoutShort).Should(Equal(2))
+		Eventually(len(BuilderPod(ns, builderKitName)().Spec.InitContainers), TestTimeoutShort).Should(Equal(3))
 		Eventually(BuilderPod(ns, builderKitName)().Spec.InitContainers[0].Name, TestTimeoutShort).Should(Equal("builder"))
 		Eventually(BuilderPod(ns, builderKitName)().Spec.InitContainers[1].Name, TestTimeoutShort).Should(Equal("custom1"))
+		Eventually(BuilderPod(ns, builderKitName)().Spec.InitContainers[2].Name, TestTimeoutShort).Should(Equal("package"))
 
 		// Check containers conditions
 		Eventually(Build(ns, integrationKitName), TestTimeoutShort).ShouldNot(BeNil())
diff --git a/e2e/commonwithcustominstall/catalog_builder_test.go b/e2e/commonwithcustominstall/catalog_builder_test.go
index bae648049..5440b0e51 100644
--- a/e2e/commonwithcustominstall/catalog_builder_test.go
+++ b/e2e/commonwithcustominstall/catalog_builder_test.go
@@ -92,9 +92,7 @@ func TestCamelCatalogBuilder(t *testing.T) {
 
 			Eventually(CamelCatalog(ns, compatibleCatalogName)).ShouldNot(BeNil())
 			Eventually(CamelCatalogPhase(ns, compatibleCatalogName)).Should(Equal(v1.CamelCatalogPhaseReady))
-			Eventually(CamelCatalogCondition(ns, compatibleCatalogName, v1.CamelCatalogConditionReady)().Message).Should(
-				Or(Equal("Container image successfully built"), Equal("Container image exists on registry")),
-			)
+			Eventually(CamelCatalogCondition(ns, compatibleCatalogName, v1.CamelCatalogConditionReady)().Message).Should(Equal("Container image tool found in catalog"))
 			Eventually(IntegrationPodPhase(ns, name), TestTimeoutMedium).Should(Equal(corev1.PodRunning))
 			Eventually(IntegrationConditionStatus(ns, name, v1.IntegrationConditionReady), TestTimeoutMedium).
 				Should(Equal(corev1.ConditionTrue))
@@ -121,7 +119,7 @@ func TestCamelCatalogBuilder(t *testing.T) {
 			Eventually(CamelCatalog(ns, compatibleCatalogName)).ShouldNot(BeNil())
 			Eventually(CamelCatalogPhase(ns, compatibleCatalogName)).Should(Equal(v1.CamelCatalogPhaseReady))
 			Eventually(CamelCatalogCondition(ns, compatibleCatalogName, v1.CamelCatalogConditionReady)().Message).Should(
-				Equal("Container image exists on registry"),
+				Equal("Container image tool found in catalog"),
 			)
 
 			Eventually(IntegrationKit(ns, name)).ShouldNot(Equal(""))
diff --git a/e2e/native/native_test.go b/e2e/native/native_test.go
index 739ddf5ba..2a60b36ea 100644
--- a/e2e/native/native_test.go
+++ b/e2e/native/native_test.go
@@ -46,7 +46,7 @@ func TestNativeIntegrations(t *testing.T) {
 			name := "unsupported-js"
 			Expect(KamelRunWithID(operatorID, ns, "files/JavaScript.js", "--name", name,
 				"-t", "quarkus.mode=native",
-				"-t", "builder.tasks-limit-memory=quarkus-native:=6.5Gi",
+				"-t", "builder.tasks-limit-memory=quarkus-native:6.5Gi",
 			).Execute()).To(Succeed())
 
 			Eventually(IntegrationPhase(ns, name)).Should(Equal(v1.IntegrationPhaseError))
@@ -61,7 +61,7 @@ func TestNativeIntegrations(t *testing.T) {
 			name := "xml-native"
 			Expect(KamelRunWithID(operatorID, ns, "files/Xml.xml", "--name", name,
 				"-t", "quarkus.mode=native",
-				"-t", "builder.tasks-limit-memory=quarkus-native:=6.5Gi",
+				"-t", "builder.tasks-limit-memory=quarkus-native:6.5Gi",
 			).Execute()).To(Succeed())
 
 			Eventually(IntegrationPodPhase(ns, name), TestTimeoutVeryLong).Should(Equal(corev1.PodRunning))
@@ -76,14 +76,14 @@ func TestNativeIntegrations(t *testing.T) {
 			Expect(Kamel("delete", name, "-n", ns).Execute()).To(Succeed())
 		})
 
-		t.Run("automatic rollout deployment from fast-jar to native kit", func(t *testing.T) {
+		t.Run("automatic rollout deployment from jvm to native kit", func(t *testing.T) {
 			// Let's make sure we start from a clean state
 			Expect(DeleteKits(ns)).To(Succeed())
 			name := "yaml-native"
 			Expect(KamelRunWithID(operatorID, ns, "files/yaml.yaml", "--name", name,
-				"-t", "quarkus.mode=fast-jar",
+				"-t", "quarkus.mode=jvm",
 				"-t", "quarkus.mode=native",
-				"-t", "builder.tasks-limit-memory=quarkus-native:=6.5Gi",
+				"-t", "builder.tasks-limit-memory=quarkus-native:6.5Gi",
 			).Execute()).To(Succeed())
 
 			// Check that two Kits are created with distinct layout
@@ -107,7 +107,7 @@ func TestNativeIntegrations(t *testing.T) {
 			Eventually(IntegrationConditionStatus(ns, name, v1.IntegrationConditionReady), TestTimeoutShort).
 				Should(Equal(corev1.ConditionTrue))
 
-			Eventually(IntegrationLogs(ns, name), TestTimeoutShort).Should(ContainSubstring("Magicstring!"))
+			Eventually(IntegrationLogs(ns, name), TestTimeoutMedium).Should(ContainSubstring("Magicstring!"))
 
 			// ====================================
 			// !!! THE MOST TIME-CONSUMING PART !!!
diff --git a/e2e/native/native_with_sources_test.go b/e2e/native/native_with_sources_test.go
index 6478540f5..513479928 100644
--- a/e2e/native/native_with_sources_test.go
+++ b/e2e/native/native_with_sources_test.go
@@ -24,14 +24,12 @@ package native
 
 import (
 	"testing"
-	"time"
 
 	. "github.com/onsi/gomega"
 
 	. "github.com/apache/camel-k/v2/e2e/support"
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	corev1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
 func TestNativeHighMemoryIntegrations(t *testing.T) {
@@ -47,7 +45,7 @@ func TestNativeHighMemoryIntegrations(t *testing.T) {
 			name := "java-native"
 			Expect(KamelRunWithID(operatorID, ns, "files/Java.java", "--name", name,
 				"-t", "quarkus.mode=native",
-				"-t", "builder.tasks-limit-memory=quarkus-native:=9.5Gi",
+				"-t", "builder.tasks-limit-memory=quarkus-native:9.5Gi",
 			).Execute()).To(Succeed())
 
 			Eventually(IntegrationPodPhase(ns, name), TestTimeoutVeryLong).Should(Equal(corev1.PodRunning))
@@ -61,7 +59,7 @@ func TestNativeHighMemoryIntegrations(t *testing.T) {
 				name := "java-native-clone"
 				Expect(KamelRunWithID(operatorID, ns, "files/Java.java", "--name", name,
 					"-t", "quarkus.mode=native",
-					"-t", "builder.tasks-limit-memory=quarkus-native:=9.5Gi",
+					"-t", "builder.tasks-limit-memory=quarkus-native:9.5Gi",
 				).Execute()).To(Succeed())
 
 				// This one should run quickly as it suppose to reuse an IntegrationKit
@@ -78,7 +76,7 @@ func TestNativeHighMemoryIntegrations(t *testing.T) {
 				name := "java-native-2"
 				Expect(KamelRunWithID(operatorID, ns, "files/Java2.java", "--name", name,
 					"-t", "quarkus.mode=native",
-					"-t", "builder.tasks-limit-memory=quarkus-native:=9.5Gi",
+					"-t", "builder.tasks-limit-memory=quarkus-native:9.5Gi",
 				).Execute()).To(Succeed())
 
 				Eventually(IntegrationPodPhase(ns, name), TestTimeoutVeryLong).Should(Equal(corev1.PodRunning))
@@ -98,7 +96,7 @@ func TestNativeHighMemoryIntegrations(t *testing.T) {
 			name := "groovy-native"
 			Expect(KamelRunWithID(operatorID, ns, "files/Groovy.groovy", "--name", name,
 				"-t", "quarkus.mode=native",
-				"-t", "builder.tasks-limit-memory=quarkus-native:=9.5Gi",
+				"-t", "builder.tasks-limit-memory=quarkus-native:9.5Gi",
 			).Execute()).To(Succeed())
 
 			Eventually(IntegrationPodPhase(ns, name), TestTimeoutVeryLong).Should(Equal(corev1.PodRunning))
@@ -117,7 +115,7 @@ func TestNativeHighMemoryIntegrations(t *testing.T) {
 			name := "kotlin-native"
 			Expect(KamelRunWithID(operatorID, ns, "files/Kotlin.kts", "--name", name,
 				"-t", "quarkus.mode=native",
-				"-t", "builder.tasks-limit-memory=quarkus-native:=9.5Gi",
+				"-t", "builder.tasks-limit-memory=quarkus-native:9.5Gi",
 			).Execute()).To(Succeed())
 
 			Eventually(IntegrationPodPhase(ns, name), TestTimeoutVeryLong).Should(Equal(corev1.PodRunning))
diff --git a/helm/camel-k/crds/crd-integration-kit.yaml b/helm/camel-k/crds/crd-integration-kit.yaml
index f40c04244..b796bc8f4 100644
--- a/helm/camel-k/crds/crd-integration-kit.yaml
+++ b/helm/camel-k/crds/crd-integration-kit.yaml
@@ -350,7 +350,6 @@ spec:
                             build packaging. Deprecated: use `QuarkusMode` instead.'
                           enum:
                           - fast-jar
-                          - native-sources
                           - native
                           type: string
                         type: array
diff --git a/helm/camel-k/crds/crd-integration-platform.yaml b/helm/camel-k/crds/crd-integration-platform.yaml
index b11b568ed..39827cdd4 100644
--- a/helm/camel-k/crds/crd-integration-platform.yaml
+++ b/helm/camel-k/crds/crd-integration-platform.yaml
@@ -1643,7 +1643,6 @@ spec:
                             build packaging. Deprecated: use `QuarkusMode` instead.'
                           enum:
                           - fast-jar
-                          - native-sources
                           - native
                           type: string
                         type: array
@@ -3457,7 +3456,6 @@ spec:
                             build packaging. Deprecated: use `QuarkusMode` instead.'
                           enum:
                           - fast-jar
-                          - native-sources
                           - native
                           type: string
                         type: array
diff --git a/helm/camel-k/crds/crd-integration.yaml b/helm/camel-k/crds/crd-integration.yaml
index e59cb1c45..21eb27225 100644
--- a/helm/camel-k/crds/crd-integration.yaml
+++ b/helm/camel-k/crds/crd-integration.yaml
@@ -7560,7 +7560,6 @@ spec:
                             build packaging. Deprecated: use `QuarkusMode` instead.'
                           enum:
                           - fast-jar
-                          - native-sources
                           - native
                           type: string
                         type: array
diff --git a/helm/camel-k/crds/crd-kamelet-binding.yaml b/helm/camel-k/crds/crd-kamelet-binding.yaml
index abde245c9..f51b72726 100644
--- a/helm/camel-k/crds/crd-kamelet-binding.yaml
+++ b/helm/camel-k/crds/crd-kamelet-binding.yaml
@@ -7858,7 +7858,6 @@ spec:
                                 build packaging. Deprecated: use `QuarkusMode` instead.'
                               enum:
                               - fast-jar
-                              - native-sources
                               - native
                               type: string
                             type: array
diff --git a/helm/camel-k/crds/crd-pipe.yaml b/helm/camel-k/crds/crd-pipe.yaml
index a8a40da19..f58e4be83 100644
--- a/helm/camel-k/crds/crd-pipe.yaml
+++ b/helm/camel-k/crds/crd-pipe.yaml
@@ -7855,7 +7855,6 @@ spec:
                                 build packaging. Deprecated: use `QuarkusMode` instead.'
                               enum:
                               - fast-jar
-                              - native-sources
                               - native
                               type: string
                             type: array
diff --git a/pkg/apis/camel/v1/trait/quarkus.go b/pkg/apis/camel/v1/trait/quarkus.go
index 538f4e9df..fb1f36f89 100644
--- a/pkg/apis/camel/v1/trait/quarkus.go
+++ b/pkg/apis/camel/v1/trait/quarkus.go
@@ -55,7 +55,7 @@ const (
 
 // QuarkusPackageType is the type of Quarkus build packaging.
 // Deprecated: use `QuarkusMode` instead.
-// +kubebuilder:validation:Enum=fast-jar;native-sources;native
+// +kubebuilder:validation:Enum=fast-jar;native
 type QuarkusPackageType string
 
 const (
diff --git a/pkg/builder/image.go b/pkg/builder/image.go
index cedf72a82..9a7ba1bd0 100644
--- a/pkg/builder/image.go
+++ b/pkg/builder/image.go
@@ -69,7 +69,7 @@ func nativeImageContext(ctx *builderContext) error {
 		ctx.Artifacts = []v1.Artifact{
 			{
 				ID:       runner,
-				Location: filepath.Join(ctx.Path, "maven", "target", "native-sources", runner),
+				Location: QuarkusRuntimeSupport(ctx.Catalog.GetCamelQuarkusVersion()).TargetDirectory(ctx.Path, runner),
 				Target:   runner,
 			},
 		}
diff --git a/pkg/builder/runtime_support.go b/pkg/builder/runtime_support.go
new file mode 100644
index 000000000..f9da1ca00
--- /dev/null
+++ b/pkg/builder/runtime_support.go
@@ -0,0 +1,91 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package builder
+
+import "path/filepath"
+
+// QuarkusRuntimeNativeAdapter is used to get the proper Quarkus native configuration which may be different
+// in Camel Quarkus version. It is known that before Camel Quarkus 3.5 there was no support to native-source,
+// and using this interface will adapt the configuration to build natively according the previous configuration.
+type QuarkusRuntimeNativeAdapter interface {
+	// The commands used to build a native application
+	BuildCommands() string
+	// The directory where to execute the command
+	Directory() string
+	// The directory where to expect the native compiled artifact
+	TargetDirectory(ctxPath, runner string) string
+	// The parameter to use for the maven project
+	NativeMavenProperty() string
+}
+
+// NativeSourcesAdapter used for Camel Quarkus runtime >= 3.5.0.
+type NativeSourcesAdapter struct {
+}
+
+// BuildCommands -- .
+func (n *NativeSourcesAdapter) BuildCommands() string {
+	return "cd " + n.Directory() + " && echo NativeImage version is $(native-image --version) && echo GraalVM expected version is $(cat graalvm.version) && echo WARN: Make sure they are compatible, otherwise the native compilation may results in error && native-image $(cat native-image.args)"
+}
+
+// Directory -- .
+func (n *NativeSourcesAdapter) Directory() string {
+	return filepath.Join("maven", "target", "native-sources")
+}
+
+// TargetDirectory -- .
+func (n *NativeSourcesAdapter) TargetDirectory(ctxPath, runner string) string {
+	return filepath.Join(ctxPath, "maven", "target", "native-sources", runner)
+}
+
+// NativeMavenProperty -- .
+func (n *NativeSourcesAdapter) NativeMavenProperty() string {
+	return "native-sources"
+}
+
+// NativeAdapter used for Camel Quarkus runtime < 3.5.0.
+type NativeAdapter struct {
+}
+
+// BuildCommands -- .
+func (n *NativeAdapter) BuildCommands() string {
+	return "cd " + n.Directory() + " && ./mvnw package -Dquarkus.package.type=native --global-settings settings.xml"
+}
+
+// Directory -- .
+func (n *NativeAdapter) Directory() string {
+	return "maven"
+}
+
+// TargetDirectory -- .
+func (n *NativeAdapter) TargetDirectory(ctxPath, runner string) string {
+	return filepath.Join(ctxPath, "maven", "target", runner)
+}
+
+// NativeMavenProperty -- .
+func (n *NativeAdapter) NativeMavenProperty() string {
+	// Empty on purpose. The parameter will be provided later by the command (see BuildCommands()).
+	return ""
+}
+
+// QuarkusRuntimeSupport is used to get the proper native configuration based on the Camel Quarkus version.
+func QuarkusRuntimeSupport(version string) QuarkusRuntimeNativeAdapter {
+	if version < "3.5.0" {
+		return &NativeAdapter{}
+	}
+	return &NativeSourcesAdapter{}
+}
diff --git a/pkg/trait/builder.go b/pkg/trait/builder.go
index c7cd7c7a7..f1c6a7f49 100644
--- a/pkg/trait/builder.go
+++ b/pkg/trait/builder.go
@@ -19,7 +19,6 @@ package trait
 
 import (
 	"fmt"
-	"path/filepath"
 	"regexp"
 	"sort"
 	"strings"
@@ -79,8 +78,9 @@ func (t *builderTrait) Configure(e *Environment) (bool, error) {
 				return false, err
 			}
 			if ok && pointer.BoolDeref(quarkus.Enabled, true) && (isNativeIntegration || isNativeKit) {
-				nativeArgsCd := filepath.Join("maven", "target", "native-sources")
-				command := "cd " + nativeArgsCd + " && echo NativeImage version is $(native-image --version) && echo GraalVM expected version is $(cat graalvm.version) && echo WARN: Make sure they are compatible, otherwise the native compilation may results in error && native-image $(cat native-image.args)"
+				// TODO expect maven repository in local repo (need to change builder pod accordingly!)
+				command := builder.QuarkusRuntimeSupport(e.CamelCatalog.GetCamelQuarkusVersion()).BuildCommands()
+
 				// it should be performed as the last custom task
 				t.Tasks = append(t.Tasks, fmt.Sprintf(`quarkus-native;%s;/bin/bash -c "%s"`, e.CamelCatalog.GetQuarkusToolingImage(), command))
 				// Force the build to run in a separate Pod and strictly sequential
@@ -494,8 +494,8 @@ func (t *builderTrait) parseTasksConf() (map[string]*v1.BuildConfiguration, erro
 // if however we have a command which is not quoted, then we leave it the way it is.
 func splitContainerCommand(command string) []string {
 	if !strings.Contains(command, "\"") {
-		// No quotes, just return
-		return []string{command}
+		// No quotes, then, splits all commands found
+		return strings.Split(command, " ")
 	}
 	matches := commandsRegexp.FindAllString(command, -1)
 	removeQuotes := make([]string, 0, len(matches))
diff --git a/pkg/trait/builder_test.go b/pkg/trait/builder_test.go
index 0c060177b..651da6a22 100644
--- a/pkg/trait/builder_test.go
+++ b/pkg/trait/builder_test.go
@@ -331,7 +331,9 @@ func TestBuilderCustomTasks(t *testing.T) {
 	assert.Equal(t, "ls", tasks[0].Custom.ContainerCommands[0])
 	assert.Equal(t, "test", tasks[1].Custom.Name)
 	assert.Equal(t, "alpine", tasks[1].Custom.ContainerImage)
-	assert.Equal(t, "mvn test", tasks[1].Custom.ContainerCommands[0])
+	assert.Equal(t, "mvn", tasks[1].Custom.ContainerCommands[0])
+	assert.Equal(t, "test", tasks[1].Custom.ContainerCommands[1])
+
 }
 
 func TestBuilderCustomTasksFailure(t *testing.T) {
@@ -399,8 +401,9 @@ func TestUserTaskSingleCommand(t *testing.T) {
 	command := `cat /path/to/a/resource`
 	podCommands := splitContainerCommand(command)
 
-	assert.Len(t, podCommands, 1)
-	assert.Equal(t, "cat /path/to/a/resource", podCommands[0])
+	assert.Len(t, podCommands, 2)
+	assert.Equal(t, "cat", podCommands[0])
+	assert.Equal(t, "/path/to/a/resource", podCommands[1])
 }
 
 func TestUserTaskMultiCommands(t *testing.T) {
diff --git a/pkg/trait/quarkus.go b/pkg/trait/quarkus.go
index 1db7f6f16..ad3744d8e 100644
--- a/pkg/trait/quarkus.go
+++ b/pkg/trait/quarkus.go
@@ -341,8 +341,13 @@ func (t *quarkusTrait) applyWhenBuildSubmitted(e *Environment) error {
 		return err
 	}
 
+	// The LoadCamelQuarkusCatalog is required to have catalog information available by the builder
+	packageSteps = append(packageSteps, builder.Quarkus.LoadCamelQuarkusCatalog)
+
 	if native {
-		buildTask.Maven.Properties["quarkus.package.type"] = string(nativeSourcesPackageType)
+		if nativePackagetType := builder.QuarkusRuntimeSupport(e.CamelCatalog.GetCamelQuarkusVersion()).NativeMavenProperty(); nativePackagetType != "" {
+			buildTask.Maven.Properties["quarkus.package.type"] = nativePackagetType
+		}
 		if len(e.IntegrationKit.Spec.Sources) > 0 {
 			buildTask.Sources = e.IntegrationKit.Spec.Sources
 			buildSteps = append(buildSteps, builder.Quarkus.PrepareProjectWithSources)
@@ -354,8 +359,6 @@ func (t *quarkusTrait) applyWhenBuildSubmitted(e *Environment) error {
 		// Default, if nothing is specified
 		buildTask.Maven.Properties["quarkus.package.type"] = string(fastJarPackageType)
 		packageSteps = append(packageSteps, builder.Quarkus.ComputeQuarkusDependencies)
-		// The LoadCamelQuarkusCatalog is required to have catalog information available by the builder
-		packageSteps = append(packageSteps, builder.Quarkus.LoadCamelQuarkusCatalog)
 		packageSteps = append(packageSteps, builder.Image.IncrementalImageContext)
 		// Create the dockerfile, regardless it's later used or not by the publish strategy
 		packageSteps = append(packageSteps, builder.Image.JvmDockerfile)


[camel-k] 04/09: fix(ci): lint complains

Posted by pc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 9ebf9f6b75a5e67d6659c1f1811f90511377f9fa
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Tue Sep 26 09:39:11 2023 +0200

    fix(ci): lint complains
---
 pkg/builder/image.go |  2 +-
 pkg/builder/tasks.go |  6 +++---
 pkg/trait/builder.go | 10 +++++-----
 3 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/pkg/builder/image.go b/pkg/builder/image.go
index c6bc6d9b8..1ea9a4983 100644
--- a/pkg/builder/image.go
+++ b/pkg/builder/image.go
@@ -50,7 +50,7 @@ type imageSteps struct {
 	JvmDockerfile           Step
 }
 
-// Image used to export the steps available on an Image building process
+// Image used to export the steps available on an Image building process.
 var Image = imageSteps{
 	IncrementalImageContext: NewStep(ApplicationPackagePhase, incrementalImageContext),
 	NativeImageContext:      NewStep(ApplicationPackagePhase, nativeImageContext),
diff --git a/pkg/builder/tasks.go b/pkg/builder/tasks.go
index 3b35e2db2..c61a8df2f 100644
--- a/pkg/builder/tasks.go
+++ b/pkg/builder/tasks.go
@@ -24,7 +24,7 @@ import (
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 )
 
-// Build convert the Build CR in a struct that can be executable as an operator routing
+// Build convert the Build CR in a struct that can be executable as an operator routine.
 func (b *Builder) Build(build *v1.Build) *Build {
 	return &Build{
 		builder: *b,
@@ -32,7 +32,7 @@ func (b *Builder) Build(build *v1.Build) *Build {
 	}
 }
 
-// Task convert the task in a routine task which can be executed inside operator
+// Task convert the task in a routine task which can be executed inside operator.
 func (b *Build) Task(task v1.Task) Task {
 	switch {
 	case task.Builder != nil:
@@ -129,7 +129,7 @@ func (t *unsupportedTask) Do(_ context.Context) v1.BuildStatus {
 
 var _ Task = &missingTask{}
 
-// TaskByName return the task identified by the name parameter
+// TaskByName return the task identified by the name parameter.
 func (b *Build) TaskByName(name string) Task {
 	for _, task := range b.build.Spec.Tasks {
 		switch {
diff --git a/pkg/trait/builder.go b/pkg/trait/builder.go
index c8a514208..e59ee7da5 100644
--- a/pkg/trait/builder.go
+++ b/pkg/trait/builder.go
@@ -377,15 +377,15 @@ func getImageName(e *Environment) string {
 }
 
 func (t *builderTrait) customTasks() ([]v1.Task, error) {
-	customTasks := make([]v1.Task, len(t.Tasks), len(t.Tasks))
+	customTasks := make([]v1.Task, len(t.Tasks))
 	for i, t := range t.Tasks {
 		splitted := strings.Split(t, ";")
 		if len(splitted) < 3 {
-			return nil, fmt.Errorf(`You need to provide a custom task with at least 3 arguments, ie "my-task-name;my-image;echo 'hello', was %v"`, t)
+			return nil, fmt.Errorf(`provide a custom task with at least 3 arguments, ie "my-task-name;my-image;echo 'hello', was %v"`, t)
 		}
 		var containerCommand string
 		if len(splitted) > 3 {
-			//recompose in case of usage of separator char in the script
+			// recompose in case of usage of separator char in the script
 			containerCommand = strings.Join(splitted[2:], ";")
 		} else {
 			containerCommand = splitted[2]
@@ -405,12 +405,12 @@ func (t *builderTrait) customTasks() ([]v1.Task, error) {
 }
 
 // we may get a command in the following format `/bin/bash -c "ls && echo 'hello'`
-// which should provide a string with {"/bin/bash", "-c", "ls && echo 'hello'"}
+// which should provide a string with {"/bin/bash", "-c", "ls && echo 'hello'"}.
 func splitContainerCommand(command string) []string {
 	matches := commandsRegexp.FindAllString(command, -1)
 	removeQuotes := make([]string, 0, len(matches))
 	for _, m := range matches {
-		removeQuotes = append(removeQuotes, strings.Replace(m, "\"", "", -1))
+		removeQuotes = append(removeQuotes, strings.ReplaceAll(m, "\"", ""))
 	}
 
 	return removeQuotes


[camel-k] 05/09: fix(ci): errors identified by checks

Posted by pc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 1cf40d8c0462f82f9b044662f093f87a3d21027d
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Tue Sep 26 11:10:37 2023 +0200

    fix(ci): errors identified by checks
---
 pkg/controller/catalog/initialize.go | 22 +++++++++++++++++++---
 pkg/trait/builder.go                 | 35 ++++++++++++++++++++++-------------
 pkg/trait/builder_test.go            | 14 +++++++++++---
 pkg/trait/trait_catalog.go           |  6 +++---
 4 files changed, 55 insertions(+), 22 deletions(-)

diff --git a/pkg/controller/catalog/initialize.go b/pkg/controller/catalog/initialize.go
index 20cd365d7..61be5e2c5 100644
--- a/pkg/controller/catalog/initialize.go
+++ b/pkg/controller/catalog/initialize.go
@@ -22,6 +22,7 @@ import (
 
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	platformutil "github.com/apache/camel-k/v2/pkg/platform"
+	corev1 "k8s.io/api/core/v1"
 )
 
 // NewInitializeAction returns a action that initializes the catalog configuration when not provided by the user.
@@ -61,9 +62,24 @@ func (action *initializeAction) Handle(ctx context.Context, catalog *v1.CamelCat
 
 func initialize(catalog *v1.CamelCatalog) (*v1.CamelCatalog, error) {
 	target := catalog.DeepCopy()
-	// TODO - we may verify the existence of the catalog image (required by native build)
-	// or any other condition that may make a CamelCatalog to fail.
-	target.Status.Phase = v1.CamelCatalogPhaseReady
+
+	if catalog.Spec.GetQuarkusToolingImage() == "" {
+		target.Status.Phase = v1.CamelCatalogPhaseError
+		target.Status.SetCondition(
+			v1.CamelCatalogConditionReady,
+			corev1.ConditionTrue,
+			"Container image tool",
+			"Container image tool missing in catalog. This catalog is not compatible with Camel K version above 2.0",
+		)
+	} else {
+		target.Status.Phase = v1.CamelCatalogPhaseReady
+		target.Status.SetCondition(
+			v1.CamelCatalogConditionReady,
+			corev1.ConditionTrue,
+			"Container image tool",
+			"Container image tool found in catalog",
+		)
+	}
 
 	return target, nil
 }
diff --git a/pkg/trait/builder.go b/pkg/trait/builder.go
index e59ee7da5..44c6763b6 100644
--- a/pkg/trait/builder.go
+++ b/pkg/trait/builder.go
@@ -68,22 +68,26 @@ func (t *builderTrait) Configure(e *Environment) (bool, error) {
 		return false, nil
 	}
 
-	if trait := e.Catalog.GetTrait(quarkusTraitID); trait != nil {
-		quarkus, ok := trait.(*quarkusTrait)
-		isNativeIntegration := quarkus.isNativeIntegration(e)
-		isNativeKit, err := quarkus.isNativeKit(e)
-		if err != nil {
-			return false, err
-		}
-		if ok && pointer.BoolDeref(quarkus.Enabled, true) && (isNativeIntegration || isNativeKit) {
-			nativeArgsCd := filepath.Join("maven", "target", "native-sources")
-			command := "cd " + nativeArgsCd + " && echo NativeImage version is $(native-image --version) && echo GraalVM expected version is $(cat graalvm.version) && echo WARN: Make sure they are compatible, otherwise the native compilation may results in error && native-image $(cat native-image.args)"
-			// it should be performed as the last custom task
-			t.Tasks = append(t.Tasks, fmt.Sprintf(`quarkus-native;%s;/bin/bash -c "%s"`, e.CamelCatalog.GetQuarkusToolingImage(), command))
+	if e.IntegrationKitInPhase(v1.IntegrationKitPhaseBuildSubmitted) {
+		if trait := e.Catalog.GetTrait(quarkusTraitID); trait != nil {
+			quarkus, ok := trait.(*quarkusTrait)
+			isNativeIntegration := quarkus.isNativeIntegration(e)
+			isNativeKit, err := quarkus.isNativeKit(e)
+			if err != nil {
+				return false, err
+			}
+			if ok && pointer.BoolDeref(quarkus.Enabled, true) && (isNativeIntegration || isNativeKit) {
+				nativeArgsCd := filepath.Join("maven", "target", "native-sources")
+				command := "cd " + nativeArgsCd + " && echo NativeImage version is $(native-image --version) && echo GraalVM expected version is $(cat graalvm.version) && echo WARN: Make sure they are compatible, otherwise the native compilation may results in error && native-image $(cat native-image.args)"
+				// it should be performed as the last custom task
+				t.Tasks = append(t.Tasks, fmt.Sprintf(`quarkus-native;%s;/bin/bash -c "%s"`, e.CamelCatalog.GetQuarkusToolingImage(), command))
+			}
 		}
+
+		return true, nil
 	}
 
-	return e.IntegrationKitInPhase(v1.IntegrationKitPhaseBuildSubmitted), nil
+	return false, nil
 }
 
 func (t *builderTrait) Apply(e *Environment) error {
@@ -406,7 +410,12 @@ func (t *builderTrait) customTasks() ([]v1.Task, error) {
 
 // we may get a command in the following format `/bin/bash -c "ls && echo 'hello'`
 // which should provide a string with {"/bin/bash", "-c", "ls && echo 'hello'"}.
+// if however we have a command which is not quoted, then we leave it the way it is.
 func splitContainerCommand(command string) []string {
+	if !strings.Contains(command, "\"") {
+		// No quotes, just return
+		return []string{command}
+	}
 	matches := commandsRegexp.FindAllString(command, -1)
 	removeQuotes := make([]string, 0, len(matches))
 	for _, m := range matches {
diff --git a/pkg/trait/builder_test.go b/pkg/trait/builder_test.go
index 9708a7485..9a5b29472 100644
--- a/pkg/trait/builder_test.go
+++ b/pkg/trait/builder_test.go
@@ -320,7 +320,7 @@ func TestMavenBuilderTraitJib(t *testing.T) {
 func TestBuilderCustomTasks(t *testing.T) {
 	builderTrait := createNominalBuilderTraitTest()
 	builderTrait.Tasks = append(builderTrait.Tasks, "test;alpine;ls")
-	builderTrait.Tasks = append(builderTrait.Tasks, `test;alpine;"mvn test"`)
+	builderTrait.Tasks = append(builderTrait.Tasks, `test;alpine;mvn test`)
 
 	tasks, err := builderTrait.customTasks()
 
@@ -372,7 +372,15 @@ func TestUserTaskSingleCommand(t *testing.T) {
 	command := `cat /path/to/a/resource`
 	podCommands := splitContainerCommand(command)
 
+	assert.Len(t, podCommands, 1)
+	assert.Equal(t, "cat /path/to/a/resource", podCommands[0])
+}
+
+func TestUserTaskMultiCommands(t *testing.T) {
+	command := `"cat /path/to/a/resource" "echo ciao"`
+	podCommands := splitContainerCommand(command)
+
 	assert.Len(t, podCommands, 2)
-	assert.Equal(t, "cat", podCommands[0])
-	assert.Equal(t, "/path/to/a/resource", podCommands[1])
+	assert.Equal(t, "cat /path/to/a/resource", podCommands[0])
+	assert.Equal(t, "echo ciao", podCommands[1])
 }
diff --git a/pkg/trait/trait_catalog.go b/pkg/trait/trait_catalog.go
index b8ec893d1..025a9cc98 100644
--- a/pkg/trait/trait_catalog.go
+++ b/pkg/trait/trait_catalog.go
@@ -102,13 +102,13 @@ func (c *Catalog) apply(environment *Environment) error {
 		applicable = true
 		enabled, err := trait.Configure(environment)
 		if err != nil {
-			return err
+			return fmt.Errorf("%s trait configuration failed: %w", trait.ID(), err)
 		}
 
 		if enabled {
 			err = trait.Apply(environment)
 			if err != nil {
-				return err
+				return fmt.Errorf("%s trait execution failed: %w", trait.ID(), err)
 			}
 
 			environment.ExecutedTraits = append(environment.ExecutedTraits, trait)
@@ -117,7 +117,7 @@ func (c *Catalog) apply(environment *Environment) error {
 			for _, processor := range environment.PostStepProcessors {
 				err := processor(environment)
 				if err != nil {
-					return fmt.Errorf("error executing post step action: %w", err)
+					return fmt.Errorf("%s trait executing post step action failed: %w", trait.ID(), err)
 				}
 			}
 		}


[camel-k] 03/09: doc(pipeline): more design details

Posted by pc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 13916436c5876fd9c507a27386ba68022ec63704
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Mon Sep 25 16:18:45 2023 +0200

    doc(pipeline): more design details
---
 docs/modules/ROOT/camel_k_pipeline.png             | Bin 0 -> 17355 bytes
 .../ROOT/pages/architecture/cr/camel-catalog.adoc  |   4 +---
 docs/modules/ROOT/pages/pipeline/pipeline.adoc     |  24 +++++++++++++++------
 docs/modules/ROOT/pages/pipeline/tekton.adoc       |   7 +++++-
 .../ROOT/pages/running/runtime-version.adoc        |   2 +-
 5 files changed, 26 insertions(+), 11 deletions(-)

diff --git a/docs/modules/ROOT/camel_k_pipeline.png b/docs/modules/ROOT/camel_k_pipeline.png
new file mode 100644
index 000000000..4150d8dca
Binary files /dev/null and b/docs/modules/ROOT/camel_k_pipeline.png differ
diff --git a/docs/modules/ROOT/pages/architecture/cr/camel-catalog.adoc b/docs/modules/ROOT/pages/architecture/cr/camel-catalog.adoc
index f301dc6e0..ce1a8126f 100644
--- a/docs/modules/ROOT/pages/architecture/cr/camel-catalog.adoc
+++ b/docs/modules/ROOT/pages/architecture/cr/camel-catalog.adoc
@@ -3,9 +3,7 @@
 
 The *CamelCatalog* is a resource that provides metadata related to what is included in the xref:architecture/runtime.adoc[Runtime] in term of Camel components, languages, dataformats and capabilities provided.
 
-Starting from Camel K version 2, it is a dynamic resource which is reconciled and produces as an output a container image required to build the Camel application when using the builder `Pod` strategy. This container image contains all the toolings which will build the artifacts, above all the Quarkus tools required to compile natively.
-
-NOTE: each catalog generates a different builder image starting from Camel K runtime version 1.17. You cannot run a Camel K runtime < 1.17 with Camel K version 2.
+NOTE: each catalog may require to specify a container tool image eventually used by the build process starting from Camel K runtime version 1.17. You cannot run a Camel K runtime < 1.17 with Camel K version 2.
 
 [NOTE]
 ====
diff --git a/docs/modules/ROOT/pages/pipeline/pipeline.adoc b/docs/modules/ROOT/pages/pipeline/pipeline.adoc
index 9555cf5bf..5e593dfb8 100644
--- a/docs/modules/ROOT/pages/pipeline/pipeline.adoc
+++ b/docs/modules/ROOT/pages/pipeline/pipeline.adoc
@@ -1,9 +1,24 @@
 [[build-pipeline]]
 = Build Pipeline
-
 Since version 2.0, we've introduced the concept of `Pipeline` in order to provide a degree of flexibility for those user that want to customize the entire building process. We can think of a pipeline as a series of tasks that can be executed after the project generation and before the artifact publishing into the container registry.
 
-In Camel K version 1 we used to have 2 static tasks: `builder` and `publisher` (named after the strategy adopted, ie, `spectrum`). Now you can include any futher task in the middle by opportunely configuring the Build. Let's see an example:
+In Camel K version 1 we used to have 2 static tasks: `builder` and `publisher` (named after the strategy adopted, ie, `spectrum`). Now you can include any further task in the middle by opportunely configuring the Build. Here a diagram illustrating the pipeline:
+
+image::camel_k_pipeline..png[Camel K Pipeline, width=1024]
+
+We have 3 tasks which are required by Camel K to perform a build and provide a container image which will be used to start a Camel application. The **build** is a Maven process which is in charge to create a maven project based on the Integration sources provided. Then, after the Maven project is created and compiled, you can add any custom task (see section below). With this part we are introducing that level of flexibility required to accommodate any company build process. This part is [...]
+
+In reality we do make use of the custom task in one particular situation. In order to build a Quarkus Native image, the quarkus trait influences the builder in order to include a custom task which takes care of executing the native image compilation. But this is completely hidden to the final user.
+
+Once the build and any customization are over, the **package** task takes care to prepare the context later required by the publishing operations. Basically this task is in charge to copy all artifacts and also prepare a Dockerfile which could be used eventually by the rest of the process. Finally, the **publish** task is in charge to generate and push the container to the registry using all the artifacts generated in the package task.
+
+[[add-custom-tasks]]
+== Add custom user tasks
+As you have seen, the final user can include any optional task after a build operation is performed. We think this is the best moment when any custom operation can be performed as it is the immediate step after the Maven project is generated. And ideally, the context of any custom operation is the project.
+
+NOTE: Please, notice that, since the customization may require any tool not available in the operator container, you will need to run any additional task using builder `pod` strategy.
+
+Let's see an example:
 
 ```yaml
 spec:
@@ -25,11 +40,8 @@ The custom tasks will be executed in the directory where the Camel K runtime Mav
 
 The goal is to let the user perform custom tasks which may result in a success or a failure. If the task executed results in a failure, then, the entire build is stopped and fails accordingly.
 
-WARNING: The custom tasks are only available only when using pod strategy.
-
 [[build-pipeline-trait]]
-== Configuring via builder trait
-
+=== Configuring via builder trait
 We are aware that configuring the `Build` type directly is something that the majority of users won't do. For this reason we're enabling the same feature in the xref:traits:builder.adoc[Builder trait].
 
 Maintaining the example above as a reference, configuring a custom task will be as easy as adding a trait property when running your Integration, for instance, via CLI:
diff --git a/docs/modules/ROOT/pages/pipeline/tekton.adoc b/docs/modules/ROOT/pages/pipeline/tekton.adoc
index b002f995b..b0f143626 100644
--- a/docs/modules/ROOT/pages/pipeline/tekton.adoc
+++ b/docs/modules/ROOT/pages/pipeline/tekton.adoc
@@ -1,9 +1,14 @@
 [[full-fledged-pipeline]]
 = Full fledged Pipeline
 
-If you're running a production grade enterprise system, you likely want to use a full fledged CICD technology. The basic features provided by our xref:pipeline/pipeline.adoc[homemade Pipeline] may be definitely limited in such situation. For those production grade requirements we suggest to integrate one of the many CICD technologies around. One that we want to suggest and for which we provide an opinionated approach is https://tekton.dev/[Tekton CICD].
+If you're running a build process over any external pipeline, you likely want to use that CICD technology in conjunction with Camel K. The features provided by our xref:pipeline/pipeline.adoc[Camel K Pipeline] may be limited in such situation. For those requirements we suggest to integrate one of the many CICD technologies around. One that we want to suggest and for which we provide an opinionated approach is https://tekton.dev/[Tekton CICD].
 
 [[tekton-pipeline]]
 == Integrate with Tekton
 
 Since Camel K version 2 we are supporting a https://hub.tekton.dev/tekton/task/kamel-run[`kamel-run` Task] included in https://hub.tekton.dev/[Tekton Hub]. You can find the instructions and some example to show you how to adopt this technology together with Camel K. The prerequisite is to have Camel K and Tekton operators up and running. The brief guide requires certain previous familiarity with Tekton technology as well.
+
+[[cicd-pipeline]]
+== Integrate with other pipelines
+
+There are many CICD tools and we cannot provide support for every technology. However, Camel K gives you the possibility to run your own build with the CICD technology of choice and operate the Camel application accordingly. What you need to do is to let the CICD technology to provide an Integration custom resource with the container image built by the pipeline, ie: `kamel run test.yaml -t container.image=docker.io/my-org/my-image:xyz`.
\ No newline at end of file
diff --git a/docs/modules/ROOT/pages/running/runtime-version.adoc b/docs/modules/ROOT/pages/running/runtime-version.adoc
index c92e9062e..5e1ccb03a 100644
--- a/docs/modules/ROOT/pages/running/runtime-version.adoc
+++ b/docs/modules/ROOT/pages/running/runtime-version.adoc
@@ -14,7 +14,7 @@ Having the ability to choose the runtime, gives you the ability to specify which
 
 This feature requires the dynamic generation of a builder that contains all the tooling expected by the build phase. In particular, this is a requirement for Quarkus native builds which, from now on, can be only done with builder `Pod` strategy.
 
-When you are creating a new runtime for which a xref:architecture/cr/camel-catalog.adoc[CamelCatalog] does not yest exist, Camel K Operator is in charge to create such a catalog. The creation of a new Catalog binds to the creation of a container image builder which will later be used by the builder `Pod` to build a Camel application which is specific to such a runtime.
+When you are creating a new runtime for which a xref:architecture/cr/camel-catalog.adoc[CamelCatalog] does not yest exist, Camel K Operator is in charge to create such a catalog. Every CamelCatalog may carry the definition of a container image builder which may later be used by the builder `Pod` to build a Camel application which is specific to such a runtime (for instance, when running a Quarkus Native build).
 
 == Pin a runtime version
 


[camel-k] 07/09: feat(trait): deprecate quarkus package-type

Posted by pc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit d8f8104a082c947b357f356c18cad8544051a0bd
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Wed Sep 27 11:52:24 2023 +0200

    feat(trait): deprecate quarkus package-type
    
    This parameter exposed implementations details not user friendly. Enabling mode parameter which accept either `jvm` or `native` seems a better UX.
---
 .../bases/camel.apache.org_integrationkits.yaml    | 30 +++++---
 .../camel.apache.org_integrationplatforms.yaml     | 52 +++++++++----
 .../crd/bases/camel.apache.org_integrations.yaml   | 22 ++++--
 .../bases/camel.apache.org_kameletbindings.yaml    | 38 +++++++---
 config/crd/bases/camel.apache.org_pipes.yaml       | 38 +++++++---
 docs/modules/ROOT/partials/apis/camel-k-crds.adoc  | 28 ++++++-
 docs/modules/traits/pages/quarkus.adoc             | 15 +++-
 e2e/builder/build_test.go                          |  2 +-
 e2e/common/traits/builder_test.go                  |  8 +-
 .../catalog_builder_test.go                        | 32 +-------
 e2e/native/native_binding_test.go                  | 21 +-----
 e2e/native/native_test.go                          | 18 ++---
 e2e/native/native_test_support.go                  |  2 +-
 e2e/native/native_with_sources_test.go             | 33 +++-----
 e2e/support/test_support.go                        | 10 ---
 helm/camel-k/crds/crd-integration-kit.yaml         | 30 +++++---
 helm/camel-k/crds/crd-integration-platform.yaml    | 52 +++++++++----
 helm/camel-k/crds/crd-integration.yaml             | 22 ++++--
 helm/camel-k/crds/crd-kamelet-binding.yaml         | 38 +++++++---
 helm/camel-k/crds/crd-pipe.yaml                    | 38 +++++++---
 pkg/apis/camel/v1/integrationkit_types.go          |  4 +-
 pkg/apis/camel/v1/integrationplatform_types.go     |  1 +
 .../camel/v1/integrationplatform_types_support.go  |  8 --
 pkg/apis/camel/v1/trait/quarkus.go                 | 24 ++++--
 pkg/apis/camel/v1/trait/zz_generated.deepcopy.go   |  5 ++
 pkg/builder/image.go                               |  2 +-
 pkg/controller/build/build_monitor.go              |  2 +-
 pkg/controller/build/build_monitor_test.go         |  4 +-
 pkg/controller/integrationkit/build.go             |  2 +-
 pkg/platform/defaults.go                           | 25 ------
 pkg/resources/resources.go                         | 45 ++++-------
 pkg/trait/builder.go                               | 30 ++++++--
 pkg/trait/builder_test.go                          | 28 ++++++-
 pkg/trait/camel_test.go                            |  2 +-
 pkg/trait/quarkus.go                               | 88 +++++++++++++++-------
 pkg/trait/trait_test.go                            |  4 +-
 resources/traits.yaml                              | 20 +++--
 37 files changed, 489 insertions(+), 334 deletions(-)

diff --git a/config/crd/bases/camel.apache.org_integrationkits.yaml b/config/crd/bases/camel.apache.org_integrationkits.yaml
index 359ef577c..f40c04244 100644
--- a/config/crd/bases/camel.apache.org_integrationkits.yaml
+++ b/config/crd/bases/camel.apache.org_integrationkits.yaml
@@ -311,12 +311,8 @@ spec:
                   quarkus:
                     description: 'The Quarkus trait configures the Quarkus runtime.
                       It''s enabled by default. NOTE: Compiling to a native executable,
-                      i.e. when using `package-type=native`, is only supported for
-                      kamelets, as well as YAML and XML integrations. It also requires
-                      at least 4GiB of memory, so the Pod running the native build,
-                      that is either the operator Pod, or the build Pod (depending
-                      on the build strategy configured for the platform), must have
-                      enough memory available.'
+                      requires at least 4GiB of memory, so the Pod running the native
+                      build must have enough memory available.'
                     properties:
                       configuration:
                         description: 'Legacy trait configuration parameters. Deprecated:
@@ -327,19 +323,31 @@ spec:
                         description: Can be used to enable or disable a trait. All
                           traits share this common property.
                         type: boolean
+                      mode:
+                        description: 'The Quarkus mode to run: either `jvm` or `native`
+                          (default `jvm`). In case both `jvm` and `native` are specified,
+                          two `IntegrationKit` resources are created, with the `native`
+                          kit having precedence over the `jvm` one once ready.'
+                        items:
+                          description: QuarkusMode is the type of Quarkus build packaging.
+                          enum:
+                          - jvm
+                          - native
+                          type: string
+                        type: array
                       packageTypes:
-                        description: The Quarkus package types, `fast-jar`, `native-sources`
-                          or `native` (default `fast-jar`). `native` is deprecated.
-                          In case both `fast-jar` and `native` or `native-sources`
+                        description: 'The Quarkus package types, `fast-jar` or `native`
+                          (default `fast-jar`). In case both `fast-jar` and `native`
                           are specified, two `IntegrationKit` resources are created,
                           with the native kit having precedence over the `fast-jar`
                           one once ready. The order influences the resolution of the
                           current kit for the integration. The kit corresponding to
                           the first package type will be assigned to the integration
                           in case no existing kit that matches the integration exists.
+                          Deprecated: use `mode` instead.'
                         items:
-                          description: QuarkusPackageType is the type of Quarkus build
-                            packaging.
+                          description: 'QuarkusPackageType is the type of Quarkus
+                            build packaging. Deprecated: use `QuarkusMode` instead.'
                           enum:
                           - fast-jar
                           - native-sources
diff --git a/config/crd/bases/camel.apache.org_integrationplatforms.yaml b/config/crd/bases/camel.apache.org_integrationplatforms.yaml
index 5d3de2436..b11b568ed 100644
--- a/config/crd/bases/camel.apache.org_integrationplatforms.yaml
+++ b/config/crd/bases/camel.apache.org_integrationplatforms.yaml
@@ -97,8 +97,8 @@ spec:
                       base image with further utility softwares
                     type: string
                   buildCatalogToolTimeout:
-                    description: the timeout (in seconds) to use when creating the
-                      build tools container image
+                    description: 'the timeout (in seconds) to use when creating the
+                      build tools container image Deprecated: no longer in use'
                     type: string
                   buildConfiguration:
                     description: the configuration required to build an Integration
@@ -1616,19 +1616,31 @@ spec:
                         description: Can be used to enable or disable a trait. All
                           traits share this common property.
                         type: boolean
+                      mode:
+                        description: 'The Quarkus mode to run: either `jvm` or `native`
+                          (default `jvm`). In case both `jvm` and `native` are specified,
+                          two `IntegrationKit` resources are created, with the `native`
+                          kit having precedence over the `jvm` one once ready.'
+                        items:
+                          description: QuarkusMode is the type of Quarkus build packaging.
+                          enum:
+                          - jvm
+                          - native
+                          type: string
+                        type: array
                       packageTypes:
-                        description: The Quarkus package types, `fast-jar`, `native-sources`
-                          or `native` (default `fast-jar`). `native` is deprecated.
-                          In case both `fast-jar` and `native` or `native-sources`
+                        description: 'The Quarkus package types, `fast-jar` or `native`
+                          (default `fast-jar`). In case both `fast-jar` and `native`
                           are specified, two `IntegrationKit` resources are created,
                           with the native kit having precedence over the `fast-jar`
                           one once ready. The order influences the resolution of the
                           current kit for the integration. The kit corresponding to
                           the first package type will be assigned to the integration
                           in case no existing kit that matches the integration exists.
+                          Deprecated: use `mode` instead.'
                         items:
-                          description: QuarkusPackageType is the type of Quarkus build
-                            packaging.
+                          description: 'QuarkusPackageType is the type of Quarkus
+                            build packaging. Deprecated: use `QuarkusMode` instead.'
                           enum:
                           - fast-jar
                           - native-sources
@@ -1851,8 +1863,8 @@ spec:
                       base image with further utility softwares
                     type: string
                   buildCatalogToolTimeout:
-                    description: the timeout (in seconds) to use when creating the
-                      build tools container image
+                    description: 'the timeout (in seconds) to use when creating the
+                      build tools container image Deprecated: no longer in use'
                     type: string
                   buildConfiguration:
                     description: the configuration required to build an Integration
@@ -3418,19 +3430,31 @@ spec:
                         description: Can be used to enable or disable a trait. All
                           traits share this common property.
                         type: boolean
+                      mode:
+                        description: 'The Quarkus mode to run: either `jvm` or `native`
+                          (default `jvm`). In case both `jvm` and `native` are specified,
+                          two `IntegrationKit` resources are created, with the `native`
+                          kit having precedence over the `jvm` one once ready.'
+                        items:
+                          description: QuarkusMode is the type of Quarkus build packaging.
+                          enum:
+                          - jvm
+                          - native
+                          type: string
+                        type: array
                       packageTypes:
-                        description: The Quarkus package types, `fast-jar`, `native-sources`
-                          or `native` (default `fast-jar`). `native` is deprecated.
-                          In case both `fast-jar` and `native` or `native-sources`
+                        description: 'The Quarkus package types, `fast-jar` or `native`
+                          (default `fast-jar`). In case both `fast-jar` and `native`
                           are specified, two `IntegrationKit` resources are created,
                           with the native kit having precedence over the `fast-jar`
                           one once ready. The order influences the resolution of the
                           current kit for the integration. The kit corresponding to
                           the first package type will be assigned to the integration
                           in case no existing kit that matches the integration exists.
+                          Deprecated: use `mode` instead.'
                         items:
-                          description: QuarkusPackageType is the type of Quarkus build
-                            packaging.
+                          description: 'QuarkusPackageType is the type of Quarkus
+                            build packaging. Deprecated: use `QuarkusMode` instead.'
                           enum:
                           - fast-jar
                           - native-sources
diff --git a/config/crd/bases/camel.apache.org_integrations.yaml b/config/crd/bases/camel.apache.org_integrations.yaml
index f7fefbc25..e59cb1c45 100644
--- a/config/crd/bases/camel.apache.org_integrations.yaml
+++ b/config/crd/bases/camel.apache.org_integrations.yaml
@@ -7533,19 +7533,31 @@ spec:
                         description: Can be used to enable or disable a trait. All
                           traits share this common property.
                         type: boolean
+                      mode:
+                        description: 'The Quarkus mode to run: either `jvm` or `native`
+                          (default `jvm`). In case both `jvm` and `native` are specified,
+                          two `IntegrationKit` resources are created, with the `native`
+                          kit having precedence over the `jvm` one once ready.'
+                        items:
+                          description: QuarkusMode is the type of Quarkus build packaging.
+                          enum:
+                          - jvm
+                          - native
+                          type: string
+                        type: array
                       packageTypes:
-                        description: The Quarkus package types, `fast-jar`, `native-sources`
-                          or `native` (default `fast-jar`). `native` is deprecated.
-                          In case both `fast-jar` and `native` or `native-sources`
+                        description: 'The Quarkus package types, `fast-jar` or `native`
+                          (default `fast-jar`). In case both `fast-jar` and `native`
                           are specified, two `IntegrationKit` resources are created,
                           with the native kit having precedence over the `fast-jar`
                           one once ready. The order influences the resolution of the
                           current kit for the integration. The kit corresponding to
                           the first package type will be assigned to the integration
                           in case no existing kit that matches the integration exists.
+                          Deprecated: use `mode` instead.'
                         items:
-                          description: QuarkusPackageType is the type of Quarkus build
-                            packaging.
+                          description: 'QuarkusPackageType is the type of Quarkus
+                            build packaging. Deprecated: use `QuarkusMode` instead.'
                           enum:
                           - fast-jar
                           - native-sources
diff --git a/config/crd/bases/camel.apache.org_kameletbindings.yaml b/config/crd/bases/camel.apache.org_kameletbindings.yaml
index 69d9aee3d..abde245c9 100644
--- a/config/crd/bases/camel.apache.org_kameletbindings.yaml
+++ b/config/crd/bases/camel.apache.org_kameletbindings.yaml
@@ -7828,20 +7828,34 @@ spec:
                             description: Can be used to enable or disable a trait.
                               All traits share this common property.
                             type: boolean
-                          packageTypes:
-                            description: The Quarkus package types, `fast-jar`, `native-sources`
-                              or `native` (default `fast-jar`). `native` is deprecated.
-                              In case both `fast-jar` and `native` or `native-sources`
+                          mode:
+                            description: 'The Quarkus mode to run: either `jvm` or
+                              `native` (default `jvm`). In case both `jvm` and `native`
                               are specified, two `IntegrationKit` resources are created,
-                              with the native kit having precedence over the `fast-jar`
-                              one once ready. The order influences the resolution
-                              of the current kit for the integration. The kit corresponding
-                              to the first package type will be assigned to the integration
-                              in case no existing kit that matches the integration
-                              exists.
+                              with the `native` kit having precedence over the `jvm`
+                              one once ready.'
+                            items:
+                              description: QuarkusMode is the type of Quarkus build
+                                packaging.
+                              enum:
+                              - jvm
+                              - native
+                              type: string
+                            type: array
+                          packageTypes:
+                            description: 'The Quarkus package types, `fast-jar` or
+                              `native` (default `fast-jar`). In case both `fast-jar`
+                              and `native` are specified, two `IntegrationKit` resources
+                              are created, with the native kit having precedence over
+                              the `fast-jar` one once ready. The order influences
+                              the resolution of the current kit for the integration.
+                              The kit corresponding to the first package type will
+                              be assigned to the integration in case no existing kit
+                              that matches the integration exists. Deprecated: use
+                              `mode` instead.'
                             items:
-                              description: QuarkusPackageType is the type of Quarkus
-                                build packaging.
+                              description: 'QuarkusPackageType is the type of Quarkus
+                                build packaging. Deprecated: use `QuarkusMode` instead.'
                               enum:
                               - fast-jar
                               - native-sources
diff --git a/config/crd/bases/camel.apache.org_pipes.yaml b/config/crd/bases/camel.apache.org_pipes.yaml
index 23a287c66..a8a40da19 100644
--- a/config/crd/bases/camel.apache.org_pipes.yaml
+++ b/config/crd/bases/camel.apache.org_pipes.yaml
@@ -7825,20 +7825,34 @@ spec:
                             description: Can be used to enable or disable a trait.
                               All traits share this common property.
                             type: boolean
-                          packageTypes:
-                            description: The Quarkus package types, `fast-jar`, `native-sources`
-                              or `native` (default `fast-jar`). `native` is deprecated.
-                              In case both `fast-jar` and `native` or `native-sources`
+                          mode:
+                            description: 'The Quarkus mode to run: either `jvm` or
+                              `native` (default `jvm`). In case both `jvm` and `native`
                               are specified, two `IntegrationKit` resources are created,
-                              with the native kit having precedence over the `fast-jar`
-                              one once ready. The order influences the resolution
-                              of the current kit for the integration. The kit corresponding
-                              to the first package type will be assigned to the integration
-                              in case no existing kit that matches the integration
-                              exists.
+                              with the `native` kit having precedence over the `jvm`
+                              one once ready.'
+                            items:
+                              description: QuarkusMode is the type of Quarkus build
+                                packaging.
+                              enum:
+                              - jvm
+                              - native
+                              type: string
+                            type: array
+                          packageTypes:
+                            description: 'The Quarkus package types, `fast-jar` or
+                              `native` (default `fast-jar`). In case both `fast-jar`
+                              and `native` are specified, two `IntegrationKit` resources
+                              are created, with the native kit having precedence over
+                              the `fast-jar` one once ready. The order influences
+                              the resolution of the current kit for the integration.
+                              The kit corresponding to the first package type will
+                              be assigned to the integration in case no existing kit
+                              that matches the integration exists. Deprecated: use
+                              `mode` instead.'
                             items:
-                              description: QuarkusPackageType is the type of Quarkus
-                                build packaging.
+                              description: 'QuarkusPackageType is the type of Quarkus
+                                build packaging. Deprecated: use `QuarkusMode` instead.'
                               enum:
                               - fast-jar
                               - native-sources
diff --git a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
index 6fa1d8f2c..bba0ee6ac 100644
--- a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
+++ b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc
@@ -2568,7 +2568,7 @@ The Camel trait sets up Camel configuration.
 
 The Quarkus trait configures the Quarkus runtime.
 It's enabled by default.
-NOTE: Compiling to a native executable, i.e. when using `package-type=native`, is only supported for kamelets, as well as YAML and XML integrations. It also requires at least 4GiB of memory, so the Pod running the native build, that is either the operator Pod, or the build Pod (depending on the build strategy configured for the platform), must have enough memory available.
+NOTE: Compiling to a native executable, requires at least 4GiB of memory, so the Pod running the native build must have enough memory available.
 
 |`registry` +
 *xref:#_camel_apache_org_v1_trait_RegistryTrait[RegistryTrait]*
@@ -2672,6 +2672,7 @@ the image registry used to push/pull Integration images
 
 
 the timeout (in seconds) to use when creating the build tools container image
+Deprecated: no longer in use
 
 |`timeout` +
 *https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.27/#duration-v1-meta[Kubernetes meta/v1.Duration]*
@@ -7578,6 +7579,16 @@ Automatically configures the platform registry secret on the pod if it is of typ
 
 |===
 
+[#_camel_apache_org_v1_trait_QuarkusMode]
+=== QuarkusMode(`string` alias)
+
+*Appears on:*
+
+* <<#_camel_apache_org_v1_trait_QuarkusTrait, QuarkusTrait>>
+
+QuarkusMode is the type of Quarkus build packaging.
+
+
 [#_camel_apache_org_v1_trait_QuarkusPackageType]
 === QuarkusPackageType(`string` alias)
 
@@ -7586,6 +7597,7 @@ Automatically configures the platform registry secret on the pod if it is of typ
 * <<#_camel_apache_org_v1_trait_QuarkusTrait, QuarkusTrait>>
 
 QuarkusPackageType is the type of Quarkus build packaging.
+Deprecated: use `QuarkusMode` instead.
 
 
 [#_camel_apache_org_v1_trait_QuarkusTrait]
@@ -7622,12 +7634,22 @@ Compiling to a native executable, i.e. when using `package-type=native`, require
 |
 
 
-The Quarkus package types, `fast-jar`, `native-sources` or `native` (default `fast-jar`). `native` is deprecated.
-In case both `fast-jar` and `native` or `native-sources` are specified, two `IntegrationKit` resources are created,
+The Quarkus package types, `fast-jar` or `native` (default `fast-jar`).
+In case both `fast-jar` and `native` are specified, two `IntegrationKit` resources are created,
 with the native kit having precedence over the `fast-jar` one once ready.
 The order influences the resolution of the current kit for the integration.
 The kit corresponding to the first package type will be assigned to the
 integration in case no existing kit that matches the integration exists.
+Deprecated: use `mode` instead.
+
+|`mode` +
+*xref:#_camel_apache_org_v1_trait_QuarkusMode[[\]QuarkusMode]*
+|
+
+
+The Quarkus mode to run: either `jvm` or `native` (default `jvm`).
+In case both `jvm` and `native` are specified, two `IntegrationKit` resources are created,
+with the `native` kit having precedence over the `jvm` one once ready.
 
 
 |===
diff --git a/docs/modules/traits/pages/quarkus.adoc b/docs/modules/traits/pages/quarkus.adoc
index f5014394f..d015deadc 100755
--- a/docs/modules/traits/pages/quarkus.adoc
+++ b/docs/modules/traits/pages/quarkus.adoc
@@ -35,12 +35,19 @@ The following configuration options are available:
 
 | quarkus.package-type
 | []github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait.QuarkusPackageType
-| The Quarkus package types, `fast-jar`, `native-sources` or `native` (default `fast-jar`). `native` is deprecated.
-In case both `fast-jar` and `native` or `native-sources` are specified, two `IntegrationKit` resources are created,
+| The Quarkus package types, `fast-jar` or `native` (default `fast-jar`).
+In case both `fast-jar` and `native` are specified, two `IntegrationKit` resources are created,
 with the native kit having precedence over the `fast-jar` one once ready.
 The order influences the resolution of the current kit for the integration.
 The kit corresponding to the first package type will be assigned to the
 integration in case no existing kit that matches the integration exists.
+Deprecated: use `mode` instead.
+
+| quarkus.mode
+| []github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait.QuarkusMode
+| The Quarkus mode to run: either `jvm` or `native` (default `jvm`).
+In case both `jvm` and `native` are specified, two `IntegrationKit` resources are created,
+with the `native` kit having precedence over the `jvm` one once ready.
 
 |===
 
@@ -59,6 +66,6 @@ While the compilation to native executables produces integrations that start fas
 In order to combine the best of both worlds, it's possible to configure the Quarkus trait to run both traditional and native builds in parallel when running an integration, e.g.:
 
 [source,console]
-$ kamel run -t quarkus.package-type=fast-jar -t quarkus.package-type=native ...
+$ kamel run -t quarkus.mode=jvm -t quarkus.mode=native ...
 
-The integration pod will run as soon as the `fast-jar` build completes, and a rollout deployment to the `native` image will be triggered, as soon as the `native` build completes, with no service interruption.
+The Integration pod will run as soon as the `hvm` build completes, and a rollout deployment to the `native` image will be triggered, as soon as the `native` build completes, with no service interruption.
diff --git a/e2e/builder/build_test.go b/e2e/builder/build_test.go
index 1b11797db..204fd7d80 100644
--- a/e2e/builder/build_test.go
+++ b/e2e/builder/build_test.go
@@ -310,7 +310,7 @@ func TestKitTimerToLogFullNativeBuild(t *testing.T) {
 			"camel:timer", "camel:log",
 		},
 		traits: []string{
-			"quarkus.package-type=native",
+			"quarkus.mode=native",
 		},
 	}, v1.BuildPhaseSucceeded, v1.IntegrationKitPhaseReady)
 }
diff --git a/e2e/common/traits/builder_test.go b/e2e/common/traits/builder_test.go
index 795b2abd3..6b1419174 100644
--- a/e2e/common/traits/builder_test.go
+++ b/e2e/common/traits/builder_test.go
@@ -123,10 +123,10 @@ func TestBuilderTrait(t *testing.T) {
 		name := "java-resource-config"
 		Expect(KamelRunWithID(operatorID, ns, "files/Java.java",
 			"--name", name,
-			"-t", "builder.request-cpu=500m",
-			"-t", "builder.limit-cpu=1000m",
-			"-t", "builder.request-memory=2Gi",
-			"-t", "builder.limit-memory=3Gi",
+			"-t", "builder.tasks-request-cpu=builder:500m",
+			"-t", "builder.tasks-limit-cpu=builder:1000m",
+			"-t", "builder.tasks-request-memory=builder:2Gi",
+			"-t", "builder.tasks-limit-memory=builder:3Gi",
 			"-t", "builder.strategy=pod",
 		).Execute()).To(Succeed())
 
diff --git a/e2e/commonwithcustominstall/catalog_builder_test.go b/e2e/commonwithcustominstall/catalog_builder_test.go
index 436856c82..bae648049 100644
--- a/e2e/commonwithcustominstall/catalog_builder_test.go
+++ b/e2e/commonwithcustominstall/catalog_builder_test.go
@@ -26,11 +26,9 @@ import (
 	"fmt"
 	"strings"
 	"testing"
-	"time"
 
 	. "github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 	. "github.com/apache/camel-k/v2/e2e/support"
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
@@ -63,7 +61,7 @@ func TestCamelCatalogBuilder(t *testing.T) {
 
 			Eventually(CamelCatalog(ns, nonCompatibleCatalogName)).ShouldNot(BeNil())
 			Eventually(CamelCatalogPhase(ns, nonCompatibleCatalogName)).Should(Equal(v1.CamelCatalogPhaseError))
-			Eventually(CamelCatalogCondition(ns, nonCompatibleCatalogName, v1.CamelCatalogConditionReady)().Message).Should(ContainSubstring("missing base image"))
+			Eventually(CamelCatalogCondition(ns, nonCompatibleCatalogName, v1.CamelCatalogConditionReady)().Message).Should(ContainSubstring("Container image tool missing in catalog"))
 
 			Eventually(IntegrationKit(ns, name)).ShouldNot(Equal(""))
 			kitName := IntegrationKit(ns, name)()
@@ -140,32 +138,4 @@ func TestCamelCatalogBuilder(t *testing.T) {
 
 		Expect(Kamel("delete", "--all", "-n", ns).Execute()).To(Succeed())
 	})
-
-	WithNewTestNamespace(t, func(ns string) {
-		operatorID := fmt.Sprintf("camel-k-%s", ns)
-		Expect(KamelInstallWithID(operatorID, ns).Execute()).To(Succeed())
-		Eventually(OperatorPod(ns)).ShouldNot(BeNil())
-		Eventually(Platform(ns)).ShouldNot(BeNil())
-
-		pl := Platform(ns)()
-		// set a very short timeout to simulate the timeout
-		pl.Spec.Build.BuildCatalogToolTimeout = &metav1.Duration{
-			Duration: 1 * time.Second,
-		}
-		TestClient().Update(TestContext, pl)
-		Eventually(Platform(ns)).ShouldNot(BeNil())
-		Eventually(PlatformBuildCatalogToolTimeout(ns)).Should(Equal(
-			&metav1.Duration{
-				Duration: 1 * time.Second,
-			},
-		))
-
-		Eventually(PlatformConditionStatus(ns, v1.IntegrationPlatformConditionTypeCreated), TestTimeoutShort).
-			Should(Equal(corev1.ConditionTrue))
-		catalogName := fmt.Sprintf("camel-catalog-%s", strings.ToLower(defaults.DefaultRuntimeVersion))
-
-		Eventually(CamelCatalog(ns, catalogName)).ShouldNot(BeNil())
-		Eventually(CamelCatalogPhase(ns, catalogName)).Should(Equal(v1.CamelCatalogPhaseError))
-		Eventually(CamelCatalogCondition(ns, catalogName, v1.CamelCatalogConditionReady)().Message).Should(ContainSubstring("build timeout"))
-	})
 }
diff --git a/e2e/native/native_binding_test.go b/e2e/native/native_binding_test.go
index 56f21f6ba..0f754dffa 100644
--- a/e2e/native/native_binding_test.go
+++ b/e2e/native/native_binding_test.go
@@ -27,9 +27,7 @@ import (
 	v1 "github.com/apache/camel-k/v2/pkg/apis/camel/v1"
 	. "github.com/onsi/gomega"
 	corev1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"testing"
-	"time"
 )
 
 func TestNativeBinding(t *testing.T) {
@@ -40,30 +38,15 @@ func TestNativeBinding(t *testing.T) {
 			"--maven-cli-option", "-Dquarkus.native.native-image-xmx=6g",
 		).Execute()).To(Succeed())
 		Eventually(PlatformPhase(ns), TestTimeoutMedium).Should(Equal(v1.IntegrationPlatformPhaseReady))
-
-		pl := Platform(ns)()
-		// set a longer timeout than default as for some reason the builder hit the timeout
-		pl.Spec.Build.BuildCatalogToolTimeout = &metav1.Duration{
-			Duration: 5 * time.Minute,
-		}
-		TestClient().Update(TestContext, pl)
-		Eventually(Platform(ns)).ShouldNot(BeNil())
-		Eventually(PlatformBuildCatalogToolTimeout(ns)).Should(Equal(
-			&metav1.Duration{
-				Duration: 5 * time.Minute,
-			},
-		))
-
 		message := "Magicstring!"
-
 		t.Run("binding with native build", func(t *testing.T) {
 			bindingName := "native-binding"
 			Expect(KamelBindWithID(operatorID, ns,
 				"timer-source",
 				"log-sink",
 				"-p", "source.message="+message,
-				"--annotation", "trait.camel.apache.org/quarkus.package-type=native",
-				"--annotation", "trait.camel.apache.org/builder.limit-memory=6.5Gi",
+				"--annotation", "trait.camel.apache.org/quarkus.mode=native",
+				"--annotation", "trait.camel.apache.org/builder.tasks-limit-memory=quarkus-native:6.5Gi",
 				"--name", bindingName,
 			).Execute()).To(Succeed())
 
diff --git a/e2e/native/native_test.go b/e2e/native/native_test.go
index 279780894..739ddf5ba 100644
--- a/e2e/native/native_test.go
+++ b/e2e/native/native_test.go
@@ -45,8 +45,8 @@ func TestNativeIntegrations(t *testing.T) {
 		t.Run("unsupported integration source language", func(t *testing.T) {
 			name := "unsupported-js"
 			Expect(KamelRunWithID(operatorID, ns, "files/JavaScript.js", "--name", name,
-				"-t", "quarkus.package-type=native",
-				"-t", "builder.limit-memory=6.5Gi",
+				"-t", "quarkus.mode=native",
+				"-t", "builder.tasks-limit-memory=quarkus-native:=6.5Gi",
 			).Execute()).To(Succeed())
 
 			Eventually(IntegrationPhase(ns, name)).Should(Equal(v1.IntegrationPhaseError))
@@ -60,8 +60,8 @@ func TestNativeIntegrations(t *testing.T) {
 		t.Run("xml native support", func(t *testing.T) {
 			name := "xml-native"
 			Expect(KamelRunWithID(operatorID, ns, "files/Xml.xml", "--name", name,
-				"-t", "quarkus.package-type=native",
-				"-t", "builder.limit-memory=6.5Gi",
+				"-t", "quarkus.mode=native",
+				"-t", "builder.tasks-limit-memory=quarkus-native:=6.5Gi",
 			).Execute()).To(Succeed())
 
 			Eventually(IntegrationPodPhase(ns, name), TestTimeoutVeryLong).Should(Equal(corev1.PodRunning))
@@ -81,9 +81,9 @@ func TestNativeIntegrations(t *testing.T) {
 			Expect(DeleteKits(ns)).To(Succeed())
 			name := "yaml-native"
 			Expect(KamelRunWithID(operatorID, ns, "files/yaml.yaml", "--name", name,
-				"-t", "quarkus.package-type=fast-jar",
-				"-t", "quarkus.package-type=native",
-				"-t", "builder.limit-memory=6.5Gi",
+				"-t", "quarkus.mode=fast-jar",
+				"-t", "quarkus.mode=native",
+				"-t", "builder.tasks-limit-memory=quarkus-native:=6.5Gi",
 			).Execute()).To(Succeed())
 
 			// Check that two Kits are created with distinct layout
@@ -134,8 +134,8 @@ func TestNativeIntegrations(t *testing.T) {
 			t.Run("yaml native should not rebuild", func(t *testing.T) {
 				name := "yaml-native-2"
 				Expect(KamelRunWithID(operatorID, ns, "files/yaml2.yaml", "--name", name,
-					"-t", "quarkus.package-type=native",
-					"-t", "builder.limit-memory=6.5Gi",
+					"-t", "quarkus.mode=native",
+					"-t", "builder.tasks-limit-memory=quarkus-native:6.5Gi",
 				).Execute()).To(Succeed())
 
 				// This one should run quickly as it suppose to reuse an IntegrationKit
diff --git a/e2e/native/native_test_support.go b/e2e/native/native_test_support.go
index 0332b871c..576c19d8c 100644
--- a/e2e/native/native_test_support.go
+++ b/e2e/native/native_test_support.go
@@ -33,7 +33,7 @@ import (
 
 var (
 	withFastJarLayout = KitWithLabels(map[string]string{v1.IntegrationKitLayoutLabel: v1.IntegrationKitLayoutFastJar})
-	withNativeLayout  = KitWithLabels(map[string]string{v1.IntegrationKitLayoutLabel: v1.IntegrationKitLayoutNative})
+	withNativeLayout  = KitWithLabels(map[string]string{v1.IntegrationKitLayoutLabel: v1.IntegrationKitLayoutNativeSources})
 )
 
 func getContainerCommand() func(pod *corev1.Pod) string {
diff --git a/e2e/native/native_with_sources_test.go b/e2e/native/native_with_sources_test.go
index cb3101c84..6478540f5 100644
--- a/e2e/native/native_with_sources_test.go
+++ b/e2e/native/native_with_sources_test.go
@@ -43,24 +43,11 @@ func TestNativeHighMemoryIntegrations(t *testing.T) {
 		).Execute()).To(Succeed())
 		Eventually(PlatformPhase(ns), TestTimeoutMedium).Should(Equal(v1.IntegrationPlatformPhaseReady))
 
-		pl := Platform(ns)()
-		// set a longer timeout than default as for some reason the builder hit the timeout
-		pl.Spec.Build.BuildCatalogToolTimeout = &metav1.Duration{
-			Duration: 5 * time.Minute,
-		}
-		TestClient().Update(TestContext, pl)
-		Eventually(Platform(ns)).ShouldNot(BeNil())
-		Eventually(PlatformBuildCatalogToolTimeout(ns)).Should(Equal(
-			&metav1.Duration{
-				Duration: 5 * time.Minute,
-			},
-		))
-
 		t.Run("java native support", func(t *testing.T) {
 			name := "java-native"
 			Expect(KamelRunWithID(operatorID, ns, "files/Java.java", "--name", name,
-				"-t", "quarkus.package-type=native",
-				"-t", "builder.limit-memory=9.5Gi",
+				"-t", "quarkus.mode=native",
+				"-t", "builder.tasks-limit-memory=quarkus-native:=9.5Gi",
 			).Execute()).To(Succeed())
 
 			Eventually(IntegrationPodPhase(ns, name), TestTimeoutVeryLong).Should(Equal(corev1.PodRunning))
@@ -73,8 +60,8 @@ func TestNativeHighMemoryIntegrations(t *testing.T) {
 			t.Run("java native same should not rebuild", func(t *testing.T) {
 				name := "java-native-clone"
 				Expect(KamelRunWithID(operatorID, ns, "files/Java.java", "--name", name,
-					"-t", "quarkus.package-type=native",
-					"-t", "builder.limit-memory=9.5Gi",
+					"-t", "quarkus.mode=native",
+					"-t", "builder.tasks-limit-memory=quarkus-native:=9.5Gi",
 				).Execute()).To(Succeed())
 
 				// This one should run quickly as it suppose to reuse an IntegrationKit
@@ -90,8 +77,8 @@ func TestNativeHighMemoryIntegrations(t *testing.T) {
 			t.Run("java native should rebuild", func(t *testing.T) {
 				name := "java-native-2"
 				Expect(KamelRunWithID(operatorID, ns, "files/Java2.java", "--name", name,
-					"-t", "quarkus.package-type=native",
-					"-t", "builder.limit-memory=9.5Gi",
+					"-t", "quarkus.mode=native",
+					"-t", "builder.tasks-limit-memory=quarkus-native:=9.5Gi",
 				).Execute()).To(Succeed())
 
 				Eventually(IntegrationPodPhase(ns, name), TestTimeoutVeryLong).Should(Equal(corev1.PodRunning))
@@ -110,8 +97,8 @@ func TestNativeHighMemoryIntegrations(t *testing.T) {
 		t.Run("groovy native support", func(t *testing.T) {
 			name := "groovy-native"
 			Expect(KamelRunWithID(operatorID, ns, "files/Groovy.groovy", "--name", name,
-				"-t", "quarkus.package-type=native",
-				"-t", "builder.limit-memory=9.5Gi",
+				"-t", "quarkus.mode=native",
+				"-t", "builder.tasks-limit-memory=quarkus-native:=9.5Gi",
 			).Execute()).To(Succeed())
 
 			Eventually(IntegrationPodPhase(ns, name), TestTimeoutVeryLong).Should(Equal(corev1.PodRunning))
@@ -129,8 +116,8 @@ func TestNativeHighMemoryIntegrations(t *testing.T) {
 		t.Run("kotlin native support", func(t *testing.T) {
 			name := "kotlin-native"
 			Expect(KamelRunWithID(operatorID, ns, "files/Kotlin.kts", "--name", name,
-				"-t", "quarkus.package-type=native",
-				"-t", "builder.limit-memory=9.5Gi",
+				"-t", "quarkus.mode=native",
+				"-t", "builder.tasks-limit-memory=quarkus-native:=9.5Gi",
 			).Execute()).To(Succeed())
 
 			Eventually(IntegrationPodPhase(ns, name), TestTimeoutVeryLong).Should(Equal(corev1.PodRunning))
diff --git a/e2e/support/test_support.go b/e2e/support/test_support.go
index 171ba2014..bbb10228f 100644
--- a/e2e/support/test_support.go
+++ b/e2e/support/test_support.go
@@ -2019,16 +2019,6 @@ func PlatformProfile(ns string) func() v1.TraitProfile {
 	}
 }
 
-func PlatformBuildCatalogToolTimeout(ns string) func() *metav1.Duration {
-	return func() *metav1.Duration {
-		p := Platform(ns)()
-		if p == nil {
-			return &metav1.Duration{}
-		}
-		return p.Status.Build.BuildCatalogToolTimeout
-	}
-}
-
 func PlatformTimeout(ns string) func() *metav1.Duration {
 	return func() *metav1.Duration {
 		p := Platform(ns)()
diff --git a/helm/camel-k/crds/crd-integration-kit.yaml b/helm/camel-k/crds/crd-integration-kit.yaml
index 359ef577c..f40c04244 100644
--- a/helm/camel-k/crds/crd-integration-kit.yaml
+++ b/helm/camel-k/crds/crd-integration-kit.yaml
@@ -311,12 +311,8 @@ spec:
                   quarkus:
                     description: 'The Quarkus trait configures the Quarkus runtime.
                       It''s enabled by default. NOTE: Compiling to a native executable,
-                      i.e. when using `package-type=native`, is only supported for
-                      kamelets, as well as YAML and XML integrations. It also requires
-                      at least 4GiB of memory, so the Pod running the native build,
-                      that is either the operator Pod, or the build Pod (depending
-                      on the build strategy configured for the platform), must have
-                      enough memory available.'
+                      requires at least 4GiB of memory, so the Pod running the native
+                      build must have enough memory available.'
                     properties:
                       configuration:
                         description: 'Legacy trait configuration parameters. Deprecated:
@@ -327,19 +323,31 @@ spec:
                         description: Can be used to enable or disable a trait. All
                           traits share this common property.
                         type: boolean
+                      mode:
+                        description: 'The Quarkus mode to run: either `jvm` or `native`
+                          (default `jvm`). In case both `jvm` and `native` are specified,
+                          two `IntegrationKit` resources are created, with the `native`
+                          kit having precedence over the `jvm` one once ready.'
+                        items:
+                          description: QuarkusMode is the type of Quarkus build packaging.
+                          enum:
+                          - jvm
+                          - native
+                          type: string
+                        type: array
                       packageTypes:
-                        description: The Quarkus package types, `fast-jar`, `native-sources`
-                          or `native` (default `fast-jar`). `native` is deprecated.
-                          In case both `fast-jar` and `native` or `native-sources`
+                        description: 'The Quarkus package types, `fast-jar` or `native`
+                          (default `fast-jar`). In case both `fast-jar` and `native`
                           are specified, two `IntegrationKit` resources are created,
                           with the native kit having precedence over the `fast-jar`
                           one once ready. The order influences the resolution of the
                           current kit for the integration. The kit corresponding to
                           the first package type will be assigned to the integration
                           in case no existing kit that matches the integration exists.
+                          Deprecated: use `mode` instead.'
                         items:
-                          description: QuarkusPackageType is the type of Quarkus build
-                            packaging.
+                          description: 'QuarkusPackageType is the type of Quarkus
+                            build packaging. Deprecated: use `QuarkusMode` instead.'
                           enum:
                           - fast-jar
                           - native-sources
diff --git a/helm/camel-k/crds/crd-integration-platform.yaml b/helm/camel-k/crds/crd-integration-platform.yaml
index 5d3de2436..b11b568ed 100644
--- a/helm/camel-k/crds/crd-integration-platform.yaml
+++ b/helm/camel-k/crds/crd-integration-platform.yaml
@@ -97,8 +97,8 @@ spec:
                       base image with further utility softwares
                     type: string
                   buildCatalogToolTimeout:
-                    description: the timeout (in seconds) to use when creating the
-                      build tools container image
+                    description: 'the timeout (in seconds) to use when creating the
+                      build tools container image Deprecated: no longer in use'
                     type: string
                   buildConfiguration:
                     description: the configuration required to build an Integration
@@ -1616,19 +1616,31 @@ spec:
                         description: Can be used to enable or disable a trait. All
                           traits share this common property.
                         type: boolean
+                      mode:
+                        description: 'The Quarkus mode to run: either `jvm` or `native`
+                          (default `jvm`). In case both `jvm` and `native` are specified,
+                          two `IntegrationKit` resources are created, with the `native`
+                          kit having precedence over the `jvm` one once ready.'
+                        items:
+                          description: QuarkusMode is the type of Quarkus build packaging.
+                          enum:
+                          - jvm
+                          - native
+                          type: string
+                        type: array
                       packageTypes:
-                        description: The Quarkus package types, `fast-jar`, `native-sources`
-                          or `native` (default `fast-jar`). `native` is deprecated.
-                          In case both `fast-jar` and `native` or `native-sources`
+                        description: 'The Quarkus package types, `fast-jar` or `native`
+                          (default `fast-jar`). In case both `fast-jar` and `native`
                           are specified, two `IntegrationKit` resources are created,
                           with the native kit having precedence over the `fast-jar`
                           one once ready. The order influences the resolution of the
                           current kit for the integration. The kit corresponding to
                           the first package type will be assigned to the integration
                           in case no existing kit that matches the integration exists.
+                          Deprecated: use `mode` instead.'
                         items:
-                          description: QuarkusPackageType is the type of Quarkus build
-                            packaging.
+                          description: 'QuarkusPackageType is the type of Quarkus
+                            build packaging. Deprecated: use `QuarkusMode` instead.'
                           enum:
                           - fast-jar
                           - native-sources
@@ -1851,8 +1863,8 @@ spec:
                       base image with further utility softwares
                     type: string
                   buildCatalogToolTimeout:
-                    description: the timeout (in seconds) to use when creating the
-                      build tools container image
+                    description: 'the timeout (in seconds) to use when creating the
+                      build tools container image Deprecated: no longer in use'
                     type: string
                   buildConfiguration:
                     description: the configuration required to build an Integration
@@ -3418,19 +3430,31 @@ spec:
                         description: Can be used to enable or disable a trait. All
                           traits share this common property.
                         type: boolean
+                      mode:
+                        description: 'The Quarkus mode to run: either `jvm` or `native`
+                          (default `jvm`). In case both `jvm` and `native` are specified,
+                          two `IntegrationKit` resources are created, with the `native`
+                          kit having precedence over the `jvm` one once ready.'
+                        items:
+                          description: QuarkusMode is the type of Quarkus build packaging.
+                          enum:
+                          - jvm
+                          - native
+                          type: string
+                        type: array
                       packageTypes:
-                        description: The Quarkus package types, `fast-jar`, `native-sources`
-                          or `native` (default `fast-jar`). `native` is deprecated.
-                          In case both `fast-jar` and `native` or `native-sources`
+                        description: 'The Quarkus package types, `fast-jar` or `native`
+                          (default `fast-jar`). In case both `fast-jar` and `native`
                           are specified, two `IntegrationKit` resources are created,
                           with the native kit having precedence over the `fast-jar`
                           one once ready. The order influences the resolution of the
                           current kit for the integration. The kit corresponding to
                           the first package type will be assigned to the integration
                           in case no existing kit that matches the integration exists.
+                          Deprecated: use `mode` instead.'
                         items:
-                          description: QuarkusPackageType is the type of Quarkus build
-                            packaging.
+                          description: 'QuarkusPackageType is the type of Quarkus
+                            build packaging. Deprecated: use `QuarkusMode` instead.'
                           enum:
                           - fast-jar
                           - native-sources
diff --git a/helm/camel-k/crds/crd-integration.yaml b/helm/camel-k/crds/crd-integration.yaml
index f7fefbc25..e59cb1c45 100644
--- a/helm/camel-k/crds/crd-integration.yaml
+++ b/helm/camel-k/crds/crd-integration.yaml
@@ -7533,19 +7533,31 @@ spec:
                         description: Can be used to enable or disable a trait. All
                           traits share this common property.
                         type: boolean
+                      mode:
+                        description: 'The Quarkus mode to run: either `jvm` or `native`
+                          (default `jvm`). In case both `jvm` and `native` are specified,
+                          two `IntegrationKit` resources are created, with the `native`
+                          kit having precedence over the `jvm` one once ready.'
+                        items:
+                          description: QuarkusMode is the type of Quarkus build packaging.
+                          enum:
+                          - jvm
+                          - native
+                          type: string
+                        type: array
                       packageTypes:
-                        description: The Quarkus package types, `fast-jar`, `native-sources`
-                          or `native` (default `fast-jar`). `native` is deprecated.
-                          In case both `fast-jar` and `native` or `native-sources`
+                        description: 'The Quarkus package types, `fast-jar` or `native`
+                          (default `fast-jar`). In case both `fast-jar` and `native`
                           are specified, two `IntegrationKit` resources are created,
                           with the native kit having precedence over the `fast-jar`
                           one once ready. The order influences the resolution of the
                           current kit for the integration. The kit corresponding to
                           the first package type will be assigned to the integration
                           in case no existing kit that matches the integration exists.
+                          Deprecated: use `mode` instead.'
                         items:
-                          description: QuarkusPackageType is the type of Quarkus build
-                            packaging.
+                          description: 'QuarkusPackageType is the type of Quarkus
+                            build packaging. Deprecated: use `QuarkusMode` instead.'
                           enum:
                           - fast-jar
                           - native-sources
diff --git a/helm/camel-k/crds/crd-kamelet-binding.yaml b/helm/camel-k/crds/crd-kamelet-binding.yaml
index 69d9aee3d..abde245c9 100644
--- a/helm/camel-k/crds/crd-kamelet-binding.yaml
+++ b/helm/camel-k/crds/crd-kamelet-binding.yaml
@@ -7828,20 +7828,34 @@ spec:
                             description: Can be used to enable or disable a trait.
                               All traits share this common property.
                             type: boolean
-                          packageTypes:
-                            description: The Quarkus package types, `fast-jar`, `native-sources`
-                              or `native` (default `fast-jar`). `native` is deprecated.
-                              In case both `fast-jar` and `native` or `native-sources`
+                          mode:
+                            description: 'The Quarkus mode to run: either `jvm` or
+                              `native` (default `jvm`). In case both `jvm` and `native`
                               are specified, two `IntegrationKit` resources are created,
-                              with the native kit having precedence over the `fast-jar`
-                              one once ready. The order influences the resolution
-                              of the current kit for the integration. The kit corresponding
-                              to the first package type will be assigned to the integration
-                              in case no existing kit that matches the integration
-                              exists.
+                              with the `native` kit having precedence over the `jvm`
+                              one once ready.'
+                            items:
+                              description: QuarkusMode is the type of Quarkus build
+                                packaging.
+                              enum:
+                              - jvm
+                              - native
+                              type: string
+                            type: array
+                          packageTypes:
+                            description: 'The Quarkus package types, `fast-jar` or
+                              `native` (default `fast-jar`). In case both `fast-jar`
+                              and `native` are specified, two `IntegrationKit` resources
+                              are created, with the native kit having precedence over
+                              the `fast-jar` one once ready. The order influences
+                              the resolution of the current kit for the integration.
+                              The kit corresponding to the first package type will
+                              be assigned to the integration in case no existing kit
+                              that matches the integration exists. Deprecated: use
+                              `mode` instead.'
                             items:
-                              description: QuarkusPackageType is the type of Quarkus
-                                build packaging.
+                              description: 'QuarkusPackageType is the type of Quarkus
+                                build packaging. Deprecated: use `QuarkusMode` instead.'
                               enum:
                               - fast-jar
                               - native-sources
diff --git a/helm/camel-k/crds/crd-pipe.yaml b/helm/camel-k/crds/crd-pipe.yaml
index 23a287c66..a8a40da19 100644
--- a/helm/camel-k/crds/crd-pipe.yaml
+++ b/helm/camel-k/crds/crd-pipe.yaml
@@ -7825,20 +7825,34 @@ spec:
                             description: Can be used to enable or disable a trait.
                               All traits share this common property.
                             type: boolean
-                          packageTypes:
-                            description: The Quarkus package types, `fast-jar`, `native-sources`
-                              or `native` (default `fast-jar`). `native` is deprecated.
-                              In case both `fast-jar` and `native` or `native-sources`
+                          mode:
+                            description: 'The Quarkus mode to run: either `jvm` or
+                              `native` (default `jvm`). In case both `jvm` and `native`
                               are specified, two `IntegrationKit` resources are created,
-                              with the native kit having precedence over the `fast-jar`
-                              one once ready. The order influences the resolution
-                              of the current kit for the integration. The kit corresponding
-                              to the first package type will be assigned to the integration
-                              in case no existing kit that matches the integration
-                              exists.
+                              with the `native` kit having precedence over the `jvm`
+                              one once ready.'
+                            items:
+                              description: QuarkusMode is the type of Quarkus build
+                                packaging.
+                              enum:
+                              - jvm
+                              - native
+                              type: string
+                            type: array
+                          packageTypes:
+                            description: 'The Quarkus package types, `fast-jar` or
+                              `native` (default `fast-jar`). In case both `fast-jar`
+                              and `native` are specified, two `IntegrationKit` resources
+                              are created, with the native kit having precedence over
+                              the `fast-jar` one once ready. The order influences
+                              the resolution of the current kit for the integration.
+                              The kit corresponding to the first package type will
+                              be assigned to the integration in case no existing kit
+                              that matches the integration exists. Deprecated: use
+                              `mode` instead.'
                             items:
-                              description: QuarkusPackageType is the type of Quarkus
-                                build packaging.
+                              description: 'QuarkusPackageType is the type of Quarkus
+                                build packaging. Deprecated: use `QuarkusMode` instead.'
                               enum:
                               - fast-jar
                               - native-sources
diff --git a/pkg/apis/camel/v1/integrationkit_types.go b/pkg/apis/camel/v1/integrationkit_types.go
index 561217f31..f5b7ad1d5 100644
--- a/pkg/apis/camel/v1/integrationkit_types.go
+++ b/pkg/apis/camel/v1/integrationkit_types.go
@@ -83,7 +83,7 @@ type IntegrationKitTraits struct {
 	Camel *trait.CamelTrait `property:"camel" json:"camel,omitempty"`
 	// The Quarkus trait configures the Quarkus runtime.
 	// It's enabled by default.
-	// NOTE: Compiling to a native executable, i.e. when using `package-type=native`, is only supported for kamelets, as well as YAML and XML integrations. It also requires at least 4GiB of memory, so the Pod running the native build, that is either the operator Pod, or the build Pod (depending on the build strategy configured for the platform), must have enough memory available.
+	// NOTE: Compiling to a native executable, requires at least 4GiB of memory, so the Pod running the native build must have enough memory available.
 	Quarkus *trait.QuarkusTrait `property:"quarkus" json:"quarkus,omitempty"`
 	// The Registry trait sets up Maven to use the Image registry as a Maven repository.
 	Registry *trait.RegistryTrait `property:"registry" json:"registry,omitempty"`
@@ -155,6 +155,8 @@ const (
 	IntegrationKitLayoutFastJar = "fast-jar"
 	// IntegrationKitLayoutNative labels a kit using the Quarkus native packaging.
 	IntegrationKitLayoutNative = "native"
+	// IntegrationKitLayoutNativeSources labels a kit using the Quarkus native-sources packaging.
+	IntegrationKitLayoutNativeSources = "native-sources"
 
 	// IntegrationKitPriorityLabel labels the kit priority.
 	IntegrationKitPriorityLabel = "camel.apache.org/kit.priority"
diff --git a/pkg/apis/camel/v1/integrationplatform_types.go b/pkg/apis/camel/v1/integrationplatform_types.go
index 93c987338..9eeaff083 100644
--- a/pkg/apis/camel/v1/integrationplatform_types.go
+++ b/pkg/apis/camel/v1/integrationplatform_types.go
@@ -125,6 +125,7 @@ type IntegrationPlatformBuildSpec struct {
 	// the image registry used to push/pull Integration images
 	Registry RegistrySpec `json:"registry,omitempty"`
 	// the timeout (in seconds) to use when creating the build tools container image
+	// Deprecated: no longer in use
 	BuildCatalogToolTimeout *metav1.Duration `json:"buildCatalogToolTimeout,omitempty"`
 	// how much time to wait before time out the pipeline process
 	Timeout *metav1.Duration `json:"timeout,omitempty"`
diff --git a/pkg/apis/camel/v1/integrationplatform_types_support.go b/pkg/apis/camel/v1/integrationplatform_types_support.go
index c421bbfbb..fb216a8cd 100644
--- a/pkg/apis/camel/v1/integrationplatform_types_support.go
+++ b/pkg/apis/camel/v1/integrationplatform_types_support.go
@@ -204,14 +204,6 @@ func (b IntegrationPlatformBuildSpec) GetTimeout() metav1.Duration {
 	return *b.Timeout
 }
 
-// GetBuildCatalogToolTimeout returns the specified duration or a default one.
-func (b IntegrationPlatformBuildSpec) GetBuildCatalogToolTimeout() metav1.Duration {
-	if b.BuildCatalogToolTimeout == nil {
-		return metav1.Duration{}
-	}
-	return *b.BuildCatalogToolTimeout
-}
-
 var _ ResourceCondition = IntegrationPlatformCondition{}
 
 // GetConditions --.
diff --git a/pkg/apis/camel/v1/trait/quarkus.go b/pkg/apis/camel/v1/trait/quarkus.go
index 2d5548c1a..538f4e9df 100644
--- a/pkg/apis/camel/v1/trait/quarkus.go
+++ b/pkg/apis/camel/v1/trait/quarkus.go
@@ -28,16 +28,33 @@ package trait
 // +camel-k:trait=quarkus.
 type QuarkusTrait struct {
 	Trait `property:",squash" json:",inline"`
-	// The Quarkus package types, `fast-jar`, `native-sources` or `native` (default `fast-jar`). `native` is deprecated.
-	// In case both `fast-jar` and `native` or `native-sources` are specified, two `IntegrationKit` resources are created,
+	// The Quarkus package types, `fast-jar` or `native` (default `fast-jar`).
+	// In case both `fast-jar` and `native` are specified, two `IntegrationKit` resources are created,
 	// with the native kit having precedence over the `fast-jar` one once ready.
 	// The order influences the resolution of the current kit for the integration.
 	// The kit corresponding to the first package type will be assigned to the
 	// integration in case no existing kit that matches the integration exists.
+	// Deprecated: use `mode` instead.
 	PackageTypes []QuarkusPackageType `property:"package-type" json:"packageTypes,omitempty"`
+	// The Quarkus mode to run: either `jvm` or `native` (default `jvm`).
+	// In case both `jvm` and `native` are specified, two `IntegrationKit` resources are created,
+	// with the `native` kit having precedence over the `jvm` one once ready.
+	Modes []QuarkusMode `property:"mode" json:"mode,omitempty"`
 }
 
+// QuarkusMode is the type of Quarkus build packaging.
+// +kubebuilder:validation:Enum=jvm;native
+type QuarkusMode string
+
+const (
+	// JvmQuarkusMode represents "JVM mode" Quarkus execution.
+	JvmQuarkusMode QuarkusMode = "jvm"
+	// NativeQuarkusMode represents "Native mode" Quarkus execution.
+	NativeQuarkusMode QuarkusMode = "native"
+)
+
 // QuarkusPackageType is the type of Quarkus build packaging.
+// Deprecated: use `QuarkusMode` instead.
 // +kubebuilder:validation:Enum=fast-jar;native-sources;native
 type QuarkusPackageType string
 
@@ -45,8 +62,5 @@ const (
 	// FastJarPackageType represents "fast jar" Quarkus packaging.
 	FastJarPackageType QuarkusPackageType = "fast-jar"
 	// NativePackageType represents "native" Quarkus packaging.
-	// Deprecated: use native-sources instead.
 	NativePackageType QuarkusPackageType = "native"
-	// NativeSourcesPackageType represents "native-sources" Quarkus packaging.
-	NativeSourcesPackageType QuarkusPackageType = "native-sources"
 )
diff --git a/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go b/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go
index 471156af8..10c0db3b9 100644
--- a/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go
+++ b/pkg/apis/camel/v1/trait/zz_generated.deepcopy.go
@@ -905,6 +905,11 @@ func (in *QuarkusTrait) DeepCopyInto(out *QuarkusTrait) {
 		*out = make([]QuarkusPackageType, len(*in))
 		copy(*out, *in)
 	}
+	if in.Modes != nil {
+		in, out := &in.Modes, &out.Modes
+		*out = make([]QuarkusMode, len(*in))
+		copy(*out, *in)
+	}
 }
 
 // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QuarkusTrait.
diff --git a/pkg/builder/image.go b/pkg/builder/image.go
index 1ea9a4983..cedf72a82 100644
--- a/pkg/builder/image.go
+++ b/pkg/builder/image.go
@@ -181,7 +181,7 @@ func imageContext(ctx *builderContext, selector artifactsSelector) error {
 
 func listPublishedImages(context *builderContext) ([]v1.IntegrationKitStatus, error) {
 	excludeNativeImages, err := labels.NewRequirement(v1.IntegrationKitLayoutLabel, selection.NotEquals, []string{
-		v1.IntegrationKitLayoutNative,
+		v1.IntegrationKitLayoutNativeSources,
 	})
 	if err != nil {
 		return nil, err
diff --git a/pkg/controller/build/build_monitor.go b/pkg/controller/build/build_monitor.go
index 44c1fcff5..2d45b2223 100644
--- a/pkg/controller/build/build_monitor.go
+++ b/pkg/controller/build/build_monitor.go
@@ -64,7 +64,7 @@ func (bm *Monitor) canSchedule(ctx context.Context, c ctrl.Reader, build *v1.Bui
 	layout := build.Labels[v1.IntegrationKitLayoutLabel]
 
 	// Native builds can be run in parallel, as incremental images is not applicable.
-	if layout == v1.IntegrationKitLayoutNative {
+	if layout == v1.IntegrationKitLayoutNativeSources {
 		return true, nil
 	}
 
diff --git a/pkg/controller/build/build_monitor_test.go b/pkg/controller/build/build_monitor_test.go
index 7a0dbec57..9f1c051b9 100644
--- a/pkg/controller/build/build_monitor_test.go
+++ b/pkg/controller/build/build_monitor_test.go
@@ -577,7 +577,7 @@ func newBuild(namespace string, name string, dependencies ...string) *v1.Build {
 }
 
 func newNativeBuild(namespace string, name string, dependencies ...string) *v1.Build {
-	return newBuildWithLayoutInPhase(namespace, name, v1.IntegrationKitLayoutNative, v1.BuildPhasePending, dependencies...)
+	return newBuildWithLayoutInPhase(namespace, name, v1.IntegrationKitLayoutNativeSources, v1.BuildPhasePending, dependencies...)
 }
 
 func newBuildInPhase(namespace string, name string, phase v1.BuildPhase, dependencies ...string) *v1.Build {
@@ -585,7 +585,7 @@ func newBuildInPhase(namespace string, name string, phase v1.BuildPhase, depende
 }
 
 func newNativeBuildInPhase(namespace string, name string, phase v1.BuildPhase, dependencies ...string) *v1.Build {
-	return newBuildWithLayoutInPhase(namespace, name, v1.IntegrationKitLayoutNative, phase, dependencies...)
+	return newBuildWithLayoutInPhase(namespace, name, v1.IntegrationKitLayoutNativeSources, phase, dependencies...)
 }
 
 func newBuildWithLayoutInPhase(namespace string, name string, layout string, phase v1.BuildPhase, dependencies ...string) *v1.Build {
diff --git a/pkg/controller/integrationkit/build.go b/pkg/controller/integrationkit/build.go
index a60ccc6c7..202b10bdf 100644
--- a/pkg/controller/integrationkit/build.go
+++ b/pkg/controller/integrationkit/build.go
@@ -100,7 +100,7 @@ func (action *buildAction) handleBuildSubmitted(ctx context.Context, kit *v1.Int
 		}
 
 		timeout := env.Platform.Status.Build.GetTimeout()
-		if layout := labels[v1.IntegrationKitLayoutLabel]; env.Platform.Spec.Build.Timeout == nil && layout == v1.IntegrationKitLayoutNative {
+		if layout := labels[v1.IntegrationKitLayoutLabel]; env.Platform.Spec.Build.Timeout == nil && layout == v1.IntegrationKitLayoutNativeSources {
 			// Increase the timeout to a sensible default
 			timeout = metav1.Duration{
 				Duration: 10 * time.Minute,
diff --git a/pkg/platform/defaults.go b/pkg/platform/defaults.go
index fe732420b..1a659b181 100644
--- a/pkg/platform/defaults.go
+++ b/pkg/platform/defaults.go
@@ -307,12 +307,6 @@ func applyPlatformSpec(source *v1.IntegrationPlatform, target *v1.IntegrationPla
 		target.Status.Build.Timeout = source.Status.Build.Timeout
 	}
 
-	// Catalog tools build timeout
-	if target.Status.Build.BuildCatalogToolTimeout == nil {
-		log.Debugf("Integration Platform %s [%s]: setting build camel catalog tool timeout", target.Name, target.Namespace)
-		target.Status.Build.BuildCatalogToolTimeout = source.Status.Build.BuildCatalogToolTimeout
-	}
-
 	if target.Status.Build.MaxRunningBuilds <= 0 {
 		log.Debugf("Integration Platform %s [%s]: setting max running builds", target.Name, target.Namespace)
 		target.Status.Build.MaxRunningBuilds = source.Status.Build.MaxRunningBuilds
@@ -376,25 +370,6 @@ func setPlatformDefaults(p *v1.IntegrationPlatform, verbose bool) error {
 		}
 	}
 
-	// Catalog tools build timeout
-	if p.Status.Build.GetBuildCatalogToolTimeout().Duration == 0 {
-		log.Debugf("Integration Platform %s [%s]: setting default build camel catalog tool timeout (2 minutes)", p.Name, p.Namespace)
-		p.Status.Build.BuildCatalogToolTimeout = &metav1.Duration{
-			Duration: 2 * time.Minute,
-		}
-	} else {
-		d := p.Status.Build.GetBuildCatalogToolTimeout().Duration.Truncate(time.Second)
-
-		if verbose && p.Status.Build.GetBuildCatalogToolTimeout().Duration != d {
-			log.Log.Infof("Build catalog tools timeout minimum unit is sec (configured: %s, truncated: %s)", p.Status.Build.GetBuildCatalogToolTimeout().Duration, d)
-		}
-
-		log.Debugf("Integration Platform %s [%s]: setting build catalog tools timeout", p.Name, p.Namespace)
-		p.Status.Build.BuildCatalogToolTimeout = &metav1.Duration{
-			Duration: d,
-		}
-	}
-
 	if p.Status.Build.MaxRunningBuilds <= 0 {
 		log.Debugf("Integration Platform %s [%s]: setting max running builds", p.Name, p.Namespace)
 		if p.Status.Build.BuildConfiguration.Strategy == v1.BuildStrategyRoutine {
diff --git a/pkg/resources/resources.go b/pkg/resources/resources.go
index 23f91a87f..f40cb53f1 100644
--- a/pkg/resources/resources.go
+++ b/pkg/resources/resources.go
@@ -117,9 +117,9 @@ var assets = func() http.FileSystem {
 		"/crd/bases/camel.apache.org_builds.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_builds.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 91926,
+			uncompressedSize: 49805,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\x1b\x37\x96\xe8\x77\xfd\x8a\x53\xf1\x07\xcb\x55\x22\x35\xe3\xc9\xce\x66\x75\x6b\xeb\x96\x56\x4e\x66\x35\x4e\x6c\xaf\x29\x7b\x32\xb5\xb5\x55\x02\xbb\x0f\x49\x84\xdd\x40\x5f\x00\x2d\x9a\xb9\x75\xff\xfb\x2d\xbc\xfa\x21\xb2\xbb\x01\x8a\xf4\xa3\xd2\xf8\x92\x58\x44\x03\xe7\xe0\x71\xde\x38\xe7\x19\x4c\x8e\xd7\xce\x9e\xc1\xcf\x34\x41\x26\x31\x05\xc5\x41\xad\x10\xae\x0b\x92\xac\x10\x66\x7c\xa1\x36\x44\x20\xfc\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\x1b\x37\x96\xe8\x77\xfd\x8a\x53\xf1\x87\xc8\x55\x22\x95\x38\x33\x73\x73\x75\xeb\xd6\x96\x46\x4e\x32\x1a\xc7\x96\xd7\x94\x3d\x33\xb5\xb5\x55\x02\xbb\x0f\x49\x84\xdd\x40\x2f\x80\x16\xcd\xd9\xda\xff\xbe\x85\x57\x3f\xc8\x7e\x00\x14\x15\x67\x2a\xc4\x17\x5b\x6c\x3c\xce\x39\x38\x38\x2f\x1c\x00\x2f\x60\x72\xbc\x72\xf6\x02\x7e\xa6\x09\x32\x89\x29\x28\x0e\x6a\x85\x70\x5d\x90\x64\x85\x30\xe3\x0b\xb5\x21\x02\xe1\x [...]
 		},
 		"/crd/bases/camel.apache.org_camelcatalogs.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_camelcatalogs.yaml",
@@ -131,30 +131,30 @@ var assets = func() http.FileSystem {
 		"/crd/bases/camel.apache.org_integrationkits.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_integrationkits.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 23390,
+			uncompressedSize: 21596,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3c\x5d\x73\xdb\x38\x92\xef\xfa\x15\x5d\xf1\x43\xec\x2a\x49\xde\xb9\x9b\x9a\xba\xf2\xce\x4e\x95\xd7\x49\x66\x5d\x71\x12\x9f\xa5\xcc\xdc\xd4\xce\x56\x09\x22\x5b\x12\x46\x24\xc0\x05\x40\xc9\xba\x8f\xff\x7e\x85\x06\xc0\x0f\x89\xa4\x68\x39\xde\x9b\xbd\x8a\x5e\x12\x93\x40\xa3\xd1\xdf\xdd\x40\xf3\x0c\x46\x5f\xee\x37\x38\x83\x3b\x1e\xa1\xd0\x18\x83\x91\x60\x56\x08\xd7\x19\x8b\x56\x08\x13\xb9\x30\x5b\xa6\x10\xde\xc9\x5c\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3c\x5d\x73\xe3\x36\x92\xef\xfa\x15\x5d\xe3\x87\xb1\xab\x24\x79\x73\x97\x4a\x5d\x79\xb3\xa9\xf2\x3a\x93\xac\x6b\x3c\x33\xbe\x91\x27\xb9\xd4\x66\xab\xdc\x22\x5b\x12\x22\x12\x60\x00\x50\xb2\xee\xe3\xbf\x5f\xa1\x01\x50\x94\x44\x52\x1c\x39\xbe\xbd\x87\xe1\xcb\x8c\x49\xa0\xd1\x1f\xe8\x4f\x34\x74\x06\xa3\x3f\xee\x19\x9c\xc1\x9d\x48\x48\x1a\x4a\xc1\x2a\xb0\x0b\x82\xeb\x02\x93\x05\xc1\x44\xcd\xec\x1a\x35\xc1\x0f\xaa\x94\x [...]
 		},
 		"/crd/bases/camel.apache.org_integrationplatforms.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_integrationplatforms.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 195800,
+			uncompressedSize: 192212,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\xfb\x72\xe3\x36\xb2\x38\xfc\x7f\x9e\x02\xe5\xd4\xa9\xf1\x4c\x59\xd2\xcc\xee\xc9\x6e\x8e\xcf\x66\xbf\x9f\xe3\x99\x24\xce\x5c\xec\x63\x7b\x66\x77\x2b\x49\x45\x10\xd9\x92\x10\x93\x00\x17\x00\x65\x2b\xb5\x0f\xff\x15\x1a\x00\x49\x49\x24\x48\x5d\x7c\x49\x22\x4e\x55\x62\x49\x24\xd8\x68\x34\xfa\x86\xbe\x7c\x4e\x7a\xbb\xbb\x3e\xfb\x9c\xbc\x63\x11\x70\x05\x31\xd1\x82\xe8\x29\x90\x93\x8c\x46\x53\x20\x57\x62\xac\x6f\xa9\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7d\x73\xdb\x36\xb6\x38\xfc\x7f\x3f\x05\xc6\x9d\x3b\x71\x32\x96\x94\xec\xde\xee\xf6\xfa\xde\xde\xe7\xe7\x3a\x69\xeb\x26\x8e\x7d\x6d\x27\xbb\x3b\x6d\xa7\x82\xc8\x23\x09\x35\x09\x70\x01\x50\xb6\x3a\xfb\xe1\x9f\xc1\x01\x40\x52\x12\x09\x52\x2f\xb6\xb3\x8d\x98\x99\xd6\x92\x48\xf0\x1c\xe0\xe0\xbc\xe1\xbc\x7c\x49\x7a\xbb\xbb\xbe\xf8\x92\xbc\x63\x11\x70\x05\x31\xd1\x82\xe8\x29\x90\x93\x8c\x46\x53\x20\xd7\x62\xac\xef\x [...]
 		},
 		"/crd/bases/camel.apache.org_integrations.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_integrations.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 516345,
+			uncompressedSize: 514551,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\x1b\x37\x96\x30\x8c\xff\x9f\x4f\x81\x72\x52\x8f\xa4\x8d\x48\xd9\x99\xd9\xa9\x1d\xff\xa6\x9e\x94\x56\x92\x13\xfd\x62\xcb\x2a\x49\x49\x9e\x94\x93\x4d\xc0\x6e\x90\xc4\xa3\x6e\xa0\x17\x40\x53\xe2\xbc\x79\xbf\xfb\x5b\x38\x00\xfa\xc2\x5b\x1f\xb4\x44\xc7\x99\x6d\x4c\x55\xc6\x14\xd9\xa7\x71\x39\x38\xf7\xcb\xe7\x64\xf4\x7c\xe3\xb3\xcf\xc9\x5b\x9e\x30\xa1\x59\x4a\x8c\x24\x66\xce\xc8\x69\x41\x93\x39\x23\xb7\x72\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\x1b\x37\x96\x30\x8c\xff\x9f\x4f\x81\x72\x52\x8f\xa4\x8d\x48\xd9\x99\xd9\xa9\x1d\xff\xa6\x9e\x94\x56\x92\x13\xfd\x62\xcb\x2a\x49\x49\x9e\x94\x93\x4d\xc0\x6e\x90\xc4\xa3\x6e\xa0\x17\x40\x53\xe2\xbc\x79\xbf\xfb\x5b\x38\x00\xfa\xc2\x5b\x1f\xb4\x44\xc7\x99\x6d\x4c\x55\xc6\x14\xd9\xa7\x71\x39\x38\xf7\xcb\xe7\x64\xf4\x7c\xe3\xb3\xcf\xc9\x5b\x9e\x30\xa1\x59\x4a\x8c\x24\x66\xce\xc8\x69\x41\x93\x39\x23\xb7\x72\x [...]
 		},
 		"/crd/bases/camel.apache.org_kameletbindings.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_kameletbindings.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 597743,
+			uncompressedSize: 595799,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x6b\x73\x1b\x37\xb6\x30\x0a\x7f\xf7\xaf\x40\xc9\xa9\x47\xd2\x8e\x48\xd9\x99\x99\xd4\x8c\xdf\xa9\x9d\xd2\xc8\x72\xa2\x37\xb6\xcc\xb2\x94\xe4\x49\x39\xd9\x09\xd8\x0d\x92\xd8\xea\x06\x7a\x00\x34\x25\xe6\xf8\xfc\xf7\x53\x58\x00\xfa\xc2\x9b\xb0\x9a\x92\x46\x9e\x69\x4c\x55\xc6\xa4\xd8\xab\x71\x59\x58\xf7\xcb\x73\x32\xb8\xbf\xf1\xec\x39\x79\xcb\x13\x26\x34\x4b\x89\x91\xc4\xcc\x18\x39\x29\x68\x32\x63\xe4\x52\x4e\xcc\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x6b\x73\x1b\x37\xb6\x30\x0a\x7f\xf7\xaf\x40\xc9\xa9\x47\xd2\x8e\x48\xd9\x99\x99\xd4\x8c\xdf\xa9\x9d\xd2\xc8\x72\xa2\x37\xb6\xcc\xb2\x94\xe4\x49\x39\xd9\x09\xd8\x0d\x92\xd8\xea\x06\x7a\x00\x34\x25\xe6\xf8\xfc\xf7\x53\x58\x00\xfa\xc2\x9b\xb0\x9a\x92\x46\x9e\x69\x4c\x55\xc6\xa4\xd8\xab\x71\x59\x58\xf7\xcb\x73\x32\xb8\xbf\xf1\xec\x39\x79\xcb\x13\x26\x34\x4b\x89\x91\xc4\xcc\x18\x39\x29\x68\x32\x63\xe4\x52\x4e\xcc\x [...]
 		},
 		"/crd/bases/camel.apache.org_kamelets.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_kamelets.yaml",
@@ -166,26 +166,14 @@ var assets = func() http.FileSystem {
 		"/crd/bases/camel.apache.org_pipes.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "camel.apache.org_pipes.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 565005,
+			uncompressedSize: 563061,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\x1b\x37\xb6\x28\x8a\xff\x9f\x4f\x81\xb2\x53\x47\xd2\x0e\x49\xd9\x99\x99\xd4\x1e\xff\xa6\x4e\x4a\x5b\x96\x13\xfd\x62\xcb\x2c\x4b\x49\x4e\xca\xc9\x4e\xc0\x6e\x90\xc4\x51\x37\xd0\x1b\x40\x53\x62\xae\xef\x77\xbf\x85\x05\xa0\x1f\x7c\x09\xab\x29\x69\xe4\x99\xc6\x54\x65\x4c\x8a\xbd\x1a\x8f\x85\xf5\x7e\x3c\x27\xc3\xfb\x1b\x5f\x3c\x27\x6f\x79\xc2\x84\x66\x29\x31\x92\x98\x39\x23\x27\x05\x4d\xe6\x8c\x5c\xca\xa9\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\x1b\x37\xb6\x28\x8a\xff\x9f\x4f\x81\xb2\x53\x47\xd2\x0e\x49\xd9\x99\x99\xd4\x1e\xff\xa6\x4e\x4a\x5b\x96\x13\xfd\x62\xcb\x2c\x4b\x49\x4e\xca\xc9\x4e\xc0\x6e\x90\xc4\x51\x37\xd0\x1b\x40\x53\x62\xae\xef\x77\xbf\x85\x05\xa0\x1f\x7c\x09\xab\x29\x69\xe4\x99\xc6\x54\x65\x4c\x8a\xbd\x1a\x8f\x85\xf5\x7e\x3c\x27\xc3\xfb\x1b\x5f\x3c\x27\x6f\x79\xc2\x84\x66\x29\x31\x92\x98\x39\x23\x27\x05\x4d\xe6\x8c\x5c\xca\xa9\x [...]
 		},
 		"/manager": &vfsgen۰DirInfo{
 			name:    "manager",
 			modTime: time.Time{},
 		},
-		"/manager/bundle": &vfsgen۰DirInfo{
-			name:    "bundle",
-			modTime: time.Time{},
-		},
-		"/manager/bundle/manifests": &vfsgen۰DirInfo{
-			name:    "manifests",
-			modTime: time.Time{},
-		},
-		"/manager/bundle/metadata": &vfsgen۰DirInfo{
-			name:    "metadata",
-			modTime: time.Time{},
-		},
 		"/manager/operator-deployment.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "operator-deployment.yaml",
 			modTime:          time.Time{},
@@ -637,9 +625,9 @@ var assets = func() http.FileSystem {
 		"/traits.yaml": &vfsgen۰CompressedFileInfo{
 			name:             "traits.yaml",
 			modTime:          time.Time{},
-			uncompressedSize: 69520,
+			uncompressedSize: 68516,
 
-			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xfd\x77\x1b\xb9\x91\xe0\xef\xfe\x2b\xf0\xb4\xb7\x4f\x92\x8f\x1f\xf2\x64\x93\x9d\xd5\xc6\xd9\xd3\x78\x3c\x89\x32\xfe\xd0\x59\x9a\xc9\xe6\xf9\xfc\x42\xb0\x1b\x24\x61\x36\x81\x0e\x80\x96\xcc\xb9\xdc\xff\x7e\x0f\x55\x85\x8f\x6e\x36\x45\xca\x96\x66\xa3\xcd\x24\xef\x8d\x45\xb2\xbb\x50\x28\x14\x0a\x85\xfa\x74\x86\x4b\x67\x4f\x9f\x0c\x99\xe2\x2b\x71\xca\x7e\x65\x0b\x5e\x89\x27\x8c\xd5\x15\x77\x33\x6d\x56\xa7\x6c\xc6\x [...]
+			compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xfd\x77\x1b\xb9\x91\xe0\xef\xfe\x2b\xf0\xb4\xb7\x4f\x92\x8f\x1f\xf2\x64\x93\x9d\xd5\xc6\xd9\xd3\x78\x3c\x89\x32\xfe\xd0\x59\x9a\xc9\xe6\xf9\xfc\x42\xb0\x1b\x24\x61\x36\x81\x0e\x80\x96\xcc\xb9\xdc\xff\x7e\x0f\x55\x85\x8f\x6e\x36\x45\xca\x96\x66\xa3\xcd\x24\xef\x8d\x45\xb2\xbb\x50\x28\x14\x0a\x85\xfa\x74\x86\x4b\x67\x4f\x9f\x0c\x99\xe2\x2b\x71\xca\x7e\x65\x0b\x5e\x89\x27\x8c\xd5\x15\x77\x33\x6d\x56\xa7\x6c\xc6\x [...]
 		},
 	}
 	fs["/"].(*vfsgen۰DirInfo).entries = []os.FileInfo{
@@ -684,7 +672,6 @@ var assets = func() http.FileSystem {
 		fs["/crd/bases/camel.apache.org_pipes.yaml"].(os.FileInfo),
 	}
 	fs["/manager"].(*vfsgen۰DirInfo).entries = []os.FileInfo{
-		fs["/manager/bundle"].(os.FileInfo),
 		fs["/manager/operator-deployment.yaml"].(os.FileInfo),
 		fs["/manager/operator-service-account.yaml"].(os.FileInfo),
 		fs["/manager/patch-image-pull-policy-always.yaml"].(os.FileInfo),
@@ -696,10 +683,6 @@ var assets = func() http.FileSystem {
 		fs["/manager/patch-toleration.yaml"].(os.FileInfo),
 		fs["/manager/patch-watch-namespace-global.yaml"].(os.FileInfo),
 	}
-	fs["/manager/bundle"].(*vfsgen۰DirInfo).entries = []os.FileInfo{
-		fs["/manager/bundle/manifests"].(os.FileInfo),
-		fs["/manager/bundle/metadata"].(os.FileInfo),
-	}
 	fs["/prometheus"].(*vfsgen۰DirInfo).entries = []os.FileInfo{
 		fs["/prometheus/operator-pod-monitor.yaml"].(os.FileInfo),
 		fs["/prometheus/operator-prometheus-rule.yaml"].(os.FileInfo),
diff --git a/pkg/trait/builder.go b/pkg/trait/builder.go
index e11bd7339..c7cd7c7a7 100644
--- a/pkg/trait/builder.go
+++ b/pkg/trait/builder.go
@@ -68,6 +68,8 @@ func (t *builderTrait) Configure(e *Environment) (bool, error) {
 		return false, nil
 	}
 
+	t.adaptDeprecatedFields()
+
 	if e.IntegrationKitInPhase(v1.IntegrationKitPhaseBuildSubmitted) {
 		if trait := e.Catalog.GetTrait(quarkusTraitID); trait != nil {
 			quarkus, ok := trait.(*quarkusTrait)
@@ -77,17 +79,16 @@ func (t *builderTrait) Configure(e *Environment) (bool, error) {
 				return false, err
 			}
 			if ok && pointer.BoolDeref(quarkus.Enabled, true) && (isNativeIntegration || isNativeKit) {
+				nativeArgsCd := filepath.Join("maven", "target", "native-sources")
+				command := "cd " + nativeArgsCd + " && echo NativeImage version is $(native-image --version) && echo GraalVM expected version is $(cat graalvm.version) && echo WARN: Make sure they are compatible, otherwise the native compilation may results in error && native-image $(cat native-image.args)"
+				// it should be performed as the last custom task
+				t.Tasks = append(t.Tasks, fmt.Sprintf(`quarkus-native;%s;/bin/bash -c "%s"`, e.CamelCatalog.GetQuarkusToolingImage(), command))
 				// Force the build to run in a separate Pod and strictly sequential
 				t.L.Info("This is a Quarkus native build: setting build configuration with build Pod strategy, and native container with 1 CPU core and 4 GiB memory. Make sure your cluster can handle it.")
 				t.Strategy = string(v1.BuildStrategyPod)
 				t.OrderStrategy = string(v1.BuildOrderStrategySequential)
 				t.TasksRequestCPU = append(t.TasksRequestCPU, "quarkus-native:1000m")
 				t.TasksRequestMemory = append(t.TasksRequestMemory, "quarkus-native:4Gi")
-
-				nativeArgsCd := filepath.Join("maven", "target", "native-sources")
-				command := "cd " + nativeArgsCd + " && echo NativeImage version is $(native-image --version) && echo GraalVM expected version is $(cat graalvm.version) && echo WARN: Make sure they are compatible, otherwise the native compilation may results in error && native-image $(cat native-image.args)"
-				// it should be performed as the last custom task
-				t.Tasks = append(t.Tasks, fmt.Sprintf(`quarkus-native;%s;/bin/bash -c "%s"`, e.CamelCatalog.GetQuarkusToolingImage(), command))
 			}
 		}
 
@@ -97,6 +98,25 @@ func (t *builderTrait) Configure(e *Environment) (bool, error) {
 	return false, nil
 }
 
+func (t *builderTrait) adaptDeprecatedFields() {
+	if t.RequestCPU != "" {
+		t.L.Info("The request-cpu parameter is deprecated and may be removed in future releases. Make sure to use tasks-request-cpu parameter instead.")
+		t.TasksRequestCPU = append(t.TasksRequestCPU, fmt.Sprintf("builder:%s", t.RequestCPU))
+	}
+	if t.LimitCPU != "" {
+		t.L.Info("The limit-cpu parameter is deprecated and may be removed in future releases. Make sure to use tasks-limit-cpu parameter instead.")
+		t.TasksLimitCPU = append(t.TasksLimitCPU, fmt.Sprintf("builder:%s", t.LimitCPU))
+	}
+	if t.RequestMemory != "" {
+		t.L.Info("The request-memory parameter is deprecated and may be removed in future releases. Make sure to use tasks-request-memory parameter instead.")
+		t.TasksRequestMemory = append(t.TasksRequestMemory, fmt.Sprintf("builder:%s", t.RequestMemory))
+	}
+	if t.LimitMemory != "" {
+		t.L.Info("The limit-memory parameter is deprecated and may be removed in future releases. Make sure to use tasks-limit-memory parameter instead.")
+		t.TasksLimitMemory = append(t.TasksLimitMemory, fmt.Sprintf("builder:%s", t.LimitMemory))
+	}
+}
+
 func (t *builderTrait) Apply(e *Environment) error {
 	// local pipeline tasks
 	var pipelineTasks []v1.Task
diff --git a/pkg/trait/builder_test.go b/pkg/trait/builder_test.go
index 79f47bd86..0c060177b 100644
--- a/pkg/trait/builder_test.go
+++ b/pkg/trait/builder_test.go
@@ -360,10 +360,10 @@ func TestBuilderCustomTasksScript(t *testing.T) {
 
 func TestBuilderCustomTasksConfiguration(t *testing.T) {
 	builderTrait := createNominalBuilderTraitTest()
-	builderTrait.TasksRequestCPU = append(builderTrait.TasksLimitCPU, "builder:1000m")
+	builderTrait.TasksRequestCPU = append(builderTrait.TasksRequestCPU, "builder:1000m")
 	builderTrait.TasksLimitCPU = append(builderTrait.TasksLimitCPU, "custom1:500m")
-	builderTrait.TasksRequestMemory = append(builderTrait.TasksLimitCPU, "package:8Gi")
-	builderTrait.TasksLimitMemory = append(builderTrait.TasksLimitCPU, "spectrum:4Gi")
+	builderTrait.TasksRequestMemory = append(builderTrait.TasksRequestMemory, "package:8Gi")
+	builderTrait.TasksLimitMemory = append(builderTrait.TasksLimitMemory, "spectrum:4Gi")
 
 	tasksConf, err := builderTrait.parseTasksConf()
 
@@ -411,3 +411,25 @@ func TestUserTaskMultiCommands(t *testing.T) {
 	assert.Equal(t, "cat /path/to/a/resource", podCommands[0])
 	assert.Equal(t, "echo ciao", podCommands[1])
 }
+
+func TestBuilderDeprecatedParams(t *testing.T) {
+	env := createBuilderTestEnv(v1.IntegrationPlatformClusterKubernetes, v1.IntegrationPlatformBuildPublishStrategyJib, v1.BuildStrategyRoutine)
+	builderTrait := createNominalBuilderTraitTest()
+	builderTrait.LimitCPU = "100m"
+	builderTrait.RequestCPU = "100m"
+	builderTrait.LimitMemory = "100Mi"
+	builderTrait.RequestMemory = "100Mi"
+
+	active, err := builderTrait.Configure(env)
+
+	assert.Nil(t, err)
+	assert.True(t, active)
+	assert.Len(t, builderTrait.TasksLimitCPU, 1)
+	assert.Len(t, builderTrait.TasksRequestCPU, 1)
+	assert.Len(t, builderTrait.TasksLimitMemory, 1)
+	assert.Len(t, builderTrait.TasksRequestMemory, 1)
+	assert.Equal(t, "builder:100m", builderTrait.TasksLimitCPU[0])
+	assert.Equal(t, "builder:100m", builderTrait.TasksRequestCPU[0])
+	assert.Equal(t, "builder:100Mi", builderTrait.TasksLimitMemory[0])
+	assert.Equal(t, "builder:100Mi", builderTrait.TasksRequestMemory[0])
+}
diff --git a/pkg/trait/camel_test.go b/pkg/trait/camel_test.go
index 5d035ad78..1cde2b90a 100644
--- a/pkg/trait/camel_test.go
+++ b/pkg/trait/camel_test.go
@@ -154,7 +154,7 @@ func createNominalCamelTest(withSources bool) (*camelTrait, *Environment) {
 		IntegrationKit: &v1.IntegrationKit{
 			ObjectMeta: metav1.ObjectMeta{
 				Labels: map[string]string{
-					v1.IntegrationKitLayoutLabel: v1.IntegrationKitLayoutNative,
+					v1.IntegrationKitLayoutLabel: v1.IntegrationKitLayoutNativeSources,
 				},
 				Namespace: "namespace",
 			},
diff --git a/pkg/trait/quarkus.go b/pkg/trait/quarkus.go
index 9bec0c22a..1db7f6f16 100644
--- a/pkg/trait/quarkus.go
+++ b/pkg/trait/quarkus.go
@@ -39,10 +39,16 @@ const (
 	quarkusTraitID = "quarkus"
 )
 
-var kitPriority = map[traitv1.QuarkusPackageType]string{
-	traitv1.FastJarPackageType:       "1000",
-	traitv1.NativeSourcesPackageType: "2000",
-	traitv1.NativePackageType:        "2100",
+type quarkusPackageType string
+
+const (
+	fastJarPackageType       quarkusPackageType = "fast-jar"
+	nativeSourcesPackageType quarkusPackageType = "native-sources"
+)
+
+var kitPriority = map[quarkusPackageType]string{
+	fastJarPackageType:       "1000",
+	nativeSourcesPackageType: "2000",
 }
 
 type quarkusTrait struct {
@@ -124,15 +130,15 @@ func (t *quarkusTrait) Matches(trait Trait) bool {
 		return false
 	}
 
-	if len(t.PackageTypes) == 0 && len(qt.PackageTypes) != 0 && !containsPackageType(qt.PackageTypes, traitv1.FastJarPackageType) {
+	if len(t.Modes) == 0 && len(qt.Modes) != 0 && !qt.containsMode(traitv1.JvmQuarkusMode) {
 		return false
 	}
 
-	for _, pt := range t.PackageTypes {
-		if pt == traitv1.FastJarPackageType && len(qt.PackageTypes) == 0 {
+	for _, md := range t.Modes {
+		if md == traitv1.JvmQuarkusMode && len(qt.Modes) == 0 {
 			continue
 		}
-		if containsPackageType(qt.PackageTypes, pt) {
+		if qt.containsMode(md) {
 			continue
 		}
 		return false
@@ -146,12 +152,29 @@ func (t *quarkusTrait) Configure(e *Environment) (bool, error) {
 		return false, nil
 	}
 
+	t.adaptDeprecatedFields()
+
 	return e.IntegrationInPhase(v1.IntegrationPhaseBuildingKit) ||
 			e.IntegrationKitInPhase(v1.IntegrationKitPhaseBuildSubmitted) ||
 			e.IntegrationKitInPhase(v1.IntegrationKitPhaseReady) && e.IntegrationInRunningPhases(),
 		nil
 }
 
+func (t *quarkusTrait) adaptDeprecatedFields() {
+	if t.PackageTypes != nil {
+		t.L.Info("The package-type parameter is deprecated and may be removed in future releases. Make sure to use mode parameter instead.")
+		for _, pt := range t.PackageTypes {
+			if pt == traitv1.NativePackageType {
+				t.Modes = append(t.Modes, traitv1.NativeQuarkusMode)
+				continue
+			}
+			if pt == traitv1.FastJarPackageType {
+				t.Modes = append(t.Modes, traitv1.JvmQuarkusMode)
+			}
+		}
+	}
+}
+
 func (t *quarkusTrait) Apply(e *Environment) error {
 	if e.IntegrationInPhase(v1.IntegrationPhaseBuildingKit) {
 		t.applyWhileBuildingKit(e)
@@ -175,7 +198,7 @@ func (t *quarkusTrait) Apply(e *Environment) error {
 }
 
 func (t *quarkusTrait) applyWhileBuildingKit(e *Environment) {
-	if containsPackageType(t.PackageTypes, traitv1.NativePackageType) {
+	if t.containsMode(traitv1.NativeQuarkusMode) {
 		// Native compilation is only supported for a subset of languages,
 		// so let's check for compatibility, and fail-fast the Integration,
 		// to save compute resources and user time.
@@ -185,23 +208,21 @@ func (t *quarkusTrait) applyWhileBuildingKit(e *Environment) {
 		}
 	}
 
-	switch len(t.PackageTypes) {
+	switch len(t.Modes) {
 	case 0:
-		kit := t.newIntegrationKit(e, traitv1.FastJarPackageType)
+		// Default behavior
+		kit := t.newIntegrationKit(e, fastJarPackageType)
 		e.IntegrationKits = append(e.IntegrationKits, *kit)
-
 	case 1:
-		kit := t.newIntegrationKit(e, t.PackageTypes[0])
+		kit := t.newIntegrationKit(e, packageType(t.Modes[0]))
 		e.IntegrationKits = append(e.IntegrationKits, *kit)
-
 	default:
-		for _, pt := range t.PackageTypes {
-			packageType := pt
-			kit := t.newIntegrationKit(e, packageType)
+		for _, md := range t.Modes {
+			kit := t.newIntegrationKit(e, packageType(md))
 			if kit.Spec.Traits.Quarkus == nil {
 				kit.Spec.Traits.Quarkus = &traitv1.QuarkusTrait{}
 			}
-			kit.Spec.Traits.Quarkus.PackageTypes = []traitv1.QuarkusPackageType{packageType}
+			kit.Spec.Traits.Quarkus.Modes = []traitv1.QuarkusMode{md}
 			e.IntegrationKits = append(e.IntegrationKits, *kit)
 		}
 	}
@@ -225,7 +246,7 @@ func (t *quarkusTrait) validateNativeSupport(e *Environment) bool {
 	return true
 }
 
-func (t *quarkusTrait) newIntegrationKit(e *Environment, packageType traitv1.QuarkusPackageType) *v1.IntegrationKit {
+func (t *quarkusTrait) newIntegrationKit(e *Environment, packageType quarkusPackageType) *v1.IntegrationKit {
 	integration := e.Integration
 	kit := v1.NewIntegrationKit(integration.GetIntegrationKitNamespace(e.Platform), fmt.Sprintf("kit-%s", xid.New()))
 
@@ -262,7 +283,7 @@ func (t *quarkusTrait) newIntegrationKit(e *Environment, packageType traitv1.Qua
 		Traits:       propagateKitTraits(e),
 	}
 
-	if packageType == traitv1.NativePackageType || packageType == traitv1.NativeSourcesPackageType {
+	if packageType == nativeSourcesPackageType {
 		kit.Spec.Sources = propagateSourcesRequiredAtBuildTime(e)
 	}
 	return kit
@@ -321,7 +342,7 @@ func (t *quarkusTrait) applyWhenBuildSubmitted(e *Environment) error {
 	}
 
 	if native {
-		buildTask.Maven.Properties["quarkus.package.type"] = string(traitv1.NativeSourcesPackageType)
+		buildTask.Maven.Properties["quarkus.package.type"] = string(nativeSourcesPackageType)
 		if len(e.IntegrationKit.Spec.Sources) > 0 {
 			buildTask.Sources = e.IntegrationKit.Spec.Sources
 			buildSteps = append(buildSteps, builder.Quarkus.PrepareProjectWithSources)
@@ -331,7 +352,7 @@ func (t *quarkusTrait) applyWhenBuildSubmitted(e *Environment) error {
 		packageSteps = append(packageSteps, builder.Image.ExecutableDockerfile)
 	} else {
 		// Default, if nothing is specified
-		buildTask.Maven.Properties["quarkus.package.type"] = string(traitv1.FastJarPackageType)
+		buildTask.Maven.Properties["quarkus.package.type"] = string(fastJarPackageType)
 		packageSteps = append(packageSteps, builder.Quarkus.ComputeQuarkusDependencies)
 		// The LoadCamelQuarkusCatalog is required to have catalog information available by the builder
 		packageSteps = append(packageSteps, builder.Quarkus.LoadCamelQuarkusCatalog)
@@ -355,11 +376,11 @@ func (t *quarkusTrait) applyWhenBuildSubmitted(e *Environment) error {
 }
 
 func (t *quarkusTrait) isNativeKit(e *Environment) (bool, error) {
-	switch types := t.PackageTypes; len(types) {
+	switch modes := t.Modes; len(modes) {
 	case 0:
 		return false, nil
 	case 1:
-		return types[0] == traitv1.NativePackageType || types[0] == traitv1.NativeSourcesPackageType, nil
+		return modes[0] == traitv1.NativeQuarkusMode, nil
 	default:
 		return false, fmt.Errorf("kit %q has more than one package type", e.IntegrationKit.Name)
 	}
@@ -381,7 +402,7 @@ func (t *quarkusTrait) applyWhenKitReady(e *Environment) error {
 
 func (t *quarkusTrait) isNativeIntegration(e *Environment) bool {
 	// The current IntegrationKit determines the Integration runtime type
-	return e.IntegrationKit.Labels[v1.IntegrationKitLayoutLabel] == v1.IntegrationKitLayoutNative
+	return e.IntegrationKit.Labels[v1.IntegrationKitLayoutLabel] == v1.IntegrationKitLayoutNativeSources
 }
 
 // Indicates whether the given source code is embedded into the final binary.
@@ -395,15 +416,26 @@ func (t *quarkusTrait) isEmbedded(e *Environment, source v1.SourceSpec) bool {
 	return false
 }
 
-func containsPackageType(types []traitv1.QuarkusPackageType, t traitv1.QuarkusPackageType) bool {
-	for _, ti := range types {
-		if t == ti {
+func (t *quarkusTrait) containsMode(m traitv1.QuarkusMode) bool {
+	for _, mode := range t.Modes {
+		if mode == m {
 			return true
 		}
 	}
 	return false
 }
 
+func packageType(mode traitv1.QuarkusMode) quarkusPackageType {
+	if mode == traitv1.NativeQuarkusMode {
+		return nativeSourcesPackageType
+	}
+	if mode == traitv1.JvmQuarkusMode {
+		return fastJarPackageType
+	}
+
+	return ""
+}
+
 // Indicates whether the given source file is required at build time for native compilation.
 func sourcesRequiredAtBuildTime(e *Environment, source v1.SourceSpec) bool {
 	settings := getLanguageSettings(e, source.InferLanguage())
diff --git a/pkg/trait/trait_test.go b/pkg/trait/trait_test.go
index df38dc472..edefb8586 100644
--- a/pkg/trait/trait_test.go
+++ b/pkg/trait/trait_test.go
@@ -318,7 +318,7 @@ func TestConfigureVolumesAndMountsSourcesInNativeMode(t *testing.T) {
 	traitList := make([]Trait, 0, len(FactoryList))
 	trait, ok := newQuarkusTrait().(*quarkusTrait)
 	assert.True(t, ok, "A Quarkus trait was expected")
-	trait.PackageTypes = []traitv1.QuarkusPackageType{traitv1.NativePackageType}
+	trait.Modes = []traitv1.QuarkusMode{traitv1.NativeQuarkusMode}
 	traitList = append(traitList, trait)
 	env := Environment{
 		Resources: kubernetes.NewCollection(),
@@ -368,7 +368,7 @@ func TestConfigureVolumesAndMountsSourcesInNativeMode(t *testing.T) {
 		IntegrationKit: &v1.IntegrationKit{
 			ObjectMeta: metav1.ObjectMeta{
 				Labels: map[string]string{
-					v1.IntegrationKitLayoutLabel: v1.IntegrationKitLayoutNative,
+					v1.IntegrationKitLayoutLabel: v1.IntegrationKitLayoutNativeSources,
 				},
 				Namespace: "ns",
 			},
diff --git a/resources/traits.yaml b/resources/traits.yaml
index 5919692f0..2f2a340ce 100755
--- a/resources/traits.yaml
+++ b/resources/traits.yaml
@@ -1331,13 +1331,19 @@ traits:
       property.
   - name: package-type
     type: '[]github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait.QuarkusPackageType'
-    description: The Quarkus package types, `fast-jar`, `native-sources` or `native`
-      (default `fast-jar`). `native` is deprecated. In case both `fast-jar` and `native`
-      or `native-sources` are specified, two `IntegrationKit` resources are created,
-      with the native kit having precedence over the `fast-jar` one once ready. The
-      order influences the resolution of the current kit for the integration. The
-      kit corresponding to the first package type will be assigned to the integration
-      in case no existing kit that matches the integration exists.
+    description: 'The Quarkus package types, `fast-jar` or `native` (default `fast-jar`).
+      In case both `fast-jar` and `native` are specified, two `IntegrationKit` resources
+      are created, with the native kit having precedence over the `fast-jar` one once
+      ready. The order influences the resolution of the current kit for the integration.
+      The kit corresponding to the first package type will be assigned to the integration
+      in case no existing kit that matches the integration exists. Deprecated: use
+      `mode` instead.'
+  - name: mode
+    type: '[]github.com/apache/camel-k/v2/pkg/apis/camel/v1/trait.QuarkusMode'
+    description: 'The Quarkus mode to run: either `jvm` or `native` (default `jvm`).
+      In case both `jvm` and `native` are specified, two `IntegrationKit` resources
+      are created, with the `native` kit having precedence over the `jvm` one once
+      ready.'
 - name: registry
   platform: false
   profiles: