Dans le cycle de vie moderne du développement logiciel, l'écart entre l'écriture de code de production et l'automatisation des processus internes n'a jamais été aussi grand. Les outils low-code traditionnels manquent souvent de la flexibilité requise par les développeurs, tandis que l'écriture de code répétitif pour chaque tâche planifiée simple ou déclencheur d'API peut être fastidieuse. Voici Windmill, une plateforme open-source conçue spécifiquement pour transformer des scripts en applications internes, workflows et points de terminaison (endpoints). Il comble cet écart en vous permettant d'écrire des scripts dans votre langage préféré et de les déployer instantanément en tant qu'applications évolutives et gérées.
Pourquoi Windmill change la donne
Windmill se distingue par son approche polyglotte et centrée sur le code. Contrairement aux outils d'orchestration de workflows rigides qui vous forcent à utiliser une interface visuelle de glisser-déposer, Windmill vous permet d'écrire la logique en Python, TypeScript, Rust, Go, Bash et SQL. Cette approche offre plusieurs avantages distincts pour les équipes d'ingénierie :
- Réutilisabilité : Les scripts écrits pour une tâche ponctuelle peuvent être réutilisés comme étapes dans des workflows complexes sans modification.
- Rétroaction immédiate : Vous bénéficiez d'une génération d'interface utilisateur instantanée à partir des arguments de votre script, réduisant le temps consacré à la création de panneaux d'administration.
- Sécurité : En gardant la logique proche de la source de données et en utilisant des secrets gérés, vous réduisez la surface d'attaque par rapport aux tâches planifiées personnalisées s'exécutant sur des instances EC2.
- Évolutivité : Windmill gère l'infrastructure sous-jacente, mettant automatiquement à l'échelle vos nœuds de travail en fonction de la charge de travail.
Pour commencer : Votre premier script
La configuration de Windmill est simple, surtout lors de l'utilisation de Docker Compose. Une fois votre environnement en place, vous pouvez commencer à créer votre premier "Script". Examinons un exemple pratique : un script Python qui interagit avec une base de données.
Imaginez que vous ayez besoin d'un script pour récupérer les données des utilisateurs pour un tableau de bord d'analyse interne. Dans Windmill, vous écrivez simplement la fonction, et elle est automatiquement exposée en tant que point de terminaison.
# script.py
from windmill_pydantic import User
def get_active_users(db_connection: str, limit: int = 10) -> list[User]:
"""
Récupère les utilisateurs actifs les plus récents depuis la base de données.
Args:
db_connection : La chaîne de connexion à la base de données.
limit : Le nombre d'utilisateurs à retourner.
"""
# Interaction simulée avec la base de données
# Dans un cas réel, vous utiliseriez un ORM comme SQLAlchemy ou Prisma
users = query_db(db_connection, f"SELECT * FROM users WHERE active = true LIMIT {limit}")
return users
Remarquez l'utilisation des indications de type (type hinting). Windmill utilise ces indications pour générer automatiquement des champs de saisie dans l'interface utilisateur, garantissant que toute personne utilisant ce script (ou l'appelant via API) fournit les types de données corrects.
Orchestrer des workflows complexes
Bien que les scripts individuels soient puissants, la véritable magie de Windmill réside dans les Flows. Un Flow est un DAG (Directed Acyclic Graph, ou graphe acyclique dirigé) qui relie plusieurs scripts entre eux. Vous pouvez enchaîner un script TypeScript qui déclenche un appel API, transmettre son résultat à un script Python pour la transformation des données, puis utiliser un script Bash pour envoyer une notification Slack.
Considérons un scénario où vous devez synchroniser des données depuis un CRM tiers vers votre base de données Postgres interne. Vous pouvez créer un flow qui ressemble à ceci :
// flow.ts
import { flow } from 'windmill';
export default flow()
.step(async () => {
// Étape 1 : Récupérer les données depuis Salesforce
const crmData = await fetch('https://api.crm.com/users', {
headers: { Authorization: process.env.SALESFORCE_TOKEN }
});
return crmData.json();
})
.step(async (data) => {
// Étape 2 : Transformer les données à l'aide d'un script Python
return python.transform_data(data);
})
.step(async (transformedData) => {
// Étape 3 : Insérer dans Postgres
return python.insert_to_db(transformedData);
})
.execute();
Cette approche déclarative rend les dépendances complexes faciles à visualiser et à déboguer. Si l'Étape 2 échoue, vous pouvez relancer uniquement cette étape avec les données mises en cache de l'Étape 1, réduisant considérablement le temps de développement.
Conclusion
Windmill représente un changement significatif dans notre approche des outils internes et de l'automatisation. En permettant aux développeurs d'utiliser les langages qu'ils connaissent déjà, il élimine la courbe d'apprentissage associée aux outils BPM traditionnels tout en offrant la robustesse et l'évolutivité d'une plateforme cloud-native. Que vous construisiez une simple tâche planifiée ou une orchestration complexe de microservices, Windmill fournit les outils pour le faire plus rapidement, plus proprement et plus en toute sécurité. Pour les équipes souhaitant réduire la dette technique et accélérer le développement interne, l'adoption de Windmill est une démarche stratégique qui vaut la peine d'être envisagée.