Dagger Introduction
Dagger ? Qu’est ce que c’est ?
Dagger est un outil de CI/CD qui a été cofondé par Solomon Hykes, également cofondateur de Docker. Après avoir quitté Docker en 2018, Hykes a lancé Dagger en 2022, visant à révolutionner les pipelines CI/CD en offrant une solution plus flexible et programmable. Dagger permet aux développeurs de définir des pipelines en utilisant des langages de programmation tels que Go, Python ou TypeScript, plutôt que des fichiers de configuration statiques. Cette approche facilite la création de pipelines portables et modulaires, adaptés aux environnements locaux et de production.
Comment vous l’avez compris, fini les plugins au Github Action pour executer en local, puis je vois ici un autre avantage :
Les développeurs pourraient donc maintenant écrire leurs pipelines dans leurs langages préférés et build dans un environnement de bêta exactement la même application que celle qui s’execute sur leurs ordinateurs.
Installation
Il y a plusieurs méthodes d’installation, vous pouvez retrouver le quickstart juste ici https://dagger.io/quickstart Mais, je vous conseille aussi la méthode de Stéphane Robert qui est simple et rapide. Stephane Robert - Dagger
Voici la méthode de Stéphane Robert pour linux :
Et pour MacOs:
Dans le blog de Stéphane Robert, vous pourrez trouver un exemple en python, ici on va faire du TypeScript !
Je vais prendre en exemple ce projet qui est une petite API en Express (GitHub du Projet)
Initialisation
Donc je vais d’abord clone le projet :
Maintenant nous allons initialiser Dagger :
Nous lui avons donc demandé de s’initialiser avec le SDK TypeScript et de mettre tout ce dont il a besoin dans le dossier ./dagger.
Dans le dossier dagger, il y a un dossier src qui contient le index.ts, qui sera notre CI/CD.
On va remplacer le contenu du fichier index.ts par le code suivant :
Le publish me permet de publier le conteneur temporairement sur le registry ttl.sh, juste pour tester. Et comme vous le voyez ensuite, on va créer un container Node.js, on copie les fichiers de notre répertoire dans /src, on monte le cache de node, on change le dossier de travail, on lance npm install, on déclare l’entrypoint du conteneur et enfin on expose le port 8080.
Pour éviter de copier le node_modules, on peut modifier le dagger.json à la racine de notre projet et rajouter cette clé :
Attention !!!
J’ai perdu 1H sur un détail bête…la ‘class’ doit avoir le même nom que votre projet. Sans -, par exemple mon projet s’appelle node-api-demo, alors la class doit être NodeApiDemo.
Dernière configuration, on va aller modifier le fichier package.json dans dragger/src pour rajouter notre package manager.
Très bien, normalement nous avons tout qui est prêt.
Build de notre pipeline
On exécute la pipeline ??
Vous voyez pendant l’exécution qu’on a quelques commandes possibles :
-
w : Ouverture du rendu de la pipeline dans Dagger Cloud
-
+/- : Détail de log
-
q: Quitter la pipeline
Si vous avez un problème, n’hésitez pas à détailler les logs ou encore à faire un docker logs dagger-engine-v0.14.0
Mais ici pas de problème et voici le résultat :
Et voilà le résultat de la pipeline, on a bien notre image docker sur le registre ttl.sh, qu’on va essayer directement !
Je vais donc le run avec docker run :
Notre container répond bien !
Nous pouvons donc intégrer cette CI dans github action ou alors déployer depuis notre poste localement.
Détails
Quelques concept que j’ai oublié de mentionner :
-
call : l’agument call permet d’appeler une fonction spécifique de notre pipeline
-
Ordre d’exécution : Dagger organise automatiquement les pipelines en fonction des dépendances entre elles
-
—source : indique le dossier de notre projet, c’est un argument qui permet de récupérer la valeurs dans la fonction.
Conclusion
Je suis conscient que pour l’instant nous n’avons pas une grosse pipeline, mais l’objectif ici était de découvrir ce logiciel. Je ne vais pas tarder à faire une partie une démo avec Bun et ensuite on fera des pipelines plus conséquentes qui se rapprocheront à un environnement de production.