Coin web de Frédéric Péters

fpeters@0d.be

Intégration continue (à la) maison

1 juillet 2020, 10:30

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 (ne pas oublier d’en faire systemctl start git-eobuilder.path (et enable aussi)) :

[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.