Aller au contenu
CI/CD & Automatisation medium

Dagger : comprendre le mental model local-first

16 min de lecture

Logo Dagger

Dagger est une plateforme qui vous permet d’exécuter vos pipelines CI/CD localement sur votre machine, exactement comme ils s’exécuteront en CI. Contrairement aux CI traditionnelles où vous devez pousser votre code et attendre les logs, Dagger vous donne un feedback immédiat. C’est ce qu’on appelle l’approche “local-first”.

Prérequis : Notions de base en programmation Python et compréhension de ce qu’est un conteneur Docker. Si besoin, consultez :

Avant de comprendre ce qu’est Dagger, clarifions une confusion courante.

Dagger (CI/CD)Dagger (Android)
Créé par Solomon Hykes (fondateur de Docker)Créé par Google
Plateforme de pipelines programmablesFramework d’injection de dépendances
Python, Go, TypeScriptJava, Kotlin
Exécute des conteneursCompile du code Android

Dans cette formation, on parle uniquement de Dagger la plateforme CI/CD.

Dagger est une plateforme pour automatiser la livraison logicielle. Elle permet de construire, tester et déployer n’importe quelle application, de manière fiable et à grande échelle.

Mais “plateforme de livraison logicielle”, ça reste abstrait. Concrètement, Dagger vous permet de :

  1. Écrire vos pipelines en code (Python, pas YAML)
  2. Les exécuter localement (sans pousser vers une CI)
  3. Les partager et réutiliser (comme des librairies)
  4. Bénéficier du cache automatique (exécutions ultra-rapides)

Imaginez que vous construisez une maison :

  • CI traditionnelle (Jenkins, GitLab CI) : Vous envoyez vos plans par courrier à une entreprise de construction. Vous attendez qu’ils construisent. S’il y a un problème, vous recevez un compte-rendu par courrier. Vous corrigez et renvoyez. Ça prend des jours.

  • Dagger : Vous avez une maquette 3D sur votre bureau. Vous pouvez tester chaque modification instantanément, voir les problèmes en temps réel, et quand tout est parfait, vous envoyez les plans finaux.

Dagger vous donne cette “maquette 3D” pour vos pipelines.

L’approche “Local-first” : pourquoi c’est révolutionnaire

Section intitulée « L’approche “Local-first” : pourquoi c’est révolutionnaire »

Le terme “local-first” signifie que votre pipeline s’exécute d’abord sur votre machine locale, pas sur un serveur distant.

Quand vous utilisez GitLab CI, GitHub Actions ou Jenkins, voici le workflow typique :

1. Modifier le code
2. git commit && git push
3. Attendre 2-10 minutes
4. Lire les logs (souvent incompréhensibles)
5. Si erreur : deviner le problème
6. Retour à l'étape 1

Ce cycle peut prendre des heures pour un simple bug de configuration.

1. Modifier le code
2. dagger call ma-fonction
3. Voir le résultat en quelques secondes
4. Si erreur : debugger localement
5. Une fois que ça marche : pousser

Le même pipeline qui tourne sur votre laptop tournera à l’identique en CI.

Dagger repose sur les conteneurs. Chaque opération s’exécute dans un conteneur isolé, ce qui garantit :

  • Reproductibilité : même comportement partout
  • Isolation : pas de dépendances système cachées
  • Portabilité : fonctionne sur Linux, macOS, Windows (via Docker Desktop)

Dagger est composé de plusieurs éléments qui travaillent ensemble. Comprendre cette architecture vous aidera à diagnostiquer les problèmes.

Architecture Dagger : CLI, Engine et Docker

Le Dagger Engine est le cœur du système. C’est un daemon (programme qui tourne en arrière-plan) qui :

  • Orchestre l’exécution des conteneurs
  • Gère le cache intelligent
  • Fournit l’API que vous appelez

Analogie : Le Dagger Engine, c’est comme le chef cuisinier dans un restaurant. Il reçoit les commandes (vos fonctions), coordonne les cuisiniers (les conteneurs), et s’assure que tout est prêt dans le bon ordre.

Le Dagger Engine est lui-même un conteneur Docker. C’est pour ça que Docker doit être installé.

Le Dagger CLI (dagger) est l’outil en ligne de commande que vous utilisez pour interagir avec Dagger. C’est votre point d’entrée principal.

Commandes principales :

CommandeDescription
dagger versionAffiche la version installée
dagger initInitialise un module Dagger
dagger callAppelle une fonction de votre module
dagger checkExécute les validations automatiques

Le CLI communique avec l’Engine et affiche les résultats dans un terminal interactif (TUI) qui montre en temps réel ce qui se passe.

Les SDKs vous permettent d’écrire vos pipelines dans un langage de programmation au lieu de YAML. Dagger propose des SDKs pour :

  • Python (c’est notre focus dans cette formation)
  • Go
  • TypeScript
  • PHP, Java, Rust, Elixir, .NET

Chaque SDK fournit :

  • Un client pour appeler l’API Dagger
  • Un générateur pour exposer vos fonctions

Un module Dagger est un ensemble de fonctions packagées ensemble. Quand vous exécutez dagger init, vous créez un module.

Les modules peuvent :

  • Être appelés depuis le CLI
  • Être importés par d’autres modules
  • Être partagés via le DaggerVerse (comme PyPI pour Python)

