提交 44d8b2ca 编写于 作者: G Geri Ochoa 提交者: tekton-robot

Create getting started with triggers

- Add new beginners tutorial for Triggers.
- Modify Pipelines example to use one parameter.
- Make some editorial changes to the previous tutorials.
上级 38551de0
......@@ -14,8 +14,7 @@ This tutorial shows you how to:
+ Create a Pipeline containing your Tasks.
+ Use `PipelineRun` to instantiate and run the Pipeline containing your Tasks.
For this tutorial we are going to use [minikube][minikube] to run the commands
locally.
This guide uses a local cluster with [minikube][].
## Prerequisites
......@@ -26,7 +25,7 @@ locally.
## Create and run a second Task
You already have a *Hello World!* Task. To create a second *Goodbye World!*
You already have a "Hello World!" Task. To create a second "Goodbye!"
Task:
1. Create a new file named `goodbye-world.yaml` and add the following
......@@ -38,30 +37,36 @@ Task:
metadata:
name: goodbye
spec:
params:
- name: username
type: string
steps:
- name: goodbye
image: ubuntu
script: |
#!/bin/bash
echo "Goodbye World!"
echo "Goodbye $(params.username)!"
```
1. Apply your Task file:
This Task takes one parameter, `username`. Whenever this Task is used a
value for that parameter must be passed to the Task.
1. Apply the Task file:
```bash
kubectl apply --filename goodbye-world.yaml
```
When a Task is part of a Pipeline you don't have to instantiate it, the Pipeline
is going to take care of that.
When a Task is part of a Pipeline, Tekton create a `TaskRun` object for every
task in the Pipeline.
## Create and run a Pipeline
A **[Pipeline](/docs/pipelines/pipelines/)** defines an ordered series of Tasks
arranged in a specific execution order as part of your CI/CD workflow.
A **Pipeline** defines an ordered series of Tasks arranged in a specific
execution order as part of the CI/CD workflow.
In this section you are going to create your first Pipeline, that will include
both the *Hello World!* and *Goodbye World!* Tasks.
both the "Hello World!" and "Goodbye!" Tasks.
1. Create a new file named `hello-goodbye-pipeline.yaml` and add the following
content:
......@@ -72,6 +77,9 @@ both the *Hello World!* and *Goodbye World!* Tasks.
metadata:
name: hello-goodbye
spec:
params:
- name: username
type: string
tasks:
- name: hello
taskRef:
......@@ -81,16 +89,24 @@ both the *Hello World!* and *Goodbye World!* Tasks.
- hello
taskRef:
name: goodbye
params:
- name: username
value: $(params.username)
```
1. Apply your Pipeline configuration to your cluster:
The Pipeline defines the parameter `username`, which is then passed to the
`goodbye` Task.
1. Apply the Pipeline configuration to your cluster:
```bash
kubectl apply --filename hello-goodbye-pipeline.yaml
```
1. Instantiate your Pipeline with a `PipelineRun` object. Create a new file
named `hello-goodbye-pipeline-run.yaml` with the following content:
1. A **PipelineRun**, represented in the API as an object of kind
`PipelineRun`, sets the value for the parameters and executes a Pipeline. To
create PipelineRun, create a new file named
`hello-goodbye-pipeline-run.yaml` with the following:
```yaml
apiVersion: tekton.dev/v1beta1
......@@ -100,9 +116,14 @@ both the *Hello World!* and *Goodbye World!* Tasks.
spec:
pipelineRef:
name: hello-goodbye
params:
- name: username
value: "Tekton"
```
This sets the actual value for the `username` parameter: `"Tekton"`.
1. Start your Pipeline by applying the `PipelineRun` configuration to your
1. Start the Pipeline by applying the `PipelineRun` configuration to your
cluster:
```bash
......@@ -111,11 +132,11 @@ both the *Hello World!* and *Goodbye World!* Tasks.
You see the following output:
```bash
```
pipelinerun.tekton.dev/hello-goodbye-run created
```
Tekton now starts running your Pipeline.
Tekton now starts running the Pipeline.
1. To see the logs of the `PipelineRun`, use the following command:
......@@ -128,18 +149,21 @@ both the *Hello World!* and *Goodbye World!* Tasks.
<pre>
[hello : hello] Hello World!
[goodbye : goodbye] Goodbye World!
[goodbye : goodbye] Goodbye Tekton!
</pre>
## Cleanup
To delete the cluster that you created for this quickstart run:
To learn about Tekton Triggers, skip this section and proceed to the
[next tutorial][triggers-qs].
To delete the cluster that you created for this guide run:
```bash
minikube delete
```
The output confirms that your cluster was deleted:
The output confirms that the cluster was deleted:
<pre>
🔥 Deleting "minikube" in docker ...
......@@ -150,17 +174,16 @@ The output confirms that your cluster was deleted:
## Further reading
- [Tasks](/docs/pipelines/tasks)
- [Pipelines](/docs/pipelines/pipelines)
We recommend that you complete [Getting started with Triggers][triggers-qs].
Other useful resources
For more complex examples check:
- [Convenience scripts to run Kind][kind-setup]
- [Instructions to setup Minikube and Docker][local-setup]
- [Clone a git repository with Tekton][git-howto].
- [Build and push a container image with Tekton][kaniko-howto].
[minikube]: https://minikube.sigs.k8s.io/docs/start/
[kind]: https://kind.sigs.k8s.io/docs/user/quick-start/#installation
[kind-setup]: https://github.com/tektoncd/plumbing/tree/main/hack
[kubectl]: https://github.com/tektoncd/pipeline/blob/main/docs/developers/local-setup.md
[local-setup]: https://github.com/tektoncd/pipeline/blob/main/docs/developers/local-setup.md
[git-howto]: /docs/how-to-guides/clone-repository/
[kaniko-howto]: /docs/how-to-guides/kaniko-build-push/
[triggers-qs]: /docs/getting-started/triggers/
......@@ -13,7 +13,7 @@ This tutorial shows you how to
1. Create a Kubernetes cluster with [minikube](https://minikube.sigs.k8s.io/).
1. Install Tekton pipelines.
1. Create a Task.
1. Use `TaskRun` to instantiate and run your Task.
1. Use `TaskRun` to instantiate and run the Task.
## Prerequisites
......@@ -22,7 +22,7 @@ This tutorial shows you how to
1. [Install kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl).
## Create your Kubernetes cluster
## Create a Kubernetes cluster
Create a cluster
......@@ -34,7 +34,7 @@ The process takes a few seconds, you see an output symilar to the following,
depending on the [minikube driver](https://minikube.sigs.k8s.io/docs/drivers/)
that you are using:
<pre>
```
😄 minikube v1.25.1
✨ Using the docker driver based on existing profile
👍 Starting control plane node minikube in cluster minikube
......@@ -49,7 +49,7 @@ that you are using:
▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟 Enabled addons: storage-provisioner, default-storageclass
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
</pre>
```
You can check that the cluster was successfully created with `kubectl`:
......@@ -59,13 +59,13 @@ kubectl cluster-info
The output confirms that Kubernetes is running:
<pre>
```
Kubernetes control plane is running at https://127.0.0.1:39509
CoreDNS is running at
https://127.0.0.1:39509/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
</pre>
```
## Install Tekton Pipelines
......@@ -81,29 +81,28 @@ To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
```bash
kubectl get pods --namespace tekton-pipelines --watch
```
When both `tekton-pipelines-controller` and `tekton-pipelines-webhook` show
`1/1` under the `READY` column, you are ready to continue. For example:
```bash
$ kubectl get pods --namespace tekton-pipelines --watch
NAME READY STATUS RESTARTS AGE
tekton-pipelines-controller-6d989cc968-j57cs 0/1 Pending 0 3s
tekton-pipelines-webhook-69744499d9-t58s5 0/1 ContainerCreating 0 3s
tekton-pipelines-controller-6d989cc968-j57cs 0/1 ContainerCreating 0 3s
tekton-pipelines-controller-6d989cc968-j57cs 0/1 Running 0 5s
tekton-pipelines-webhook-69744499d9-t58s5 0/1 Running 0 6s
tekton-pipelines-controller-6d989cc968-j57cs 1/1 Running 0 10s
tekton-pipelines-webhook-69744499d9-t58s5 1/1 Running 0 20s
```
When both `tekton-pipelines-controller` and `tekton-pipelines-webhook` show
`1/1` under the `READY` column, you are ready to continue. For example:
Hit *Ctrl + C* to stop monitoring.
```
NAME READY STATUS RESTARTS AGE
tekton-pipelines-controller-6d989cc968-j57cs 0/1 Pending 0 3s
tekton-pipelines-webhook-69744499d9-t58s5 0/1 ContainerCreating 0 3s
tekton-pipelines-controller-6d989cc968-j57cs 0/1 ContainerCreating 0 3s
tekton-pipelines-controller-6d989cc968-j57cs 0/1 Running 0 5s
tekton-pipelines-webhook-69744499d9-t58s5 0/1 Running 0 6s
tekton-pipelines-controller-6d989cc968-j57cs 1/1 Running 0 10s
tekton-pipelines-webhook-69744499d9-t58s5 1/1 Running 0 20s
```
Hit *Ctrl + C* to stop monitoring.
## Create and run a basic Task
A **Task**, represented in the API as an object of kind `Task`, defines a
series of **Steps** that run sequentially to perform logic that the Task
requires. Every Task runs as a pod on your Kubernetes cluster, with each step
requires. Every Task runs as a pod on the Kubernetes cluster, with each step
running in its own container.
1. To create a Task, open your favorite editor and create a file named
......@@ -134,11 +133,11 @@ running in its own container.
The output confirms that the Task was completed successfully.
```bash
```
task.tekton.dev/hello created
```
1. To run this Task, you must instantiate it using `TaskRun`. Create another
1. A `TaskRun` object instantiates and executes this Task. Create another
file named `hello-world-run.yaml` with the following content:
```yaml
......@@ -165,17 +164,18 @@ running in its own container.
The output of this command shows the status of the Task
<pre>
NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME
```
NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME
hello-task-run True Succeeded 22h 22h
</pre>
```
The value `True` under `SUCCEEDED` confirms that TaskRun completed with no errors.
1. Take a look at the logs:
```
```bash
kubectl logs --selector=tekton.dev/taskRun=hello-task-run
```
......@@ -187,20 +187,33 @@ running in its own container.
## Cleanup
If you want to continue and create a pipeline, do not delete your cluster and
proceed to the [next tutorial](/docs/getting-started/pipelines/).
To learn about Tekton Pipelines, skip this section and proceed to the [next
tutorial][pipelines-qs].
To delete the cluster that you created for this quickstart run:
To delete the cluster that you created for this guide run:
```bash
minikube delete
```
The output confirms that your cluster was deleted:
The output confirms that the cluster was deleted:
<pre>
```
🔥 Deleting "minikube" in docker ...
🔥 Deleting container "minikube" ...
🔥 Removing /home/user/.minikube/machines/minikube ...
💀 Removed all traces of the "minikube" cluster.
</pre>
```
## Further Reading:
We recommend that you complete [Getting started with Pipelines][pipelines-qs].
For more complex examples see:
- [Clone a git repository with Tekton][git-howto].
- [Build and push a container image with Tekton][kaniko-howto].
[pipelines-qs]: /docs/getting-started/pipelines/
[git-howto]: /docs/how-to-guides/clone-repository/
[kaniko-howto]: /docs/how-to-guides/kaniko-build-push/
<!--
---
title: "Getting Started with Triggers"
linkTitle: "Getting Started with Triggers"
weight: 3
description: >
Create and run your first Tekton Trigger.
---
-->
This tutorial shows you how to
+ Install Tekton Triggers.
+ Create a TriggerTemplate.
+ Create a TriggerBind.
+ Create an EventListener.
This guide uses a local cluster with [minikube][].
## Before you begin
1. Complete the two previous Getting Started tutorials: [Tasks][gs-tasks] and
[Pipelines][gs-pipelines]. *Do not clean up your resources*, skip the last
section.
1. Install [curl][] if it's not already available on your system.
## Overview
You can use Tekton Triggers to modify the behavior of your CI/CD Pipelines
depending on external events. The basic implementation you are going to create
in this guide comprises three main components:
1. An `EventListener` object that listens to the world waiting for "something"
to happen.
1. A `TriggerTemplate` object, which configures a PipelineRun when this
event occurs.
1. A `TriggerBinding` object, that passes the data to the PipelineRun created
by the `TriggerTemplate` object.
![Triggers flow diagram](/images/TriggerFlow.svg)
An optional `ClusterInterceptor` object can be added to validate and process
event data.
You are going to create a Tekton Trigger to run the `hello-goodbye` Pipeline
when the EventListener detects an event.
## Install Tekton Triggers
1. Use `kubectl` to install Tekton Triggers:
```bash
kubectl apply --filename \
https://storage.googleapis.com/tekton-releases/triggers/latest/release.yaml
kubectl apply --filename \
https://storage.googleapis.com/tekton-releases/triggers/latest/interceptors.yaml
```
1. Monitor the installation:
```bash
kubectl get pods --namespace tekton-pipelines --watch
```
When `tekton-triggers-controller`, `tekton-triggers-webhook`, and
`tekton-triggers-core-controller` show `1/1` under the `READY` column, you
are ready to continue. For example:
```
NAME READY STATUS RESTARTS AGE
tekton-pipelines-controller-68b8d87687-8mzvt 1/1 Running 2 (4d13h ago) 4d19h
tekton-pipelines-webhook-6fb6dd6d75-7jfz6 1/1 Running 2 (104s ago) 4d19h
tekton-triggers-controller-74b654c6bc-24ds7 1/1 Running 2 (104s ago) 4d19h
tekton-triggers-core-interceptors-79f4dbb969-sk2dk 1/1 Running 3 (104s ago) 4d19h
tekton-triggers-webhook-56885c9875-nx499 1/1 Running 2 (104s ago) 4d19h
```
Hit *Ctrl + C* to stop monitoring.
## Create a TriggerTemplate
A TriggerTemplate defines what happens when an event is detected.
1. Create a new file named `trigger-template.yaml` and add the following:
```yaml
apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerTemplate
metadata:
name: hello-template
spec:
params:
- name: username
default: "Kubernetes"
resourcetemplates:
- apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
generateName: hello-goodbye-run-
spec:
pipelineRef:
name: hello-goodbye
params:
- name: username
value: $(tt.params.username)
```
The `PipelineRun` object that you created in the previous tutorial is now
included in the template declaration. This trigger expects the `username`
parameter to be available; if it's not, it assigns a default value:
"Kubernetes".
1. Apply the TriggerTemplate to your cluster:
```bash
kubectl apply -f trigger-template.yaml
```
## Create a TriggerBinding
A TriggerBinding that executes the TriggerTemplate, the same way you had to
create a PipelineRun to execute the Pipeline.
1. Create a file named `trigger-binding.yaml` with the following content:
```yaml
apiVersion: triggers.tekton.dev/v1beta1
kind: TriggerBinding
metadata:
name: hello-binding
spec:
params:
- name: username
value: $(body.username)
```
This TriggerBinding gets some information and saves it in the `username`
variable.
1. Apply the TriggerBinding:
```bash
kubectl apply -f trigger-binding.yaml
```
## Create an EventListener
The `EventListener` object encompasses both the TriggerTemplate and the
TriggerBinding.
1. Create a file named `event-listener.yaml` and add the following:
```yaml
apiVersion: triggers.tekton.dev/v1beta1
kind: EventListener
metadata:
name: hello-listener
spec:
serviceAccountName: tekton-robot
triggers:
- name: hello-trigger
bindings:
- ref: hello-binding
template:
ref: hello-template
```
This declares that when an event is detected, it will run the TriggerBinding
and the TriggerTemplate.
1. The EventListener requires a service account to run. To create the service
account for this example create a file named `rbac.yaml` and add the
following:
```yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: tekton-robot
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: triggers-example-eventlistener-binding
subjects:
- kind: ServiceAccount
name: tekton-robot
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: tekton-triggers-eventlistener-roles
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: triggers-example-eventlistener-clusterbinding
subjects:
- kind: ServiceAccount
name: tekton-robot
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: tekton-triggers-eventlistener-clusterroles
```
This service account allows the EventListener to create PipelineRuns.
1. Apply the file to your cluster:
```bash
kubectl apply -f rbac.yaml
```
## Running the Trigger
You have everything you need to run this Trigger and start listening for events.
1. Create the EventListener:
```bash
kubectl apply -f event-listener.yaml
```
1. To communicate outside the cluster, enable port-forwarding:
```bash
kubectl port-forward service/el-hello-listener 8080
```
The output confirms that port-forwarding is working:
```
kubectl port-forward service/el-hello-listener 8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
```
Keep this service running, don't close the terminal.
## Monitor the Trigger
Now that the EventListener is running, you can send an event and see what
happens:
1. Open a new terminal and submit a payload to the cluster:
```bash
curl -v \
-H 'content-Type: application/json' \
-d '{"username": "Tekton"}' \
http://localhost:8080
```
You can change "Tekton" for any string you want. This value will be
ultimately read by the `goodbye-world` Task.
The response is successful:
```
< HTTP/1.1 202 Accepted
< Content-Type: application/json
< Date: Fri, 30 Sep 2022 00:11:19 GMT
< Content-Length: 164
<
{"eventListener":"hello-listener","namespace":"default","eventListenerUID":"35dd0858-3692-4bb5-8c4f-1bf6d705bb73","eventID":"1a0a1120-7833-4078-9f30-0e3688f27dde"}
* Connection #0 to host localhost left intact
```
1. This event triggers a PipelineRun, check the PipelineRuns on your
cluster :
```bash
kubectl get pipelineruns
```
The output confirms the pipeline is working:
```
NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME
hello-goodbye-run True Succeeded 24m 24m
hello-goodbye-run-8hckl True Succeeded 81s 72s
```
You see two PipelineRuns, the first one created in the previous guide,
the last one was created by the Trigger.
1. Check the PipelineRun logs. The name is auto-generated adding a suffix
for every run, in this case it's `hello-goodbye-run-8hckl`. Use your own
PiepelineRun name in the following command to see the logs:
```bash
tkn pipelinerun logs <my-pipeline-run> -f
```
And you get the expected output:
```
[hello : echo] Hello World
[goodbye : goodbye] Goodbye Tekton!
```
Both Tasks completed successfuly. Congratulations!
## Clean up
1. Press *Ctrl + C* in the terminal running the port-forwarding process to stop
it.
1. Delete the cluster:
```bash
minikube delete
```
The output confirms that the cluster was deleted:
```
🔥 Deleting "minikube" in docker ...
🔥 Deleting container "minikube" ...
🔥 Removing /home/user/.minikube/machines/minikube ...
💀 Removed all traces of the "minikube" cluster.
```
## Further reading
For more complex Pipelines examples check:
- [Clone a git repository with Tekton][git-howto].
- [Build and push a container image with Tekton][kaniko-howto].
You can find more Tekton Triggers examples on the [Triggers GitHub
repository][triggers-repo].
[gs-tasks]: /docs/getting-started/tasks/
[gs-pipelines]: /docs/getting-started/pipelines/
[curl]: https://curl.se/download.html
[minikube]: https://minikube.sigs.k8s.io/docs/start/
[triggers-repo]: https://github.com/tektoncd/triggers/tree/main/examples
[git-howto]: /docs/how-to-guides/clone-repository/
[kaniko-howto]: /docs/how-to-guides/kaniko-build-push/
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="820px" height="371px" viewBox="-0.5 -0.5 820 371" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2021-07-30T09:38:31.137Z&quot; agent=&quot;5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.115 Safari/537.36&quot; etag=&quot;w3wdbom-AKFeXZTA44He&quot; version=&quot;14.9.3&quot; type=&quot;device&quot;&gt;&lt;diagram id=&quot;1JT2M-Jt1clKP8wq24Cd&quot; name=&quot;Page-1&quot;&gt;3Vlbd5s4EP41fkwOV18ebcd1etI98TY5bfOogAzayMgr5Av99ZVAXATCJTVONpuHHGY0CGm++WZG8sCeb45LCrbhX8SHeGAZ/nFg3wwsazwc8/9CkWQKZzzMFAFFfqYyS8UD+gml0pDaHfJhrBgyQjBDW1XpkSiCHlN0gFJyUM3WBKtf3YIANhQPHsBN7Xfks1BuyzVK/S1EQZh/2TTkyDPwXgJKdpH83sCy1+lfNrwB+VzSPg6BTw4Vlb0Y2HNKCMueNsc5xMK1uduy9z61jBbrpjBiXV5wbvfrUTC5j/azz3erZHs3dZdXpisXx5LcIdDn/pEioSwkAYkAXpTaWbppKKY1uFTafCFky5UmV/4DGUsk2GDHCFeFbIPlKDwi9qPy/CSmunaldHOUM6dCIoXmdqUHYrKjnlz7w52b/P01eaQ3S7BPZnt0M726knZiX5UXpZOWkGwgowk3oBADhvZqXAAZXkFhV7y6IogvxTIKJkigJRGssaFOwQANIJNvlUDxh8oySlUKnx7KU9vcA7yDeUTWoFWBO4SIwYctSJ134ORWQWp1+B5SBo8nXZmP1lxiTmS4HUqmuSNpE1ZZNjLa3a847rVeshpeeqQoCCBtOIvvkakeiRklL3BOMKFcE5FIkGGNMK6pAEZBxEWPe45PbM+ExxBPOVM5sEG+nzJJB4EK0ppE7BPYICxc+A1SH0RAqnOSmrmc0c0c9QOeY9biOZcr4E002FmXgm78Lqkq4kv/kSckIVSSlRDLbJVKSQfcJE7uWVlNMilLKifshn1nv7MwdNvoN0ORj6LgvJTV0ekqec5nilXP/G6TKaarocrwUlQZamrBEIt09swfAvEg/f4IN1sOPMzH+ecKkzcBowf/u/VMpfO/rsxczP+Thv9XgAI+N6TxByw0Ei77AtxxnBp2kyZ2zltWmTyWNNwRexfQ5WeY4b870bzPzPKxpE5BtwrUuZWY6CqbZsoNzNH22Jxisede/YJiBiPRnRgr4utJWuiy9bVw98NEWU9JwaolhaIXfbfAaraeKcQfF6lL5AO3lg5G741ah1Jazw+/5but4/ucwrQOG4/whZGIP3yFWRcYt3K8Q83+UNHUQwCN6gXF1jQDpiaE7B5CSH/HYjRAedODy7VpOOrhZTIpFC3Hl1RaQYrSnmXwiiuY5XJyHxvxBt/fzb2nhbE+RLf5qfu3h5Xer2q6Andq1e2dwBp4KtHzyK6Qu0M6cHXpoJFl5njHewH6WZDRg1vGqXpGO/CqVt4HcZja9nUvZKscdTS12RxfqGHXQt1s2M9N6p2CowXqFSU86xdp/5kWAyDBBPwP+sC+I8qqZX3HeLu+QZv0mxcdzSIQ+VPxA4ZwKQZxjLzBe96SWx1zb/XuVuPRXHfmbbpptQCaT5FtqHGb3pzIHav9wOWu5bWBMO4hEMpSbhX3jk9K3W6p4jKCjGvDGlaiyDwZQ0L4o9J/qqRXS/+pYvtfCb+Rq0SNXf9Bomv4ObUDje32FX5cLH88zMzLH2jtxS8=&lt;/diagram&gt;&lt;/mxfile&gt;" style="background-color: rgb(255, 255, 255);"><defs/><g><path d="M 681 130 L 804.63 130" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 809.88 130 L 802.88 133.5 L 804.63 130 L 802.88 126.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="111" y="45" width="570" height="170" fill="#ffffff" stroke="#000000" pointer-events="all"/><rect x="361" y="60" width="90" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 70px; margin-left: 362px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 17px; font-family: Verdana; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Trigger</div></div></div></foreignObject><text x="406" y="75" fill="#000000" font-family="Verdana" font-size="17px" text-anchor="middle" font-weight="bold">Trigger</text></switch></g><path d="M 361 130 L 454.63 130" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 459.88 130 L 452.88 133.5 L 454.63 130 L 452.88 126.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="211" y="100" width="150" height="60" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 130px; margin-left: 212px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 15px; font-family: Verdana; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">TriggerBinding</div></div></div></foreignObject><text x="286" y="135" fill="#000000" font-family="Verdana" font-size="15px" text-anchor="middle" font-weight="bold">TriggerBinding</text></switch></g><rect x="461" y="100" width="170" height="60" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 168px; height: 1px; padding-top: 130px; margin-left: 462px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 15px; font-family: Verdana; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>TriggerTemplate</b></div></div></div></foreignObject><text x="546" y="135" fill="#000000" font-family="Verdana" font-size="15px" text-anchor="middle">TriggerTemplate</text></switch></g><rect x="391" y="140" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 150px; margin-left: 392px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 13px; font-family: Verdana; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Parameters</div></div></div></foreignObject><text x="411" y="154" fill="#000000" font-family="Verdana" font-size="13px" text-anchor="middle" font-weight="bold">Parame...</text></switch></g><rect x="161" y="10" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 20px; margin-left: 162px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 15px; font-family: Verdana; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><font size="1"><b style="font-size: 17px">EventListener Pod</b></font></div></div></div></foreignObject><text x="181" y="25" fill="#000000" font-family="Verdana" font-size="15px" text-anchor="middle">Event...</text></switch></g><rect x="1" y="120" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 130px; margin-left: 2px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 13px; font-family: Verdana; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Event</div></div></div></foreignObject><text x="21" y="134" fill="#000000" font-family="Verdana" font-size="13px" text-anchor="middle" font-weight="bold">Event</text></switch></g><rect x="691" y="80" width="110" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 95px; margin-left: 692px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 13px; font-family: Verdana; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b><font style="font-size: 13px">Create Tekton Resources</font></b></div></div></div></foreignObject><text x="746" y="99" fill="#000000" font-family="Verdana" font-size="13px" text-anchor="middle">Create Tekton Res...</text></switch></g><path d="M 171 310 L 171 262.5 L 170.37 220.35" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 170.3 215.1 L 173.9 222.05 L 170.37 220.35 L 166.9 222.15 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="81" y="310" width="180" height="60" fill="#ffffff" stroke="#000000" stroke-dasharray="3 3" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 178px; height: 1px; padding-top: 340px; margin-left: 82px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><font face="Verdana" style="font-size: 15px"><b>ClusterInterceptor</b></font></div></div></div></foreignObject><text x="171" y="344" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">ClusterInterceptor</text></switch></g><rect x="191" y="250" width="40" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 260px; margin-left: 192px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><font style="font-size: 13px" face="Verdana"><b>Process<br />Payload</b></font></div></div></div></foreignObject><text x="211" y="264" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Proces...</text></switch></g><path d="M 41 130 L 102.63 130" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 107.88 130 L 100.88 133.5 L 102.63 130 L 100.88 126.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 125.82 215 L 125.99 303.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 126 308.88 L 122.48 301.89 L 125.99 303.63 L 129.48 301.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text></a></switch></svg>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册