Aller au contenu principal

Dagger un nouvel outil CI/CD

· 3 minutes de lecture
Stéphane ROBERT
Consultant DevOps

Solomom 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 en YAML mais en CUE dérivé de JSON. Un peu comme le HCL 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