Pour maîtriser Dagger, vous devez comprendre ces 5 concepts fondamentaux.

Les fonctions Dagger sont l’unité de base de calcul. Une fonction :

  • Accepte des entrées (arguments)
  • Exécute des opérations (souvent dans des conteneurs)
  • Retourne des sorties (fichiers, conteneurs, texte…)

En Python, une fonction Dagger ressemble à ceci :

from dagger import dag, function, object_type
@object_type
class MonPipeline:
@function
def saluer(self, nom: str) -> str:
"""Retourne un message de salutation."""
return f"Bonjour, {nom} !"

Analogie : Une fonction Dagger, c’est comme une recette de cuisine. Elle décrit les ingrédients (entrées), les étapes (opérations), et le plat final (sortie).

Dagger fournit des types pour manipuler les artefacts de vos workflows :

TypeDescriptionExemple d’utilisation
ContainerUne image de conteneurBuilder une application
DirectoryUn répertoire de fichiersMonter du code source
FileUn fichier uniqueRécupérer un binaire compilé
SecretUne valeur sensibleInjecter un token API
ServiceUn service réseauTester avec une base de données

Ces types ont des méthodes que vous enchaînez pour construire votre workflow.

Le chaînage est la technique qui permet d’enchaîner les opérations sur les types. C’est le cœur de la construction des workflows Dagger.

container = (
dag.container() # Crée un conteneur vide
.from_("python:3.12") # Utilise l'image Python
.with_exec(["pip", "install", "flask"]) # Installe Flask
.with_exec(["python", "--version"]) # Affiche la version
)

Chaque méthode retourne un nouveau type, sur lequel vous appelez la méthode suivante. C’est similaire au pipeline Unix (|).

Analogie : C’est comme une chaîne de montage. Chaque station (méthode) transforme le produit (conteneur) avant de le passer à la suivante.

Dagger cache automatiquement les résultats pour accélérer les exécutions. Il existe 3 niveaux de cache :

  1. Layer cache : comme Docker, chaque étape est cachée
  2. Volume cache : pour pip, npm, etc. (cache des dépendances)
  3. Function cache : les appels de fonctions identiques sont réutilisés

Le cache est basé sur le contenu : si les entrées n’ont pas changé, le résultat est réutilisé.

Chiffres réels : Un pipeline qui prend 5 minutes la première fois peut s’exécuter en 10 secondes les fois suivantes grâce au cache.

Les modules permettent de packager et partager des fonctions. Le DaggerVerse (daggerverse.dev) est le registre public où la communauté partage ses modules.

Exemples de modules disponibles :

ModuleDescription
github.com/dagger/dagger/modules/goBuild de projets Go
github.com/dagger/dagger/modules/pythonBuild de projets Python
trivyScan de vulnérabilités

Vous pouvez utiliser ces modules directement ou vous en inspirer.

Voici un tableau récapitulatif des différences :

AspectCI traditionnelleDagger
ConfigurationYAMLCode (Python, Go, TS)
Exécution localeDifficile ou impossibleNative (“local-first”)
DebuggingAjouter des echoIDE, breakpoints, logs
Reproductibilité”Works on CI”Identique partout
PortabilitéVendor-lockedAgnostique (GitLab, GitHub…)
CacheConfiguration manuelleAutomatique
RéutilisationCopier-collerImporter des modules
Tests du pipelinePousser pour testerTester localement
  • Pipelines complexes avec beaucoup de logique conditionnelle
  • Équipes polyvalentes qui maîtrisent Python/Go/TS
  • Portabilité : même pipeline local et CI
  • Debug rapide : feedback en secondes
  • Pipelines très simples (un script de 3 lignes)
  • Équipes 100% ops qui préfèrent le YAML
  • Environnements sans Docker (très rares)

Dagger ne remplace pas GitLab CI ou GitHub Actions. Il complète ces outils.

Votre CI traditionnelle :

  1. Déclenche le pipeline (sur push/merge)
  2. Appelle dagger call avec vos fonctions
  3. Dagger exécute le vrai travail dans des conteneurs

Résultat : un fichier .gitlab-ci.yml ou .github/workflows/ci.yml de 10 lignes qui appelle Dagger, au lieu de centaines de lignes YAML.

# .gitlab-ci.yml (exemple minimal)
build:
image: docker:dind
services:
- docker:dind
variables:
DOCKER_HOST: tcp://docker:2376
DOCKER_TLS_CERTDIR: "/certs"
script:
- apk add curl
- curl -fsSL https://dl.dagger.io/dagger/install.sh | sh
- ./bin/dagger call build --source=.
  • Local-first : exécutez vos pipelines localement avec le même résultat qu’en CI — plus de “push → attendre → lire les logs”
  • Pipelines en code : Python au lieu de YAML, avec boucles, conditions, tests et IDE complet
  • Architecture 3 couches : CLI → Engine → Docker — le CLI parle à l’Engine qui orchestre les conteneurs
  • Cache automatique : 3 niveaux (layers, volumes, fonctions) — premier run = 5 min, runs suivants = 10 sec
  • Fonctions : unité de base, décorées avec @function
  • Types : Container, Directory, File, Secret, Service
  • Chaînage : enchaîner les méthodes pour construire un workflow
  • Modules : packager et partager via le DaggerVerse

Maintenant que vous comprenez le mental model de Dagger, vous êtes prêt à passer à la pratique :

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.