Coder ses propres outils DevOps avec un agent IA - releaser & glint

Posted on Tue 14 July 2026 in Libre

Au boulot je passe une bonne partie de mon temps sur des pipelines GitLab CI et des workflows de release. Et régulièrement je tombe sur des trucs pour lesquels l'outillage existant fait 80% du taf correctement et se vautre lamentablement sur les 20% restants.

Avant, dans ce cas-là, on bricolait un script bash dégueulasse planqué dans un coin du repo, sinon on se bagarrait avec un outil existant à coups de configuration alambiquée jusqu'à ce que ça marche, ou à peu près. Cette fois j'ai pris une autre approche : coder mes propres outils CLI en Go, avec Claude Code en mode agent.

Résultat : deux outils, releaser et glint, et un REX sur la démarche.

Le problème de départ

GitFlow vs les outils de release automatique

semantic-release et consorts sont très bien foutus, mais ils partent tous du principe que vous êtes en TBD (trunk-based development) : une branche principale, on tag dessus, la version suivante c'est le dernier tag + le bump calculé depuis les Conventional Commits. Simple.

Sauf que sur pas mal de projets au boulot on est en GitFlow, avec des branches release/1.1, release/1.2, etc., maintenues en parallèle. Le concept même de "dernier tag sur la branche" n'a plus de sens de la même façon, et le major.minor est contraint par le nom de la branche, pas par les commits. Les outils existants soit l'ignorent complètement, soit demandent une configuration tellement tordue pour s'y adapter que ça devient plus fragile que le problème de départ.

Linter un .gitlab-ci.yml sans GitLab

Deuxième irritant, plus bête mais tout aussi chiant au quotidien : pour valider un .gitlab-ci.yml, l'outil de référence c'est le CI Lint intégré à GitLab par API.

Sympa, sauf qu'il faut soit pousser ses modifs a répétition, attendre, GitLab n'est pas vraiment verbeux et il ne dit quasiment rien sur les erreurs de logique (règles qui ne se déclenchent jamais, jobs orphelins, includes qui se marchent dessus). Rien d'équivalent à ansible-lint ou hadolint en local pour ce besoin.

Deux irritants récurrents, deux petits outils dédiés plutôt que deux usines à gaz de configuration pour forcer des outils génériques à faire un truc pour lequel ils n'ont pas été pensés.

releaser

releaser logo

releaser automatise le cycle de release en GitFlow avec Conventional Commits.

Documentation complète : Documentation releaser

Le principe :

  1. il extrait le major.minor depuis le nom de la branche (release/1.21.2)
  2. il cherche le dernier tag correspondant sur cette branche
  3. il analyse les Conventional Commits depuis ce tag
  4. il calcule le patch suivant (uniquement le patch, le major.minor est verrouillé par la branche)
  5. il met à jour les fichiers de manifeste du projet (pom.xml, package.json, build.gradle, pyproject.toml)
  6. il commit, tag, crée la release GitLab/GitHub, et notifie si configuré (Slack, Teams, Google Chat, Telegram, webhook)

En usage courant :

releaser --init          # génère une config par défaut
releaser                  # exécute le cycle complet
releaser --dry-run        # preview sans aucun effet de bord
releaser --verbose --dry-run   # preview avec le détail des décisions
releaser --no-push         # commit + tag en local seulement

Exemple d'une config .releaser.yml minimale, tout est optionnel avec des valeurs par défaut :

git:
  tag_prefix: "v"
  branch_pattern: "release/*"

bump_rules:
  fix: patch
  feat: patch
  breaking: patch

build:
  type: maven
  file: pom.xml

Dans un job GitLab CI, ça donnerait ça :

release:
  stage: release
  rules:
    - if: '$CI_COMMIT_BRANCH =~ /^release\/.*/'
  script:
    - releaser
  artifacts:
    reports:
      dotenv: release.env  

glint

Important

Mise à jour : je suis tombé aux détours d'explorations du côté des repos de GitLab, sur un outil en cours de développement depuis peu, qui permet de lancer une pipeline GitLab locallement en s'appuyant sur un mock de GitLab API + le moteur des runners : glci

C'est bien plus lourd et complet (et complexe) que glint, mais si c'est ce que vous cherchez à faire, c'est peut-être le mieux.

glint logo

glint c'est le linter local pour .gitlab-ci.yml qui n'existait pas. 45 règles (GL001 à GL045) qui couvrent la structure du pipeline, la validité des mots-clés, les dépendances entre jobs, les features dépréciées.

