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