Coin web de Frédéric Péters

Intégration continue (à la) maison

J’ai laissé s’envoler jack_mixer vers GitHub, c’était le souhait de Daniel Sheeler qui est de fait devenu le développeur principal et actif, et ce déplacement et l’activité visible donnée par les annonces des nouvelles versions sur la liste linux-audio-announce, ça a suscité quelques réactions voire contributions positives, bien bien.

Mais pour mes projets personnels, je reste à la maison. Et là je note que les mises à jour, notamment les applications pour Radio Panik, c’était quand même très primitif, à la git pull sur le serveur, et commandes sorties de l’historique du shell pour l’exécution des migrations de données, la compilation des traductions et autres tâches de déploiement…

Debian un jour Debian toujours, j'ai revu tout ça pour contruire et distribuer des paquets .deb pour les différents modules, ainsi les mises à jour sont revenues à ce que devrait être n’importe quelle mise à jour d’application, apt update && apt upgrade. (oui un titre alternatif pour cette note aurait pu être "deploy like it’s 98", on ne se refait pas).

Ça commence par un hook "post-update" ajouté dans les dépôts sur le serveur, hook qui est vraiment très très simple :

#! /bin/sh

REPOSITORY_BASENAME=$(basename "$PWD") 
touch /srv/git.0d.be/triggers/$REPOSITORY_BASENAME

Créer un fichier dans un répertoire. On peut difficilement plus simple.

Ensuite, magie, unit systemd qui surveille ce répertoire (cf systemd.path(5)), git-eobuilder.path:

[Unit]
Description=Triggers when a git repository is touched

[Path] 
PathModified=/srv/git.0d.be/triggers/

[Install]
WantedBy=multi-user.target

Et le service associé, fichier git-eobuilder.service, qui lance un script,

[Unit]
Description=CI builds

[Service]
Type=oneshot
ExecStart=/srv/git.0d.be/bin/eobuilder
User=eobuilder

Script qui va regarder dans le répertoire et déclencher la construction d’un paquet .deb pour les différents modules renseignés, (ça fait partie du truc magique d’avoir l’unit déclenchée une seule fois, ce qui assure qu’il n’y aura pas plusieurs builds en parallèle, ce qui me va très bien vu le serveur en question) :

#! /usr/bin/python3

import os

while True:
    filenames = os.listdir('/srv/git.0d.be/triggers/')
    if not filenames:
        break
    for filename in filenames:
        os.unlink('/srv/git.0d.be/triggers/' + filename)
        os.system('eobuilder -d buster https://git.0d.be/g/' + filename)

La commande "eobuilder" là en bout de chaine étant un gros wrapper au-dessus de cowbuilder (lui-même "a pbuilder wrapper for cowdancer"), qui va après la construction du paquet .deb le placer dans un répertoire publié par nginx, dans lequel apt-ftparchive sera exécuté, et in fine les paquets se trouveront donc disponibles via :

deb [trusted=yes] https://rdio.space/deb/ ./

(où on sent la fin et la flemme de chercher à gérer la signature GPG du dépôt).

Là-dessus, il n’en est encore rien mais il y aurait à imaginer une notification quand la construction du paquet échoue, les logs pourraient être publiés, etc. mais tout ça sera pour un autre jour.

1 juillet 2020, 10:30