glint check      # lint le pipeline, exit 0/2/10 selon la sévérité
glint render      # fusionne includes/extends en un seul YAML
glint graph        # visualise les dépendances (arbre terminal ou Mermaid)
glint explain GL007 # explique une règle et comment la corriger
glint lsp          # démarre un serveur LSP pour l'intégration éditeur

Il résout les include: locaux, HTTPS, templates GitLab et composants du Catalogue CI/CD, avec du cache offline. Il simule aussi l'évaluation des règles rules:/only/except sur différents contextes de branche/tag, ce qui permet de repérer un job qui ne se déclenchera jamais sans avoir à pousser dix commits de test pour le vérifier.

Sortie en texte coloré, JSON, SARIF (pour l'intégration GitHub/GitLab scanning), JUnit, ou en annotations GitHub. Hook pre-commit, composant GitLab CI, action GitHub, extension VS Code : de quoi le brancher où on en a besoin.

git clone https://git.k3nny.fr/k3nny/glint
cd glint && go build -o glint ./cmd/glint/...
sudo mv glint /usr/local/bin/

Petite précision : C'est un outil perso construit pour un besoin perso, pas un produit. Je préfère l'assumer clairement plutôt que de vendre du rêve sur mon repo publique mais pas trop.

La démarche : coder avec un agent IA plutôt qu'à la main

Voilà le vrai sujet de cet article.

Ces deux outils, je ne les aurais probablement jamais écrits "à l'ancienne". Précision qui a son importance : je n'ai jamais développé en Go auparavant 😂.

Pas par flemme de coder donc, mais plutôt un calcul coût/bénéfice : un CLI Go avec parsing de commits, gestion multi-format de manifestes, notifications multi-canal, ou un linter avec 45 règles et un serveur LSP, je saurais faire mais c'est plusieurs jours de haute plomberie avant d'arriver à quelque chose d'intéressant. Avec un agent comme Claude Code, ce calcul change tout.

Quelques points qui ont vraiment fait la différence dans la pratique :

  • Spécifier avant de coder. Le point de départ, c'est toujours d'expliquer précisément le problème métier (le coup du major.minor verrouillé par la branche, les codes de sortie attendus pour un linter en CI) avant de laisser l'agent produire quoi que ce soit. Spec floue == Résultat foireux et faut s'y reprendre et redéfinir le besoin et patatra.
  • La partie ingrate, déléguée sans regret. Parser des Conventional Commits, gérer 4 formats de manifestes différents, écrire les tests qui vérifient que release/1.2 ne bumpera jamais vers 1.3.0, rédiger le README avec tous les exemples de config : c'est exactement le genre de tâche mécanique où un agent est plus rapide et plus rigoureux que moi à 23h un mardi. Reste quand même à relire ce qu'il raconte, parfois c'est partiel et pas uniforme.
  • Itérer par petits cycles. Plutôt que "code-moi un linter GitLab CI complet", ça a été un rythme de type "prends en compte ce cas spécifique, avec les tests, 100% coverage, mise à jour README.md". Un agent est bien meilleur sur un scope précis et vérifiable que sur une spec vague de 3000 mots.

Au final, le gain n'est pas "l'IA a codé mes outils à ma place" (fin si un peu quand même), c'est plutôt que le seuil de rentabilité qui justifie de construire un outil dédié plutôt que de forcer la main à un outil générique a beaucoup baissé.

Deux irritants qui seraient restés des scripts bash bricolés dans un coin d'un repo pendant des années sont devenus deux vrais petits outils, testés, documentés, avec un CLI propre.

Conclusion

  • Coder son propre outil reste justifié quand l'outil générique du marché ne colle juste pas au contexte (GitFlow, absence d'accès à l'API GitLab en local)
  • Un agent IA type Claude Code ne remplace pas la réflexion sur le problème, il réduit drastiquement le coût de la partie ingrate une fois le problème bien posé
  • Ça reste du code produit sous ma responsabilité : ptête ça va péter des trucs..
  • J'ai cramé pas mal de tokens on va pas se le cacher
  • Mais l'utilisation de RTK permet de limiter la casse

Les deux sont sous licence Apache 2.0, disponibles sur mon Gitea perso.

HF.

Sources


MeshCentral

Posted on Wed 27 January 2021 in Libre

Voici un truc qui ne rencontre pas le succès qu'il mérite.

C'est une solution client-serveur de prise en main à distance MeshCentral

MeshCentral

Le projet Open-Source MeshCentral est développé par Ylian Saint-Hilaire

C'est un ingénieur Canadien à l'origine de beaucoup de choses chez Intel, notamment sur AMT qui permet de gérer à distance des serveurs avec l'outil MeshCommander

MeshCentral permet depuis un navigateur web de prendre le contrôle d'un système Windows/MacOSX/Linux/Android à distance, au moyen d'un *.exe portable ou en installant l'agent MeshAgent.

C'est simple, léger, efficace, libre, c'est magnifique.

Ce que ça permet de faire :

  • Contrôle complet à distance
  • Transfert de fichiers up/down
  • Mode console shell à distance
  • ACL sur des groupes de postes
  • Partage de prise en main à un tiers
  • Authentification 2FA (TOTP + U2F)
  • etc, etc, etc..

J'ai une instance MeshCentral personnelle depuis plusieurs mois pour dépanner la famille c'est vraiment génial.

Pour le tutoriel d'installation, il y'a des gens super à Toulouse qui ont écrit un tutoriel pour installer son serveur (coucou Jérôme) : MeshCentral solution libre pour remplacer TeamViewer

Enjoy


RTL-SDR simple et rapide pour voir les avions

Posted on Wed 28 August 2019 in Libre

Je me suis acheté un clé USB RTL-SDR récemment pour faire du SDR ( Software Defined Radio ). C'est une clé USB qui à l'origine est destiné à la réception des chaines TNT sur PC. Des gens intéressants se sont aperçu que la puce utilisée pouvait être, moyennant le bon driver, utilisée pour recevoir/écouter d'autres fréquences (AM/FM/VHF/etc). Désormais des marques vendent des clés directement adaptées à cet usage avec des puces optimisées. Pour la référence j'ai commandé une clé RTL2832U de la marque Nooelec avec antenne.

Objectif de la manœuvre : voir les avions qui passent au dessus de nos têtes.

Certains avions émettent des signaux ADS-B ce qui permet de déterminer l'identité+trajectoire+vitesse+altitude de chaque appareil : https://fr.wikipedia.org/wiki/Automatic_dependent_surveillance-broadcast

Pour la partie logiciel :

Une fois tout ça installé, driver qui fonctionne, SDRSharp qui arrive à recevoir de la FM ou tout autre chose, on lance RTL1090 puis Virtual Radar et tadaaaaaam les avions apparaissent !

EasyJet

La CIA qui rentre du G7

C'est simple et marrant de voir tout ce qu'on peut capter comme signaux (coucou les électrosensibles).


ipset et shorewall

Posted on Wed 28 August 2019 in Internet

Edit 2019-09-01 : j'ai mis le rafraîchissement en place toute les heures, c'est efficace a en juger les graphes Fail2ban.

ipset

--

Récemment j'ai pu faire la découverte d'ipset, une extension kernel Linux qui permet de faire des listes d'adresses ipv4/ipv6 et sous-réseaux utilisables avec iptables (et donc shorewall)

C'est très pratique quand vous en avez ras le bol de vous faire poutrer des services (SSH/FTP/Mail/etc) par des robots, fail2ban c'est bien mais si on peut bloquer le gros des méchants déjà connus c'est mieux.

Pour faire simple et à la main, il faut créer une liste en définissant son type (net/ip) puis l'alimenter :

## creation des sets
ipset create blacklist_net -exist hash:net family inet hashsize 16777216 maxelem 16777216 
ipset create blacklist_ipv4 -exist hash:ip family inet hashsize 16777216 maxelem 16777216
## alimentation d'une liste
ipset add blacklist_ipv4 8.8.8.8
ipset add blacklist_net 192.168.12.0/24

Exemples idiots mais vous voyez ou je veux en venir. Une fois la liste créé on peut l'utiliser dans une règle shorewall dans le fichier /etc/shorewall/rules par exemple :

DROP       net:+blacklist_ipv4 $FW
DROP        net:+blacklist_net  $FW
DROP        $FW         net:+blacklist_net
DROP        $FW         net:+blacklist_ipv4

Pour être plus efficace, et parce qu'alimenter ip par ip c'est pas l'objectif, il existe un projet open-source très bien fourni, Firehol, qui regroupe pour les besoins de sa solution un ensemble de listes d'adresses IP mises à jour régulièrement, toutes les heures voir toutes les minutes pour certaines.

Pour automatiser :

  • Première solution, utiliser la solution Firehol
  • Deuxième solution, pisser un script qui va télécharger les listes qui me plaisent et les bidouiller pour les utiliser dans mes ipset derrière.

J'ai mis en ligne une première ébauche d'un script bash+python qui fait tout ça sur mon dépôt Git : https://git.k3nny.fr/Tools/ipset_updater

Note : d'un point de vu technique, l'ajout des ip/subnet par une boucle python ou bash est beaucoup trop long, ipset permet l'import massif en utilisant la restauration de fichier, c'est cette méthode qui est utilisé (voir le script : https://git.k3nny.fr/Tools/ipset_updater/src/branch/master/ipset_update.sh )

Une fois le script lancé on obtient ça :

* 2019-08-28 20:00:10 Runinng list update
Reading lists of URL to download
= Update ipv4
- Downloading spamhaus
- Downloading bi_any_2_7d
- Downloading blocklist
- Downloading stopforumspam
- Downloading haley_ssh
- Downloading blocklist_ssh
- Downloading bi_any_2_1d
- Downloading bi_any__1_7d
- Downloading bi_any_0_1d
- Downloading bi_any_2_30d
= Update net
- Downloading ru
- Downloading emerging
- Downloading cn2
- Downloading cn
- Downloading bogons
- Downloading firehol
- Downloading pk
- Downloading sa
- Downloading kor
= Saved 280625 elements to ipset_ipv4.set
= Saved 24751 elements to ipset_subnets.set
* Create ipset blocklists if not already existing
* Import lists into ipset
== Import ipv4 ipset
== Import subnets ipset
* Saving ipset
* Cleanup ipset files

Avec les listes incluses ça fonctionne déjà assez bien, je constate moins de tentative de connexion ssh intempestives, à vous de faire votre choix de blocage en fonction de vos besoins (blocage par pays, listes de blocages).

  • Je ne suis pas encore passé à Debian Buster, ni à nftables, visiblement nftables implémente les listes directement sans passer par une extension comme ipset.
  • J'ai commencé à modifier le script pour prendre en charge les listes ipv6 mais j'ai eu la flemme

Des ressources pour gratter :


CSGO config file highlight for Notepad++

Posted on Thu 25 July 2013 in Internet

Tonight I took up as a challenge to create a language file for Notepad++ designed to highlight Counter-Strike Global Offensive configuration files (.cfg files). It becomes pretty handy to see syntax error and if keywords are correctly spelled to avoid further problems.

It took me half an hour to do so, based on the works of \@gustavnikolaj, he posted on Reddit his works for SublimeText 2. I took his work, especially lists of keywords and a similar color scheme, to achieve mine.

You can find his work here on GitHub

You can see below the result of my work, how it highlights text and values in Notepad++

If you want to download that language file : GOTO my GitHub CSGO repo


Powershell : Créer des utilisateurs à partir d'un fichier CSV

Posted on Fri 25 February 2011 in Libre

Afin de peupler un nouveau domaine en remplacement d'un ancien, j'ai été confronté au soucis de ne pas avoir sous la main d'outil permettant la création massive de comptes utilisateurs avec tous les attributs, dossiers, partages, droits, etc..

Il existe bien des outils vieillissants tels que Gestion5, mais largement dépassé vu les nouvelles versions de serveurs (Win2008R2 dans mon cas).

Voici donc un script que j'ai réalisé en Powershell, language que je ne connaissait pas jusqu'a peu, qui reprend des commandes batch - .net et qui s'apparente parfois a du bash linux.

C'est un language très puissant que je vous invite a découvrir au plus vite !

Fonctionnalités du code :
- Import d'un fichier CSV
- Détection des noms en double (cn basé sur le nom)
- Création d'un mot de passe numérique de 4 digits
- Création des dossiers correspondants
- Création des partages associés aux dossiers
- Droits de sécurité sur les dossiers
- Création du script de logon pour chaque utilisateurs
- Jonction au groupe classe
- Création d'un dossier pour chaque classe
- Fichier de log avec les identifiants et mot de passe

Il reste de nombreuses choses a voir et a faire encore avec ce script mais pour le moment il est fonctionnel dans mon établissement.

Ce travail est soumis à licence Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)
(plus d’infos ici : https://creativecommons.org/licenses/by-nc-sa/3.0/)

Pour voir le depot GitHub du projet c'est ici : https://github.com/k3nnyfr/TICE-create-users