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 b3b833fbca783d1644529ffbc3f3f7ff01823ef2
Author: Pasquale Congiusti <pasquale.congiu...@gmail.com>
AuthorDate: Wed Jun 21 10:11:39 2023 +0200

    feat(cicd): onboard Camel K Tekton task
    
    While https://github.com/tektoncd/catalog/pull/1166 is on hold, we support 
it out of the official catalog
    
    Closes #3795
---
 cicd/tekton/kamel-run/0.1/README.md                |  52 ++++++++++
 cicd/tekton/kamel-run/0.1/kamel-run.yaml           |  56 +++++++++++
 .../kamel-run/0.1/samples/run-external-build.yaml  | 106 +++++++++++++++++++++
 .../kamel-run/0.1/samples/run-operator-build.yaml  |  50 ++++++++++
 .../kamel-run/0.1/support/camel-k-tekton.yaml      |  34 +++++++
 .../kamel-run/0.1/tests/pre-apply-task-hook.sh     |  10 ++
 cicd/tekton/kamel-run/0.1/tests/resources.yaml     |  34 +++++++
 cicd/tekton/kamel-run/0.1/tests/run.yaml           |  76 +++++++++++++++
 8 files changed, 418 insertions(+)

diff --git a/cicd/tekton/kamel-run/0.1/README.md 
b/cicd/tekton/kamel-run/0.1/README.md
new file mode 100644
index 000000000..afd098578
--- /dev/null
+++ b/cicd/tekton/kamel-run/0.1/README.md
@@ -0,0 +1,52 @@
+# Kamel run
+
+This Task creates and run a [Camel K](https://github.com/apache/camel-k) 
Integration.
+
+If you have installed Camel K operator, you can configure the `kamel-run` task 
the step to create the Integration that will be operated by Camel K. You can 
configure the parameter to delegate the build of your application to Camel K or 
do it as a part of previous pipelines steps.
+
+## Install the Task
+
+```shell
+kubectl apply -f 
https://raw.githubusercontent.com/apache/camel-k/main/tekton/kamel-run/0.1/kamel-run.yaml
+```
+
+## Parameters
+
+- **camel-k-image**: The name of the image containing the Kamel CLI 
(_default:_ docker.io/apache/camel-k:1.12.0).
+- **filename**: the file containing the Integration source.
+- **namespace**: the namespace where to run the Integration (_default:_ the 
task execution namespace).
+- **container-image**: the container image to use for this Integration. Useful 
when you want to build your own container for the Integration (_default:_ 
empty, will trigger an Integration build).
+- **wait**: wait for the Integration to run before finishing the task. Useful 
when you want to get the **integration-phase** result (_default:_ "false").
+
+## Workspaces
+
+* **source**: A 
[Workspace](https://github.com/tektoncd/pipeline/blob/main/docs/workspaces.md) 
containing the Integration source to run.
+
+## Results
+
+- **integration-name**: the Integration name which was created/updated.
+- **integration-phase**: the status of the Integration, tipycally used with 
**wait: true** input parameter.
+
+## Platforms
+
+The Task can be run on `linux/amd64` platform.
+
+## Usage
+
+The Task can be used in several ways to accomodate the different build and 
deployment strategy you may have.
+
+### Create the Service Account
+
+As we will do delegate the task, the creation of an Integration, we need to 
provide a `ServiceAccount` with the privileges required by the tasks:
+
+```shell
+kubectl apply -f  
https://raw.githubusercontent.com/apache/camel-k/main/tekton/kamel-run/0.1/support/camel-k-tekton.yaml
+```
+
+### Delegate build to operator
+
+Use the [Tekton Camel K operator builder 
sample](../0.1/samples/run-operator-build.yaml) in order to fetch a Git 
repository and run a Camel K Integration delegating the build to the Camel K 
operator.
+
+### Full pipeline with custom build
+
+Use the [Tekton Camel K external builder 
sample](../0.1/samples/run-external-build.yaml) as a reference for a full 
pipeline where you define your own process of building the Camel application 
and using the `kamel-run` Task as last step in order to deploy the Integration 
and let Camel K operator managing it.
\ No newline at end of file
diff --git a/cicd/tekton/kamel-run/0.1/kamel-run.yaml 
b/cicd/tekton/kamel-run/0.1/kamel-run.yaml
new file mode 100644
index 000000000..f6056c921
--- /dev/null
+++ b/cicd/tekton/kamel-run/0.1/kamel-run.yaml
@@ -0,0 +1,56 @@
+apiVersion: tekton.dev/v1beta1
+kind: Task
+metadata:
+  name: kamel-run
+  labels:
+    app.kubernetes.io/version: "0.1"
+  annotations:
+    tekton.dev/categories: Deployment
+    tekton.dev/pipelines.minVersion: "0.17.0"
+    tekton.dev/tags: cli
+    tekton.dev/platforms: "linux/amd64"
+    tekton.dev/displayName: "kamel run"
+spec:
+  description: >-
+    Run a Camel Integration
+
+    Kamel-run task creates a Camel K Integration which will be taken and 
operated by Camel K operator. You can either use this task to
+    run a build from source or build the application in previous tasks and use 
this last task to deploy and let Camel K operates it.
+  params:
+    - name: camel-k-image
+      description: The location of Camel K CLI image.
+      default: docker.io/apache/camel-k:1.12.0
+    - name: filename
+      description: the Integration source we want to run
+    - name: namespace
+      description: the namespace where to run the integration
+      default: ""
+    - name: container-image
+      description: the custom container image to use (if the build was 
performed as part of previous tasks)
+      default: ""
+    - name: wait
+      description: wait for the Integration to run before exiting the task
+      default: "false"
+  results:
+    - name: integration-name
+      description: The name of the integration created
+    - name: integration-phase
+      description: The phase of the integration created (when used with input 
`wait` parameter)
+  workspaces:
+  - name: source
+  steps:
+  - name: execute
+    image: $(params.camel-k-image)
+    workingDir: $(workspaces.source.path)
+    script: |
+      #!/usr/bin/env bash
+
+      KAMEL_RUN_ARGS="$(params.filename)"
+      [[ ! "$(params.namespace)" == "" ]] && KAMEL_RUN_ARGS="$KAMEL_RUN_ARGS 
-n $(params.namespace)"
+      [[ ! "$(params.container-image)" == "" ]] && 
KAMEL_RUN_ARGS="$KAMEL_RUN_ARGS -t container.image=$(params.container-image)"
+      [[ "$(params.wait)" == "true" ]] && KAMEL_RUN_ARGS="$KAMEL_RUN_ARGS 
--wait"
+      kamel_output=$(kamel run "$KAMEL_RUN_ARGS")
+      echo "$kamel_output"
+      # Let's use the output produced to scrape the integration name and phase
+      echo "$kamel_output" | grep -oP 'Integration ".*?" 
(updated|created|unchanged)' | awk -F ' ' '{print $2}' | sed "s/\"//g" | tr -d 
'\n' | tee "$(results.integration-name.path)"
+      kamel get "$(cat "$(results.integration-name.path)")" 2>/dev/null | tail 
-n +2 | awk -F ' ' '{print $2}' | tee "$(results.integration-phase.path)"
\ No newline at end of file
diff --git a/cicd/tekton/kamel-run/0.1/samples/run-external-build.yaml 
b/cicd/tekton/kamel-run/0.1/samples/run-external-build.yaml
new file mode 100644
index 000000000..14543a623
--- /dev/null
+++ b/cicd/tekton/kamel-run/0.1/samples/run-external-build.yaml
@@ -0,0 +1,106 @@
+---
+apiVersion: tekton.dev/v1beta1
+kind: Pipeline
+metadata:
+  name: external-build
+spec:
+  workspaces:
+  - name: shared-workspace
+  - name: maven-settings
+  tasks:
+  # Fetch git repo
+  - name: fetch-repository
+    taskRef:
+      name: git-clone
+    workspaces:
+    - name: output
+      workspace: shared-workspace
+    params:
+    - name: url
+      value: https://github.com/apache/camel-k-runtime
+  # Build the application
+  - name: maven-build
+    taskRef:
+      name: maven
+    runAfter:
+    - fetch-repository
+    workspaces:
+    - name: source
+      workspace: shared-workspace
+    - name: maven-settings
+      workspace: maven-settings
+    params:
+    - name: CONTEXT_DIR
+      value: "examples/yaml"
+    - name: GOALS
+      value:
+        - clean
+        - package
+  # Create the dockerfile (could be already in the git project, in such case, 
just skip this task)
+  - name: create-dockerfile
+    runAfter:
+    - maven-build
+    workspaces:
+    - name: source
+      workspace: shared-workspace
+    taskSpec:
+      steps:
+      - name: bash
+        image: ubuntu
+        script: |
+          echo "FROM docker.io/eclipse-temurin:17-jdk" > 
$(workspaces.source.path)/examples/yaml/Dockerfile
+          echo "COPY target/quarkus-app/ /deployments/dependencies/" >> 
$(workspaces.source.path)/examples/yaml/Dockerfile
+  # Build and push the container with the Camel application
+  - name: docker-build
+    taskRef:
+      name: buildah
+    runAfter:
+    - create-dockerfile
+    workspaces:
+    - name: source
+      workspace: shared-workspace
+    params:
+    - name: IMAGE
+      # Provide your container registry configuration accordingly!
+      value: 10.110.149.72/camel-k/my-camel-image
+    - name: TLSVERIFY
+      value: "false"
+    - name: CONTEXT
+      value: $(workspaces.source.path)/examples/yaml
+  # Run the Camel Integration, using the container image built previously
+  - name: kamel-run
+    taskRef:
+      name: kamel-run
+    runAfter:
+    - docker-build
+    workspaces:
+    - name: source
+      workspace: shared-workspace
+    params:
+    - name: filename
+      value: examples/yaml/data/routes.yaml
+    - name: container-image
+      value: $(tasks.docker-build.results.IMAGE_URL)
+
+---
+apiVersion: tekton.dev/v1beta1
+kind: PipelineRun
+metadata:
+  name: external-build-run
+spec:
+  pipelineRef:
+    name: external-build
+  taskRunSpecs:
+    - pipelineTaskName: kamel-run
+      taskServiceAccountName: camel-k-tekton
+  workspaces:
+  - name: shared-workspace
+    volumeClaimTemplate:
+      spec:
+        accessModes:
+        - ReadWriteOnce
+        resources:
+          requests:
+            storage: 1Gi
+  - name: maven-settings
+    emptyDir: {}
diff --git a/cicd/tekton/kamel-run/0.1/samples/run-operator-build.yaml 
b/cicd/tekton/kamel-run/0.1/samples/run-operator-build.yaml
new file mode 100644
index 000000000..57dd95817
--- /dev/null
+++ b/cicd/tekton/kamel-run/0.1/samples/run-operator-build.yaml
@@ -0,0 +1,50 @@
+---
+apiVersion: tekton.dev/v1beta1
+kind: Pipeline
+metadata:
+  name: operator-build
+spec:
+  workspaces:
+  - name: shared-workspace
+  tasks:
+  - name: fetch-repository
+    taskRef:
+      name: git-clone
+    workspaces:
+    - name: output
+      workspace: shared-workspace
+    params:
+    - name: url
+      value: https://github.com/apache/camel-k-examples/
+  - name: kamel-run
+    taskRef:
+      name: kamel-run
+    runAfter:
+    - fetch-repository
+    workspaces:
+    - name: source
+      workspace: shared-workspace
+    params:
+    - name: filename
+      value: generic-examples/languages/routes.yaml
+
+---
+apiVersion: tekton.dev/v1beta1
+kind: PipelineRun
+metadata:
+  name: operator-build-run
+spec:
+  pipelineRef:
+    name: operator-build
+  taskRunSpecs:
+    - pipelineTaskName: kamel-run
+      taskServiceAccountName: camel-k-tekton
+  workspaces:
+  - name: shared-workspace
+    volumeClaimTemplate:
+      spec:
+        accessModes:
+        - ReadWriteOnce
+        resources:
+          requests:
+            storage: 1Gi
diff --git a/cicd/tekton/kamel-run/0.1/support/camel-k-tekton.yaml 
b/cicd/tekton/kamel-run/0.1/support/camel-k-tekton.yaml
new file mode 100644
index 000000000..5aa8c6525
--- /dev/null
+++ b/cicd/tekton/kamel-run/0.1/support/camel-k-tekton.yaml
@@ -0,0 +1,34 @@
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: camel-k-tekton
+---
+kind: Role
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+  name: camel-k-integrations
+rules:
+- apiGroups:
+  - camel.apache.org
+  resources:
+  - integrations
+  verbs:
+  - create
+  - get
+  - list
+  - patch
+  - update
+  - watch
+---
+kind: RoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+  name: camel-k-tekton-integrations
+subjects:
+- kind: ServiceAccount
+  name: camel-k-tekton
+roleRef:
+  kind: Role
+  name: camel-k-integrations
+  apiGroup: rbac.authorization.k8s.io
\ No newline at end of file
diff --git a/cicd/tekton/kamel-run/0.1/tests/pre-apply-task-hook.sh 
b/cicd/tekton/kamel-run/0.1/tests/pre-apply-task-hook.sh
new file mode 100755
index 000000000..1b7301847
--- /dev/null
+++ b/cicd/tekton/kamel-run/0.1/tests/pre-apply-task-hook.sh
@@ -0,0 +1,10 @@
+#!/usr/bin/env bash
+add_sidecar_registry ${TMPF}
+
+# Install Camel K operator
+wget 
https://github.com/apache/camel-k/releases/download/v1.12.0/camel-k-client-1.12.0-linux-64bit.tar.gz
+tar -xvf camel-k-client-1.12.0-linux-64bit.tar.gz
+./kamel install --registry localhost:5000 --registry-insecure --wait
+
+# Add git-clone
+add_task git-clone 0.7
\ No newline at end of file
diff --git a/cicd/tekton/kamel-run/0.1/tests/resources.yaml 
b/cicd/tekton/kamel-run/0.1/tests/resources.yaml
new file mode 100644
index 000000000..8c66baefb
--- /dev/null
+++ b/cicd/tekton/kamel-run/0.1/tests/resources.yaml
@@ -0,0 +1,34 @@
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: camel-k-tekton
+---
+kind: Role
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+  name: camel-k-integrations
+rules:
+- apiGroups:
+  - camel.apache.org
+  resources:
+  - integrations
+  verbs:
+  - create
+  - get
+  - list
+  - patch
+  - update
+  - watch
+---
+kind: RoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+  name: camel-k-tekton-integrations
+subjects:
+- kind: ServiceAccount
+  name: camel-k-tekton
+roleRef:
+  kind: Role
+  name: camel-k-integrations
+  apiGroup: rbac.authorization.k8s.io
diff --git a/cicd/tekton/kamel-run/0.1/tests/run.yaml 
b/cicd/tekton/kamel-run/0.1/tests/run.yaml
new file mode 100644
index 000000000..b255be62b
--- /dev/null
+++ b/cicd/tekton/kamel-run/0.1/tests/run.yaml
@@ -0,0 +1,76 @@
+---
+apiVersion: tekton.dev/v1beta1
+kind: Pipeline
+metadata:
+  name: kamel-run-test
+spec:
+  workspaces:
+  - name: shared-workspace
+  tasks:
+  - name: fetch-repository
+    taskRef:
+      name: git-clone
+    workspaces:
+    - name: output
+      workspace: shared-workspace
+    params:
+    - name: url
+      value: https://github.com/apache/camel-k-examples/
+  - name: kamel-run
+    taskRef:
+      name: kamel-run
+    runAfter:
+    - fetch-repository
+    workspaces:
+    - name: source
+      workspace: shared-workspace
+    params:
+    - name: filename
+      value: generic-examples/languages/routes.yaml
+    - name: wait
+      value: "true"
+  - name: verify-it-phase
+    runAfter:
+    - kamel-run
+    params:
+    - name: it-name
+      value: $(tasks.kamel-run.results.integration-name)
+    - name: it-phase
+      value: $(tasks.kamel-run.results.integration-phase)
+    taskSpec:
+      params:
+      - name: it-name
+      - name: it-phase
+      steps:
+      - name: bash
+        image: ubuntu
+        script: |
+          if [[ ! $(params.it-name) == "sample"]]; then
+            echo "Expected integration name sample (was $(params.it-name))"
+            exit 1
+          fi
+          if [[ ! $(params.it-phase) == "running"]]; then
+            echo "Expected integration phase running (was $(params.it-phase))"
+            exit 1
+          fi
+
+---
+apiVersion: tekton.dev/v1beta1
+kind: PipelineRun
+metadata:
+  name: kamel-run-test-run
+spec:
+  pipelineRef:
+    name: kamel-run-test
+  taskRunSpecs:
+    - pipelineTaskName: kamel-run
+      taskServiceAccountName: camel-k-tekton
+  workspaces:
+  - name: shared-workspace
+    volumeClaimTemplate:
+      spec:
+        accessModes:
+        - ReadWriteOnce
+        resources:
+          requests:
+            storage: 1Gi

Reply via email to