Web hooks Gitlab/Github
Github et Gitlab possèdent un système de web hooks normalement compatible. Cependant, en migrant le dépôt de drunkenbytes de Github à Gitlab, mon script de déploiement automatique utilisant sur les web hooks ne fonctionnais plus.
Après investigation, si effectivement les deux délivrent un JSON similaire en POST, il ne le délivre pas exactement de la même façon.
Github envoie quelque chose comme :
payload=%7B%22ref%22%3A%22refs%2Fheads%2Fmaste....
et Gitlab :
{"before":"c3c94f872e93619a3a0d74c10404bd562901b4f3...
En bref, Github envoie un JSON échappé qu’on peut, typiquement, récupérer dans u ne variable payload. Tandis que, Gitlab envoie directement le JSON non échappé.
Là selon le framework/langage/truc obscur que vous utilisez, ça se complique. Le plus simple alors est de récupérer l’entrée brute, identifier le format et appl iquer le traitement approprié.
Ce qui donne avec Flask :
# on suppose que l'on est dans une méthode routé par quelque chose comme :
# @app.route('/api/1/update', methods = ['POST'])
#
github_id = 'payload='
# note, c'est un flux donc la lecture est destructive
raw = request.stream.read()
json_str = raw
is_github = raw.startswith(github_id_str)
if is_github :
# on extrait la sous-chaine correspondante
# au payload quoted et on l'unquote
json_str = urllib2.unquote(raw[len(github_id_str):])
payload = json.loads(json_str)
# ....