Devops - Dagger un nouvel outil CI/CD
Publié le : 3 avril 2022 | Mis à jour le : 1 mars 2023Solomom Hykes, qui est le fondateur de Docker qu’il a vendu par la suite , lance un nouveau projet nommé Dagger . Dagger à l’ambition de devenir un outil agnostique permettant d’exécuter des pipelines CI/CD. Pour cela les pipelines sont écrit dans un langage déclaratif appelé CUE (configurer, unifier, exécuter). Par la suite, Dagger deviendra une plateforme d’exécution dans le Cloud qui sera optionnel.
Dagger ne cherche pas à remplacer pas nos outils CI/CD habituels, il les améliore en y ajoutant une couche d’abstraction. En effet, Dagger peut tourner sur la plupart des produits de CI/CD existant (Jenkins, Gitalb, Github, …), mais aussi localement.
Les principaux gains que je vois :
- Les
devs
vont être ravie de ne pas écrire leur code enYAML
mais enCUE
dérivé deJSON
. Un peu comme leHCL
d’Hashicorp. - Dagger peut être exécuté localement, et peut remplacer tout autre outil
comme
Makefile
. - On peut de changer de plateforme CI/CD sans rien réécrire.
Installer Dagger
Attention c’est encore un produit en cours de développement et donc sujet à changement. Il y a eu une belle rupture entre la version 0.1 et la 0.2 qui apporte une CLI repensée et l’arrivée d’une API.
cd /usr/local
curl -L https://dl.dagger.io/dagger/install.sh | sudo sh
Débuter avec Dagger
Il faut que Docker soit installé sur le poste de développement, car dagger utilise buildkit pour exécuter les plans.
Le mieux est de télécharger un exemple qui permet de builder, tester et
deployer une application react
.
git clone https://github.com/dagger/todoapp
cd todoapp
dagger project update
dagger do build
Le contenu du fichier cue :
// dagger do hello --log-format=plain
//
// 9:06AM INF actions._alpine | computing
// 9:06AM INF actions._alpine | completed duration=1s
// 9:06AM INF actions.hello | computing
// 9:06AM INF actions.hello | #3 0.073 hello, world!
// 9:06AM INF actions.hello | completed duration=100ms
package helloworld
import (
"dagger.io/dagger"
"dagger.io/dagger/core"
)
dagger.#Plan & {
actions: {
_alpine: core.#Pull & {source: "alpine:3"}
// Hello world
hello: core.#Exec & {
input: _alpine.output
args: ["echo", "hello, world!"]
always: true
}
}
}
Un package Dagger :
- fait appel à des librairies, ici core, mais il en existe d’autres
- contient un plan
dagger.#Plan
- interagit avec des clients : fichiers, …
- exécute des actions
Ici le plan exécute l’action hello qui lance une commande dans un container
construit avec l’image alpine:3
.
Lancement du pipeline
dagger do hello --log-format=plain
1:00PM INF actions._alpine | computing
1:00PM INF actions._alpine | completed duration=2s
1:00PM INF actions.hello | computing
1:00PM INF actions.hello | completed duration=500ms
1:00PM INF actions.hello | #3 0.087 hello, world!
Plus loin
Débuter avec Dagger n’est pas si simple, faut dire que ce nouveau langage est un peu compliqué. Mais je trouve le projet génial et prometteur de par cette volonté de le rendre agnostique et le fait qu’il puisse être exécuté en local : Fini les push à gogo pour les debugger.
Quelques points à éclaircir :
- Comment sont gérés les secrets ?
- Existe-t-il un mode exécution à distance ?
- Factorisation du code, écriture de module, repo ?
- Extension vs code ?
Je compléterai le billet à fait de mes découvertes.
Plus d’infos sur le site du projet dagger.io et github.com