
đ Aussi en: English · Deutsch · Español
Aujourd’hui, j’ai pris un peu de temps pour explorer Jenkins dans mon homelab.
Pour ceux qui ont rĂ©ussi, on ne sait comment, Ă Ă©viter Jenkins pendant la derniĂšre dĂ©cennie : Jenkins est l’un des serveurs d’automatisation open source les plus utilisĂ©s aujourd’hui. PubliĂ© Ă l’origine en 2011 comme fork du projet Hudson, Jenkins est devenu l’un des piliers des workflows DevOps modernes. Il sert principalement Ă l’intĂ©gration continue (CI) et Ă la livraison continue (CD) : il automatise les builds logiciels, les tests, les dĂ©ploiements et toutes sortes de tĂąches d’administration rĂ©currentes. Si un processus peut ĂȘtre automatisĂ©, Jenkins sait probablement s’en charger. đ
Jusqu’Ă prĂ©sent, j’utilisais deux tĂąches cron classiques dans mon homelab. Leur rĂŽle est assez simple : chaque nuit, elles utilisent rsync pour crĂ©er des sauvegardes de deux instances Nextcloud exposĂ©es sur Internet.
Ce montage fonctionne parfaitement depuis un bon moment. Mais cĂŽtĂ© supervision et journalisation, cron reste avant tout l’outil des adeptes de la ligne de commande et des vĂ©tĂ©rans d’Unix. On finit gĂ©nĂ©ralement par fouiller dans les fichiers de log, par vĂ©rifier Ă la main si les tĂąches se sont bien exĂ©cutĂ©es, et par se demander de temps en temps si une sauvegarde ratĂ©e date d’il y a trois jours ou de trois semaines.
Bien sĂ»r, cron est incroyablement fiable et lĂ©ger. Mais soyons honnĂȘtes : on ne peut pas dire qu’il offre l’expĂ©rience utilisateur la plus moderne qui soit.
Comme Jenkins va trĂšs probablement prendre plus de place dans mon environnement professionnel Ă l’avenir, j’ai dĂ©cidĂ© de le dĂ©ployer enfin dans mon homelab aussi, pour acquĂ©rir un peu d’expĂ©rience pratique.
Un dĂ©tail Ă noter : Jenkins tourne sur la mĂȘme machine que GitLab. Comme GitLab Ă©coute dĂ©jĂ sur le port TCP 8080, il a fallu configurer Jenkins pour utiliser le port TCP 8090.
Configuration actuelle de Jenkins
Pour l’instant, la configuration de Jenkins est volontairement simple.
J’ai créé deux jobs de type Freestyle Project. Comme dans mon ancienne configuration cron, chaque job a sa propre planification qui dĂ©finit quand il doit s’exĂ©cuter. L’opĂ©ration de sauvegarde elle-mĂȘme n’est rien de plus que l’exĂ©cution d’un script shell local.
Jusqu’ici, tout fonctionne sans accroc. Jenkins fournit une interface web pratique oĂč je vois immĂ©diatement si les jobs se sont bien dĂ©roulĂ©s, quand ils ont Ă©tĂ© exĂ©cutĂ©s, combien de temps ils ont pris et quelle sortie ils ont produite.
ComparĂ© Ă l’inspection manuelle des logs cron, c’est dĂ©jĂ un vrai gain de confort au quotidien. đ
Un ajustement supplĂ©mentaire a Ă©tĂ© nĂ©cessaire. Jenkins tourne sous son propre compte de service jenkins, alors que mes scripts de sauvegarde doivent ĂȘtre exĂ©cutĂ©s en tant qu’utilisateur user3. PlutĂŽt que de revoir les permissions et les propriĂ©taires, j’ai simplement configurĂ© l’Ă©tape de build pour lancer les scripts via sudo -u user3. Ainsi, Jenkins reste chargĂ© de la planification et de la supervision des jobs, tandis que la logique de sauvegarde proprement dite s’exĂ©cute sous le compte qui a dĂ©jĂ accĂšs aux fichiers et rĂ©pertoires nĂ©cessaires. đ
Exporter les configurations des jobs en XML
Une fonctionnalitĂ© particuliĂšrement utile que j’ai dĂ©couverte : Jenkins permet d’exporter la configuration de chaque job au format XML.
Pour rĂ©cupĂ©rer la configuration d’un job, il suffit d’ajouter /config.xml Ă l’URL du job et de s’authentifier avec un compte utilisateur Jenkins valide :
curl -u <user>:<password> \
http://192.168.10.x:8090/job/Backup-InstanceB/config.xml
Curieusement, l’accĂšs direct Ă la configuration XML depuis un navigateur n’a pas fonctionnĂ© chez moi. En revanche, avec curl en ligne de commande, tout a marchĂ© parfaitement.
Le XML obtenu contient la définition complÚte du job, ce qui le rend utile non seulement pour la documentation, mais aussi comme sauvegarde légÚre de la configuration de Jenkins.
Configuration de Backup-InstanceA
user3@hp1:~$ curl -u <user>:<password> http://192.168.10.x:8090/job/Backup-InstanceA/config.xml
<?xml version='1.1' encoding='UTF-8'?>
<project>
<actions/>
<description>rsync</description>
<keepDependencies>false</keepDependencies>
<properties/>
<scm class="hudson.scm.NullSCM"/>
<canRoam>true</canRoam>
<disabled>false</disabled>
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<triggers>
<hudson.triggers.TimerTrigger>
<spec>H 1 * * *</spec>
</hudson.triggers.TimerTrigger>
</triggers>
<concurrentBuild>false</concurrentBuild>
<builders>
<hudson.tasks.Shell>
<command>sudo -u user3 /raid5/shared/shared/ablage/nextcloud_backup_and_restore/instance-a_backup_nextcloud_remote.sh</command>
<configuredLocalRules/>
</hudson.tasks.Shell>
</builders>
<publishers/>
<buildWrappers/>
</project>
Configuration de Backup-InstanceB
user3@hp1:~$ curl -u <user>:<password> http://192.168.10.x:8090/job/Backup-InstanceB/config.xml
<?xml version='1.1' encoding='UTF-8'?>
<project>
<description>rsync</description>
<keepDependencies>false</keepDependencies>
<properties/>
<scm class="hudson.scm.NullSCM"/>
<canRoam>true</canRoam>
<disabled>false</disabled>
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<triggers>
<hudson.triggers.TimerTrigger>
<spec>H 2 * * *</spec>
</hudson.triggers.TimerTrigger>
</triggers>
<concurrentBuild>false</concurrentBuild>
<builders>
<hudson.tasks.Shell>
<command>sudo -u user3 /raid5/shared/shared/ablage/nextcloud_backup_and_restore/sofie_backup_nextcloud_remote.sh</command>
<configuredLocalRules/>
</hudson.tasks.Shell>
</builders>
<publishers/>
<buildWrappers/>
</project>
Conclusion
D’un point de vue purement technique, remplacer deux tĂąches cron parfaitement fonctionnelles par Jenkins est sans doute un cas d’Ă©cole de sur-ingĂ©nierie. đ
D’un autre cĂŽtĂ©, Jenkins offre une journalisation centralisĂ©e, un historique des exĂ©cutions, des informations d’Ă©tat et une interface web conviviale qui rend la supervision des tĂąches planifiĂ©es nettement plus confortable.
Pour l’instant, Jenkins se contente de lancer deux scripts de sauvegarde. Mais toute expĂ©rience de homelab commence petit, et l’expĂ©rience montre qu’une fois Jenkins en place, il se limite rarement Ă deux jobs.
Voyons oĂč ce voyage nous mĂšnera ensuite. đ








