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/06/21 13:21:17 UTC

[camel-k] 01/02: feat(cicd): onboard Camel K Tekton task

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 <pa...@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