mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-26 21:30:55 +08:00
153 lines
5.3 KiB
Markdown
153 lines
5.3 KiB
Markdown
[#]: subject: "Create conditional pipelines with CEL"
|
||
[#]: via: "https://opensource.com/article/22/7/conditional-tekton-pipelines-cel"
|
||
[#]: author: "Camilla Conte https://opensource.com/users/spotlesstofu"
|
||
[#]: collector: "lkxed"
|
||
[#]: translator: " "
|
||
[#]: reviewer: " "
|
||
[#]: publisher: " "
|
||
[#]: url: " "
|
||
|
||
Create conditional pipelines with CEL
|
||
======
|
||
Control when automated builds happen in Tekton with CEL.
|
||
|
||
![Plumbing tubes in many directions][1]
|
||
|
||
You just followed a guide to start your Tekton pipeline (or task) when a merge request is created or updated on your GitLab project. So you configured GitLab to send merge request **events** as **webhooks**. And you deployed some **Tekton** components:
|
||
|
||
* EventListener: receives webhooks from GitLab
|
||
* Trigger: starts your Pipeline every time the EventListener receives a new webhook from GitLab
|
||
* Pipeline: fetches the source code from GitLab and builds it
|
||
|
||
Then you notice that any event in your merge request (a new comment, a tag change) triggers the pipeline. That's not the behavior you desire. You don't need to build a comment or a tag, after all. You only want the pipeline to run when there is actual new code to build. Here's how I use Tekton's CEL Interceptor to create conditionals for my pipelines.
|
||
|
||
### Have your trigger ready
|
||
|
||
I expect you have a trigger already defined. It's probably something similar to the snippet below.
|
||
|
||
The trigger's interceptor rejects anything that's not coming from a merge request. Still, the interceptor is not able to differentiate between code and non-code updates (like new comments).
|
||
|
||
```
|
||
apiVersion: triggers.tekton.dev/v1beta1
|
||
kind: Trigger
|
||
metadata:
|
||
name: webhook-listener-trigger
|
||
spec:
|
||
interceptors:
|
||
# reject any payload that's not a merge request webhook
|
||
- name: "filter-event-types"
|
||
ref:
|
||
name: "gitlab"
|
||
kind: ClusterInterceptor
|
||
params:
|
||
- name: eventTypes
|
||
value:
|
||
- "Merge Request Hook"
|
||
bindings:
|
||
- ref: binding
|
||
template:
|
||
ref: template
|
||
```
|
||
|
||
### Add a CEL interceptor
|
||
|
||
Here comes the `cel` interceptor. This interceptor filters the webhook payload using the CEL expression language. If the filter expression evaluates to `true`, the pipeline starts.
|
||
|
||
Here I'm checking for the `object_attributes.oldrev` field to exist in the JSON body of the webhook payload. If `object_attributes.oldrev` exists, then that means this event is about a code change. If there wasn't a code change, there's no previous revision (`oldrev` ) to refer to.
|
||
|
||
```
|
||
spec:
|
||
interceptors:
|
||
- name: "allow-code-changes-only"
|
||
ref:
|
||
name: cel
|
||
kind: ClusterInterceptor
|
||
params:
|
||
- name: filter
|
||
value: >
|
||
has(body.object_attributes.oldrev)
|
||
```
|
||
|
||
Add the new interceptor to your trigger. Now your trigger looks like this:
|
||
|
||
```
|
||
apiVersion: triggers.tekton.dev/v1beta1
|
||
kind: Trigger
|
||
metadata:
|
||
name: gitlab-listener-trigger
|
||
spec:
|
||
interceptors:
|
||
- name: "verify-gitlab-payload"
|
||
ref:
|
||
name: "gitlab"
|
||
kind: ClusterInterceptor
|
||
params:
|
||
- name: eventTypes
|
||
value:
|
||
- "Merge Request Hook"
|
||
- name: "allow-code-changes-only"
|
||
ref:
|
||
name: "cel"
|
||
kind: ClusterInterceptor
|
||
params:
|
||
- name: filter
|
||
value: >
|
||
has(body.object_attributes.oldrev)
|
||
bindings:
|
||
- ref: binding
|
||
template:
|
||
ref: template
|
||
```
|
||
|
||
Deploy this new version of the trigger and enjoy the powers of automation. From now on, your pipeline only starts if there is some new code to build.
|
||
|
||
### Tips
|
||
|
||
There are no limits to the conditions you can set in a CEL filter.
|
||
|
||
You may check that the merge request is currently open:
|
||
|
||
```
|
||
body.object_attributes.state in ['opened']
|
||
```
|
||
|
||
You can make sure the contributor finished their work on the code:
|
||
|
||
```
|
||
body.object_attributes.work_in_progress == false
|
||
```
|
||
|
||
You just have to concatenate multiple conditions correctly:
|
||
|
||
```
|
||
- name: filter
|
||
value: >
|
||
has(body.object_attributes.oldrev) &&
|
||
body.object_attributes.state in ['opened'] &&
|
||
body.object_attributes.work_in_progress == false
|
||
```
|
||
|
||
Check out the [merge request events][2] documentation to get inspired to write your own conditions.
|
||
|
||
You may need the [CEL language definition][3] to know how to translate your thoughts into code.
|
||
|
||
To evaluate types other than strings, you want to know the [mapping between JSON and CEL][4] types.
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
via: https://opensource.com/article/22/7/conditional-tekton-pipelines-cel
|
||
|
||
作者:[Camilla Conte][a]
|
||
选题:[lkxed][b]
|
||
译者:[译者ID](https://github.com/译者ID)
|
||
校对:[校对者ID](https://github.com/校对者ID)
|
||
|
||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||
|
||
[a]: https://opensource.com/users/spotlesstofu
|
||
[b]: https://github.com/lkxed
|
||
[1]: https://opensource.com/sites/default/files/lead-images/plumbing_pipes_tutorial_how_behind_scenes.png
|
||
[2]: https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#merge-request-events
|
||
[3]: https://github.com/google/cel-spec/blob/master/doc/langdef.md
|
||
[4]: https://github.com/google/cel-spec/blob/master/doc/langdef.md#json-data-conversion
|