Migration vers Woodpecker

  1. Installation
  2. Critique
  3. Conclusion

Après avoir testé Gitea Actions (et, spoiler alert, ne pas avoir été convaincu), je poursuis ma quête du remplacement de Drone en tant que CI/CD. J'ai donc essayé (et, spoiler alert, adopté) Woodpecker, fork de Drone.

Pour rappel, la principale raison pour laquelle je souhaite me débarrasser de Drone est l'absence d'intégration avec NixOS. On pourra m'objecter que je n'ai "qu'à le faire moi-même", mais je sais reconnaître quand je ne suis pas capable de faire quelque chose. Le fait est que, à l'heure actuelle, Drone tourne dans un container docker, et je n'en veux plus.

Donc, Woodpecker.

Note : la configuration proposée ici doit être adaptée en fonction de vos prérogatives. En ce qui me concerne, Caddy fait office de reverse-proxy, ma CI/CD est interfacée à Gitea, et Gitea n'est que partiellement ouverte au reste du monde.

Installation

Sous NixOS, la migration est plutôt facile. Il suffit de supprimer les déclarations concernant Drone, et d'ajouter celles pour Woodpecker.

{
  services.woodpecker-server = {
    enable = true;
    environment = {
      # Enable at first launch
#      WOODPECKER_OPEN = "true";
      WOODPECKER_SERVER_ADDR = ":10081";
      WOODPECKER_HOST = "https://<FQDN de votre CI>";
      WOODPECKER_GITEA = "true";
      WOODPECKER_GITEA_CLIENT = builtins.readFile ../secrets/services/woodpecker/gitea-client-id;
      WOODPECKER_GITEA_SECRET = builtins.readFile ../secrets/services/woodpecker/gitea-client-secret;
      WOODPECKER_GITEA_URL = "https://<FQDN de votre instance de Gitea>";
      WOODPECKER_AGENT_SECRET = builtins.readFile ../secrets/services/woodpecker/agent-secret;
    };
  };

  services.woodpecker-agents.agents = {
    minisforum-u820 = {
      enable = true;
      extraGroups = [
        "docker"
      ];
      environment = {
        WOODPECKER_SERVER = "localhost:9000";
        WOODPECKER_AGENT_SECRET = builtins.readFile ../secrets/services/woodpecker/agent-secret;
      };
    };
  };
}

Dans mon cas, le serveur Woodpecker écoute sur le port 10081 sur localhost (je charge Caddy de faire le reverse-proxy pour que ma CI soit joignable depuis WOODPECKER_HOST).

J'ai repris les mêmes secrets que Drone, stockés dans les fichiers lus avec builtins.readFile, je les ai juste mis à un emplacement plus approprié.

Un mot concernant la ligne 6 : il faut la décommenter avant d'accéder à l'interface web de Woodpecker, sinon il ne lui sera pas possible de s'enregistrer auprès de Gitea.

En ce qui me concerne, je veux que ce soit Gitea qui gère les comptes utilisateurs, je n'ai pas envie/besoin de gérer d'autres comptes depuis Woodpecker. C'est la raison pour laquelle, une fois l'étape initiale accomplie, je commente à nouveau cette ligne, de sorte à ce que personne ne puisse s'enregistrer sur ma CI/CD à part moi.

Si vous souhaitez ouvrir votre instance à l'extérieur, la ligne 6 est requise et la variable WOODPECKER_OPEN doit valoir "true".

Le reste est en tout point identique à la configuration habituel de Drone, exception faite du nom des variables, et de l'obligation d'ajouter l'agent au groupe docker, puisque c'est désormais une application "native" et non plus un container.

On notera que l'adresse du serveur déclarée à la ligne 24 est celle du serveur RPC de Woodpecker, et non l'adresse à laquelle on peut afficher l'interface web de Woodpecker.

Critique

Woodpecker est, visuellement, encore assez brut de décoffrage. Ce n'est ni beau ni moche, mais au moins il y a un thème sombre et je ne me brûle plus les yeux... Les contrastes devront être revus par contre.

Pas de coloration syntaxique dans les pipelines, les icônes sont placées de façon peu harmonieuse. Ce sont des détails cosmétiques : ils n'enlèvent rien aux qualités intrinsèques de Woodpecker ; ce sont simplement des témoins de la jeunesse du projet (version 0.15.3 à l'heure où j'écris ces lignes).

Ce qui m'embête - un peu - plus, c'est la déclaration des pipelines.

Les auteurs de Woodpecker semblent avoir eu l'intelligence de supporter la structure de Drone (via le traditionnel fichier .drone-ci.yml) tout en poussant à une nouvelle structure spécifique à Woodpecker (dans un fichier .woodpecker.yml). Cependant, la structure actuelle (de la version 0.15.3) diffère déjà de la structure qui sera proposée dans la prochaine version1.

C'est une critique dure que je fais ici, parce qu'en fin de compte les changements devraient être mineurs, et surtout, les pipelines de Woodpecker semblent moins "verbeuses" que celle de Drone, en tout cas pour le moment. La structure du yaml est un peu simplifiée, et la simplification est - presque - toujours bienvenue.

Conclusion

Il n'y a pas vraiment plus à en dire. Woodpecker semble être une bonne alternative à Drone, dont elle est de toute façon l'héritière. Disposant d'une intégration à NixOS, et à Gitea (tout en restant agnostique), Woodpecker remplit toutes les cases pour devenir le remplaçant de Drone dans mon écosystème.


  1. Voir la documentation actuelle : https://woodpecker-ci.org/docs/usage/plugins/overview (vérifiée le 29 février 2024)