SVN hook pour IRC avec ii
Par Gliss le lundi, janvier 5 2009, 12:52 - Tech & Geek - Lien permanent
L’idée est venue à la lecture d’un document de Thomas Petazzoni sur le contrôle de version et plus particulièrement SVN rédigé pour une de ses interventions[1]. À la fin de celui-ci, un graphe évoque les interactions possibles avec les autres composantes du monde du développement et d’Internet, et entre autres … IRC ! Bon sang mais c’est bien sûr ! Et si plutôt que d’encombrer nos boites mails lorsque l’on sait qu’un dépôt aura une activité importante et qu’on ne prendrai pas le temps de lire les messages et les commit-logs, et si nous allions pourrir un channel IRC ? c’est quand même plus propre.
Pour cela, il nous faut un hook de post-commit qui va interagir avec un client IRC. Nous avons donc besoin un client adapté à l’écriture de scripts. Irssi étant plutôt du genre usine à gaz pour une telle utilisation (même si c’est un client aussi léger qu’excellent pour une utilisation “humaine”). La médaille revient ici à Colin, l’homme qui n’utilise rien comme tout le monde et qui nous sort de derrière les fagots : ii !
Ii (pour IRC IT) est un client IRC plus que léger avec des vrais morceaux de pipe dedans. Il présente en effet pour seule interface deux tubes : in et out. Pour poster sur IRC, il suffit d’écrire dans le premier, pour lire… et bien il suffit de lire le second ! (un tail -f suffira pour tester, nous n’avons pas l’intention de nous en servir comme d’un vrai client).
Commencez donc par récupérer ii, un tarball est dispo sur la page du programme (je n’ai pas trouvé de version packagée pour apt) et l’installer par un classique #make install.
Pour causer parler dans l’poste il faut bien entendu lancer ii (taper $ii tout court pour avoir le détail des options); ici, ~/ircpipe est un répertoire qui contiendra les tubes que va créer ii :
$ii -i ~/ircpipe -s irc.example.org -p 6667 -n svnbot
Pour des problèmes de droit il faudra lancer cette commande et les suivantes avec l’utilisateur qui va exécuter le hook script, certainement www-data
Un dossier irc.example.org/ apparait contenant les fameux tubes in et out. Rejoignons à présent un canal (on peut tout à fait utiliser des messages privés, un canal vous sera utile si vous souhaitez faire d’autres bots, par exemple pour vous alerter de l’arrivée d’un mail) :
$echo "/j #svnlog" > ~/ircpipe/irc.example.org/in
Un dossier similaire irc.example.org/#svnlog apparait, tentez donc un ptit
$echo "yeah baby !" > ~/ircpipe/irc.example.org/#svnlog/in
et regardez ce qui apparait dans votre client IRC :
12:30 < svnbot> yeah baby !
On est donc en mesure d’écrire sur IRC avec une simple commande echo, la mise en oeuvre du hook sera donc simple et on va la faire au sein d’un petit script Python pour que ce soit plus propre :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# SVN-IRC hook script
from os import popen, system
import sys
chanpipe = "/tmp/ircpipe/irc.rezosup.org/#alertchan/in"
# recuperation des infos que l on veut balancer
repos = sys.argv[1]
rev = sys.argv[2]
author = popen("svnlook author "+repos).read().strip()
repname = repos.split('/')[-1:][0]
msg = "new commit from "+author+" on "+repname+" (rev. "+rev+")"
system("echo '"+msg+"' > "+chanpipe)
Il serait bien sur plus élégant de communiquer directement avec le tube depuis le script sans passer par echo mais mes quelques tentatives n’ont pas abouties, pas d’erreur, mais pas de message dans mon client non plus.
Et voici en tout cas ce qui apparait lors d’un commit :
< svnbot> new commit from gliss on acadis.org (rev. 137)
On pourra gruicker des messages plus complets grâce notamment à la commande svnlook, sorte de version ‘serveur’ de svn info, voire écouter le fichier /out pour interagir avec l’utilisateur, mais le hook script étant du one shot il faudra changer pas mal de trucs.
Et tant qu’à se faire un canal IRC perso, autant utiliser ii pour un watchdog mail/rss/système… :)
UPDATE : Je viens de voir ici que chez Last.fm, ils font tout ce bazar avec netcat :
Using netcat, you can easily send events to irc from shell scripts:
$ echo “Something just happened” | nc -q0 somemachine 12345
[…]
Some of the things we automatically send to appropriate IRC channels:
* SVN commits
* JIRA issue tracker updates
* Nagios alerts for monitored hosts and services
* Deployment notices to testing/staging/production
* Results of automated tests if something bad happens
* Links to pics from security camfeed when someone opens the office door out of hours
Notes
[1] http://thomas.enix.org/Blog-20090108160803-Technologie