Un bot IRC à la CIA en python
Quand vous utilisez git à plusieurs et qu'en plus vous utilisez IRC pour en discuter, il peut être agréable d'avoir un bot qui informe le canal des commit sur le serveur. En particulier pour éviter des merge branch à tout va si on oublie de pull avant de commit. Il y a un service sur le net qui propose de tels bots IRC, c'est CIA.vc. Sauf que le service est à des fins de statistiques sur les logiciels libres et j'aime pas trop que ces données sortent du serveur même si elles sont publiques, puis leur bot on sait pas trop ce qu'il fait.
Donc je me suis mis à coder ce petit bot en python qui se connecte sur le canal IRC et attend des ordre via xmlrpc, cet ordre est lancé à chaque commit via un hooks sur le serveur git.
Pour ça, tout est dans la librairie python standard, sauf irclib et gitpython.
Le serveur (j'ai enlevé toutes les fonctionnalités qui ne rentrent pas dans le cadre de ce billet) :
#!/usr/bin/env python import threading import irclib chan = '#staff' nick = 'napalm0' server = ('irc.philpep.org', 6667) xmlrpcserver = ('localhost', 8888) class PbotIRCClient(irclib.SimpleIRCClient): def on_welcome(self, s, e): s.join(chan) # Classe de contrôle du bot par xmlrpc class PbotControl: def commit(self, name, files, summary, base, id): # On formate la chaine de commit (Projet: Commiter (fichiers_touchés) sommaire_du_commit str = '%s: %s (\x0323%s\x03) %s' % (base, name, files, summary) pbot.connection.privmsg(chan, str) # Et un lien vers le commit diff pbot.connection.privmsg(chan, 'http://git.philpep.org/'+base+'.git/commit/?id='+id) # Le serveur xmlrpc class PbotXMLRPCServer(threading.Thread): def run(self): obj = PbotControl() srv = SimpleXMLRPCServer(xmlrpcserver, allow_none=True) srv.register_instance(obj) srv.serve_forever() if __name__ == '__main__': pbot = PbotIRCClient() pbot.connect(server[0], server[1], nick) t = PbotXMLRPCServer() t.start() pbot.start()
Et le hooks à mettre dans le bare repo hooks/post-commit :
#!/usr/bin/env python from sys import argv from git import Repo from xmlrpclib import ServerProxy # Path vers le bare repo (peut être avec '.' ça marche aussi ?) r = Repo('/usr/home/git/repositories/pblog2.git') c = r.commit(argv[1]) s = ServerProxy('http://localhost:8888', allow_none=True) # Liste des fichiers touchés par le commit try: file = ' '.join([e.a_blob.path for e in c.diff(r, c.parents[0])]) except: file = '' # Appel de la méthode xmlrpc s.commit(c.author.name, file, c.summary, 'pblog2', argv[1])
Voilà, en quelques lignes de python vous avez un bot sympa et vous savez comment il fonctionne laissez parler votre imagination pour l'améliorer.







0