Whippet (Pronounced: [ˈwɪpɪt]) provides an easy way to intercept, manage, manipulate and re-send a webhook/API call to any Rest API or incoming webhook service (like JIRA).
Some services/platforms don't provide an easy-to-use integration vehicle for transforming and syncing requests, payloads and automation e.g. Gitlab -> Jira. Instead of paying for an expensive third-party service to provide integrations you can do this easily yourself on-premise.
Wppt leverages Flask dynamic routing. The endpoint is variable and defined via one or multiple yaml files.
Based on the endpoint url, wppt parses all the yaml files stored on the transformers directory, and retrieves the outgoing webhook url and it's translations. It then parses all the translations and converts the existing data from the incoming webhook into a new payload structure as defined on the yaml.
sequenceDiagram
Gitlab Outgoing Webhook->>wppt: Original Payload
wppt->>Jira Webhook Listener: Transformed Payload
The corresponding endpoint as defined on the transformer yaml
# example.yaml
gitlab2jira:
enabled: true
target_webhook: https://example.com/rest/cb-automation/latest/hooks/{JIRA_WEBHOOK_ID}
translations:
data:
name: '[{payload[project][name]}][{payload[object_kind]}] {payload[object_attributes][title]}'
description: 'Description: {payload[object_attributes][description]}\nURL:{payload[object_attributes][url]}'Given the following incoming webhook payload to the yaml defined endpoint http://{FQDN}:5005/gitlab2jira/:
# Incoming Payload
{
"project":{"name":"landing"},
"object_kind":"story",
"object_attributes":{
"title": "Issue with",
"description":"Short description here",
"url": "http://site.here"
}
}wppt will then send a POST request to the target_webhook defined on the yaml with the following payload:
# Transformed Payload
{
"data": {
"name": "[landing][story] Issue with",
"description": "Description: Short description here\\nURL:http://site.here"
}
}Note
The structure of the transformed payload is based on the structure defined on the childs of the yaml translations node.
If the translations node is left blank, the payload is forwarded untouched.
The target_webhook variable can contain multiple URLs separated by |.
E.g.: target_webhook: http://jira.com/webhook|http://slack.com/webhook
sequenceDiagram
Gitlab Outgoing Webhook->>wppt: Original Payload
wppt->>Jira Webhook Listener: Transformed Payload
wppt->>Slack Webhook Listener: Transformed Payload
- Python 3.11+
- Poetry
- Flask
- requests
- PyYAML
Install it directly into a poetry virtual environment:
$ git clone https://github.com/redhat-performance/wppt
$ cd wppt
$ make installAfter installation, the server can be started with:
$ make run$ cd container
$ podman build -t wppt .$ podman run -it --rm -v ../wppt/transformers:/opt/wppt/transformers -p 5005:5005 wppt