A TriggerBinding
is a resource that specifies the fields in the event payload from which you want to extract data as well as the fields in your
corresponding TriggerTemplate
to populate with the extracted values. In other words, it binds payload fields to
fields in the [TriggerTemplate
] and for this to work the fields specified in the [TriggerBinding
] And the corresponding [TriggerTemplate
]
must match. You can then use the populated fields in your [TriggerTemplate
] to populate fields in the [TaskRun
] or [PipelineRun
] associated
with that [TriggerTemplate
]. Tekton also supports a cluster-scoped version called a ClusterTriggerBinding
to encourage reusability across your
entire cluster.
Below is an example TriggerBinding
definition:
apiVersion: triggers.tekton.dev/v1alpha1
kind: TriggerBinding
metadata:
name: pipeline-binding
spec:
params:
- name: gitrevision
value: $(body.head_commit.id)
- name: gitrepositoryurl
value: $(body.repository.url)
- name: contenttype
value: $(header.Content-Type)
A ClusterTriggerBinding
is a cluster-scoped TriggerBinding
that you can reuse across your entire cluster.
You can reference a ClusterTriggerBinding
in any EventListener
in any namespace. You can specify multiple
ClusterTriggerBindings
within your Trigger
as well as specify the same ClusterTriggerBinding
in multiple
Triggers
.
Below is an example ClusterTriggerBinding
definition:
apiVersion: triggers.tekton.dev/v1alpha1
kind: ClusterTriggerBinding
metadata:
name: pipeline-clusterbinding
spec:
params:
- name: gitrevision
value: $(body.head_commit.id)
- name: gitrepositoryurl
value: $(body.repository.url)
- name: contenttype
value: $(header.Content-Type)
When referencing a ClusterTriggerBinding
, you must specify a kind
value within the bindings
field.
The default is TriggerBinding
which denotes a namespaced TriggerBinding
. For example:
---
apiVersion: triggers.tekton.dev/v1alpha1
kind: EventListener
metadata:
name: listener-clustertriggerbinding
spec:
serviceAccountName: tekton-triggers-example-sa
triggers:
- name: foo-trig
bindings:
- ref: pipeline-clusterbinding
kind: ClusterTriggerBinding
- ref: message-clusterbinding
kind: ClusterTriggerBinding
template:
ref: pipeline-template
A TriggerBinding
allows you to specify parameters (params
) that Tekton passes to the corresponding TriggerTemplate
.
For each parameter, you must specify a name
and a value
field with the appropriate values.
Tekton can use a TriggerBinding
to access data in the headers and body of an HTTP JSON payload. To do so, it uses
JSONPath expressions encapsulated within a $()
wrapper. Keys in HTTP JSON headers are case-sensitive.
For example, below is a valid expression:
$(body.key1)
$(.body.key)
On the other hand, the expressions below are invalid:
.body.key1 # INVALID - Expression is not wrapped in `$()`.
$({body) # INVALID - Trailing curly brace is missing.
If a $()
wrapper is embedded inside another $()
wrapper, Tekton parses the contents of the innermost wrapper
as the JSONPath expression. For example:
$($(body.b)) # Parsed as $(body.b)
$($($(body.b))) # Parsed as $(body.b)
To access a JSON key that contains a period (.
), you must escape the period with a backslash (\.
). For example:
# Body contains a `tekton.dev` field: {"body": {"tekton.dev": "triggers"}}
$(body.tekton\.dev) -> "triggers"
If Tekton fails to resolve the JSONPath expressions you have configured against the HTTP JSON payload, it
falls back to the default
value in the corresponding TriggerTemplate
, if specified.
Below are some examples of Tekton performing field binding based on the most commonly used field definitions:
`$(body)` -> replaced by the entire body
$(body) -> "{"key1": "value1", "key2": {"key3": "value3"}, "key4": ["value4", "value5", "value6"]}"
$(body.key1) -> "value1"
$(body.key2) -> "{"key3": "value3"}"
$(body.key2.key3) -> "value3"
$(body.key4[0]) -> "value4"
$(body.key4[0:2]) -> "{"value4", "value5"}"
# $(header) -> replaced by all headers from the event
$(header) -> "{"One":["one"], "Two":["one","two","three"]}"
$(header.One) -> "one"
$(header.one) -> "one"
$(header.Two) -> "one two three"
$(header.Two[1]) -> "two"
You can specify multiple bindings within the Trigger
definition in your EventListener
.
This allows you to reuse as well as mix-and-match your bindings across multiple Trigger
definitions. For
example, you can create a Trigger
with a binding that extracts event data and another binding that provides
information on the deployment environment:
apiVersion: triggers.tekton.dev/v1alpha1
kind: TriggerBinding
metadata:
name: event-binding
spec:
params:
- name: gitrevision
value: $(body.head_commit.id)
- name: gitrepositoryurl
value: $(body.repository.url)
---
apiVersion: triggers.tekton.dev/v1alpha1
kind: TriggerBinding
metadata:
name: prod-env
spec:
params:
- name: environment
value: prod
---
apiVersion: triggers.tekton.dev/v1alpha1
kind: TriggerBinding
metadata:
name: staging-env
spec:
params:
- name: environment
value: staging
---
apiVersion: triggers.tekton.dev/v1alpha1
kind: EventListener
metadata:
name: listener
spec:
triggers:
- name: prod-trigger
bindings:
- ref: event-binding
- ref: prod-env
template:
ref: pipeline-template
- name: staging-trigger
bindings:
- ref: event-binding
- ref: staging-env
template:
ref: pipeline-template
You can use the binding-eval
tool to evaluate your TriggerBinding
against a specific HTTP request
to determine the parameters that Tekton generates from that request when your corresponding Trigger
executes.
To install the binding-eval
tool use the following command:
$ go get -u github.com/tektoncd/triggers/cmd/binding-eval
Below is an example of using the tool to evaluate a TriggerBinding
:
$ cat testdata/triggerbinding.yaml
apiVersion: tekton.dev/v1alpha1
kind: TriggerBinding
metadata:
name: pipeline-binding
spec:
params:
- name: foo
value: $(body.test)
- name: bar
value: $(header.X-Header)
$ cat testdata/http.txt
POST /foo HTTP/1.1
Content-Length: 16
Content-Type: application/json
X-Header: tacocat
{"test": "body"}
$ binding-eval -b testdata/triggerbinding.yaml -r testdata/http.txt
[
{
"name": "foo",
"value": "body"
},
{
"name": "bar",
"value": "tacocat"
}
]