Introduction

WebHooks are HTTP callbacks that are triggered by events. In case of GitLab these can be events like pushing some code, or creating an issue, or pushing some comments.

In this quick post I will explain how to add a WebHook to a project and how to execute some external code when a Gitlab event is triggered.

VM preparation

Do not forget to open the firewall port for TCP protocol, on 8200 port must be opened.

[root@wb ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: dhcpv6-client http ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[root@wb ~]# firewall-cmd --zone=public --add-port=8200/tcp
success

[root@wb ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: dhcpv6-client http ssh
  ports: 8200/tcp
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
  

Python code

An easy way is to use Flask, to retrieve the HTTP frame.

# app.py 
from flask import Flask, request, abort
import json

app = Flask(__name__)

@app.route('/my_webhook', methods=['POST'])
def my_webhook():
    if request.method == 'POST':
        print(json.dumps(request.json, indent=2))
        return 'success', 200
    else:
        abort(400)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8200, debug=True)
  • The Flask will launch a http server which is listen on all interfaces (0.0.0.0) en on port 8200
  • The path to be used in the HTTP POST call is my_webhook
  • Also I used the debug mode to get the most traces.
  • The Flask application is waiting a POST request (line 10). And answer success. if the POST request is received.
  • Otherwise, return 400 HTTP code.

Start the Flask application

(venv) [opc@wb ~]$ python app.py
 * Serving Flask app 'app' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on all addresses.
   WARNING: This is a development server. Do not use it in a production deployment.
 * Running on http://172.168.0.40:8200/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 295-390-357


Define the GitLab WebHook

You must have the role maitainer on your project, in order to define WebHooks

Select Settings -> WebHooks from the left GitLab Menu

Once the WebHook was saved it can be tested by pressing the Test button. I choose to test a Push event which is triggered at each push is issued from Git.

On the VM terminal we get the json trace of the POST request:

..........
* Debugger is active!
* Debugger PIN: 295-390-357
{
  "object_kind": "push",     =====> Event type PUSH 
  "event_name": "push",
  "before": "6aa30335b09*****53183fb28bb84aada5cf",
  "after": "a48e187ef217a******62498378e5023d355",
  "ref": "refs/heads/main",
  "checkout_sha": "a48e187ef21********9490562498378e5023d355",
  "message": null,
  "user_id": 1177**25,
  "user_name": "your username ",
  "user_username": "your.username",
  "user_email": "",
  "user_avatar": "https://gitlab.com/uploads/-/system/user/avatar/****/avatar.png",
  "project_id": 3887**93,
  "project": {
    "id": 38878**3,
    .....

Conclusion

The use of WebHooks from GitLab to run external code represents another facility in DevOps tools.

Their implementation is easy and immediate. An typical example of use case is the integration with Ansible Automation Controller, to run Ansible jobs.

References

https://docs.gitlab.com/ee/user/project/integrations/webhooks.html


Share on