Doolta
ansible-static-lint
GitHub →Le lint Ansible passait de la minute aux millisecondes le jour où l'on a retiré le runtime : 38 règles d'ansible-lint réimplémentées en Go, sortie identique à l'octet près.

Détails du projet
- Le problèmeLe lint Ansible plombe les temps de traitement en CI : 46,8 s pour passer un corpus de 478 fichiers, 2,1 s pour un playbook de 6 lignes. À chaque push, en pre-commit ou à la sauvegarde dans l’éditeur, c’est une attente qui casse la boucle de feedback.
- L'analyseLe coût n’est pas dans les règles, il est dans le lancement d’Ansible : interpréteur Python, imports, résolution de collections, sous-processus de syntax-check, le tout avant la première vérification. Même
ansible-lint --versioncoûte une demi-seconde. Une règle, elle, n’est qu’un prédicat sur un document déjà parsé : son coût marginal se mesure en microsecondes. - L'intuitionEt si on ne faisait que l’analyse statique ? La majorité des règles se décident depuis la source YAML seule, sans runtime Ansible. Un binaire qui parse le YAML et applique des prédicats n’a plus à payer que le démarrage, les I/O et le parsing : le nombre de règles devient presque gratuit.
- La réalisationTri des 51 règles par défaut d’ansible-lint : 38 sont décidables statiquement et réimplémentées en Go, les 13 qui exigent le runtime restent à l’original. Sur ce périmètre, la compatibilité est totale : sortie pep8 reproduite à l’octet près, config
.ansible-lintet commentairesnoqainchangés, contrat gelé sur le corpus ansible-lint 26.8.0. Résultat : de la minute aux millisecondes (37 ms sur le corpus, 2,2 ms à froid), avecmake benchqui casse le build au-delà de 150 ms. - Offre associéeS’appuie sur l’offre Sprint DevOps : raccourcir les boucles de feedback CI et fiabiliser l’outillage.
Un pipeline qui attend 47 secondes son linter a un problème, et ce problème n’est pas le lint : c’est le lancement d’Ansible. astl part de ce diagnostic et le pousse jusqu’au bout : si le runtime est le coût, on retire le runtime, et on garde toutes les règles qui n’en ont jamais eu besoin. 38 des 51 règles par défaut d’ansible-lint, réimplémentées en Go, rendues en millisecondes, avec la même sortie à l’octet près.
Le pipeline gagnant fait tourner les deux : astl à chaque push pour les règles qui bloquent la plupart des CI, ansible-lint en nightly pour les 13 règles qui exigent le runtime. Ce projet démontre une capacité directement mobilisable en mission : identifier où part réellement le temps, en tirer une architecture, et verrouiller le résultat par un contrat de compatibilité et un garde-fou de performance.