wimcast: construire des images Windows sur Linux, sans Windows
Le chemin de provisionnement Windows de Foreman passe par des fichiers WIM: boot.wim, install.wim par édition, bootmgr, le store BCD. Chaque outil qui produit cet arbre (WIMan, GenerateWIM.ps1) suppose un hôte Windows avec l’ADK installé et un shell admin. C’est une machine entière qui chôme pour un script PowerShell. wimcast
(pip install wimcast, MIT) est le remplacement que j’ai écrit: des ISO Windows en entrée, un arbre HTTP prêt pour Foreman en sortie, sans privilèges sur Linux. Pas d’hôte Windows, pas de root, pas de mount(2), pas de FUSE, pas d’ADK.
Les trois commandes
wimcast doctor # check des prérequis, safe, n'installe rien
wimcast probe sources/ # inspecte vos ISO avant de construire
wimcast build sources/ # construit l'arbre finalized/
doctor rapporte ce qui manque et si c’est requis ou conditionnel. probe lit les ISO (pycdlib, sans montage) et montre les éditions et indexes avant de s’engager. build produit l’arbre: sources/ par édition (chaque *.wim + images.ini + drivers/), plus wimboot, bootmgr{,.efi}, boot/{bcd,sdi} et un build.json décrivant ce qui a été construit. Le résultat est prêt à servir en HTTP pour Foreman.
Pourquoi une réécriture et ce que la réécriture a réparé
Le “avant”, c’était ma propre pipeline PowerShell (wiman-builder) qui pilotait un fork de WIMan sur un shell runner Windows de CI. La mise à la retraite a réglé quatre choses d’un coup:
- wimboot piné et checksummé, pas un
latesttéléchargé à chaque build. L’arbre d’images devient reproductible; une release wimboot ne peut plus changer sous vous. - Cache content-addressed: un ISO inchangé saute la ré-exportation entièrement. Des builds sériels qui ré-exportaient tout sont devenus des builds parallèles (scheduler à sémaphores CPU) qui sautent l’essentiel du travail.
- L’arbre drivers est publié:
sources/drivers/part dans la sortie pour le DISM au déploiement. L’original WIMan avait les drivers sur disque mais ne les publiait jamais: un bug de production caché en pleine lumière. - Le runner CI est n’importe quelle machine Linux. Le shell runner Windows, sa licence et son install ADK sont partis à la maison de retraite.
Sous le capot: wimtools pour la manipulation WIM et pycdlib pour la lecture d’ISO, orchestrés en python avec mypy strict, ruff et des tests golden-files. Rien d’exotique: la partie exotique, c’était de prétendre que Windows était requis.
Windows sans Windows
- “Ça demande Windows” veut dire “ça demande un format de fichier Windows”. WIM, BCD et bootmgr sont des fichiers; les lire sans privilèges bat le boot d’un hôte pour les toucher.
- Des inputs pinés battent des téléchargements frais. Le checksum wimboot est la différence entre un arbre reproductible et un pari.
- Un cache indexé sur le contenu bat un cache indexé sur l’espoir. Les ISO sont immuables; les hasher coûte moins cher que les ré-exporter.
- Les commandes
doctorpaient leur place. Dire exactement aux utilisateurs ce qui manque et si ça compte, prévient la moitié des tickets support qu’un CLI génère un jour.