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