CI/CD : Bâtir des Pipelines 100% Reproductibles avec Nix Flakes

Apprenez à configurer un pipeline de livraison continue hermétique. Éliminez définitivement les dérives d'environnement et les conflits de dépendances en garantissant une parité absolue entre vos postes de dev et votre forge logicielle grâce à Nix.

Mettre fin aux cauchemars de dépendances

Un développeur perplexe regardant deux écrans. L'un affiche un code source au statut vert vif, l'autre affiche un terminal rouge écarlate d'erreur de déploiement continu.

Combien de fois as-tu entendu cette fameuse excuse en équipe ?

"Pourtant, ça marche parfaitement sur ma machine !"

Cette situation bloque les déploiements. Elle génère du stress inutile. Elle détruit la confiance en la forge logicielle.

Le coupable est souvent invisible. Il s'agit de la dérive d'environnement. Ton ordinateur local possède des bibliothèques spécifiques. Le serveur d'intégration continue, lui, en utilise d'autres.

Par conséquent, les tests passent localement mais échouent misérablement en ligne.

Aujourd'hui, nous allons régler ce problème définitivement. Nous allons construire un pipeline hermétique. Ton code ignorera totalement le système d'exploitation sous-jacent.

Le concept de reproductibilité avec Nix

Imagine une bulle parfaitement isolée. Cette bulle contient ton code. Elle contient aussi ses dépendances exactes. Elle inclut même les outils de compilation au bit près.

C'est exactement ce que propose Nix. Cet outil garantit une reproductibilité absolue de tes environnements.

La fin des conflits de versions

Concrètement, Nix n'installe rien globalement. Il place chaque paquet dans un dossier unique cryptographique.

Regardons le chemin classique d'une dépendance.

Au lieu de polluer /usr/bin/ ou /usr/lib/, Nix stocke tout dans /nix/store/.

Tu profites immédiatement de plusieurs avantages majeurs :

  • Les projets ne partagent aucune dépendance globale.
  • Deux versions de Node.js peuvent tourner simultanément.
  • Le cache de compilation se partage entre les développeurs.
  • Un retour en arrière est instantané en cas d'erreur.

Par conséquent, si un projet compile chez toi, il compilera strictement à l'identique sur le pipeline CI/CD.

Architecture de notre pipeline hermétique

Avant de coder, visualisons notre flux de travail. Le schéma suivant illustre l'isolation totale du processus.

Schéma technique moderne aux tons pastel illustrant un flux CI/CD hermétique avec Nix

Le développeur pousse son code. Le runner CI lit un fichier déclaratif unique. Il télécharge uniquement les binaires nécessaires depuis le cache.

C'est d'une efficacité redoutable.

Mise en place de la fondation Nix

Nous allons commencer par le cœur du système. Il nous faut créer un fichier flake.nix à la racine de ton projet.

Le fichier déclaratif universel

Ce fichier remplace tes scripts d'installation fragiles. Il fige l'arbre complet des dépendances.

Ouvre ton terminal. Tape la commande suivante pour initialiser la structure.

Utilise nix flake init dans ton dossier racine.

Voici un exemple minimal pour un projet web classique. Étudie bien sa structure.

{
  description = "Pipeline hermetique de demonstration";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
  };

  outputs = { self, nixpkgs }:
    let
      system = "x86_64-linux";
      pkgs = nixpkgs.legacyPackages.${system};
    in
    {
      devShells.${system}.default = pkgs.mkShell {
        buildInputs = with pkgs; [
          nodejs_20
          yarn
          git
        ];
      };
    };
}

Non seulement nous définissons la version exacte de Node.js. Mais nous lions aussi cet environnement au système cible.

Ton environnement de travail est maintenant scellé cryptographiquement.

Illustration de plusieurs engrenages métalliques brillants s'emboîtant parfaitement. L'un des engrenages porte un cadenas numérique lumineux, symbolisant le verrouillage des dépendances.

Génération du fichier de verrouillage

Il manque une étape cruciale pour l'isolation des processus.

Nous devons générer le fichier flake.lock.

Ce fichier va stocker les empreintes exactes de chaque paquet téléchargé. Exécute simplement cette commande locale.

nix flake update

Pousse ces deux fichiers sur ton dépôt Git. Ils formeront l'unique source de vérité pour ta forge logicielle.

Configuration de l'Intégration Continue

Passons au serveur CI. Ton pipeline n'a plus besoin d'installer Node.js via des actions complexes.

Il lui suffit d'installer Nix et de lancer ton environnement.

Création du Job CI

Voici comment configurer un pipeline typique. La syntaxe est universelle et s'adapte à toute forge moderne.

Optimisation du stockage

Pense à configurer un cache Nix dans ton pipeline. Cela évitera de re-télécharger les dépendances à chaque validation. Le temps d'exécution sera divisé par dix.

Regarde l'élégance de ce fichier de définition de pipeline.

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Installer Nix
        uses: cachix/install-nix-action@v22
      - name: Lancer les tests hermetiques
        run: nix develop --command yarn test

Résultat:

[nix-shell] $ yarn test
yarn run v1.22.19
PASS src/app.test.js
Test Suites: 1 passed, 1 total
Tests:       3 passed, 3 total
Done in 2.14s.

La magie opère ici avec la commande de développement. L'action entre dans la bulle isolée avant d'exécuter les tests.

Si la dépendance n'existe pas localement, Nix la télécharge. Si elle existe, il l'utilise instantanément.

Conclusion du tutoriel

Tu viens de construire un pont indestructible entre ton poste et la production.

Le cauchemar des versions incompatibles est derrière toi. Ton pipeline est devenu prédictible. Les erreurs aléatoires liées au système hôte n'existent plus.

Cette approche demande un léger effort d'apprentissage initial. Pourtant, le gain de temps à long terme est colossal pour l'équipe technique.

Garde ce fichier Flake précieusement. Fais-le évoluer au fil de tes projets. Tu deviendras très vite indispensable à ton équipe de développement.

Espace commentaire

Écrire un commentaire

Rejoignez la discussion

Vous devez être connecté pour poster un message.

26 commentaires

lefort-joseph
Auteur Actif Secouriste
Avatar de lefort-joseph
lefort-joseph
Auteur Actif Secouriste

C'est ça le but. Moins de verbiage, plus de garanties. Pense à regarder la documentation sur les nix-shell pour tes scripts locaux.

19/05/2026 à 06:14

Le fichier flake.nix est vraiment plus simple que les Dockerfile de 50 lignes.

19/05/2026 à 00:02
lefort-joseph
Auteur Actif Secouriste
Avatar de lefort-joseph
lefort-joseph
Auteur Actif Secouriste

Ajoute gcc ou clang dans ton buildInputs. Nix va gérer les liens dynamiques proprement.

18/05/2026 à 18:36

J'ai un souci avec les dépendances natives en C++ lors du build.

18/05/2026 à 13:39
lefort-joseph
Auteur Actif Secouriste
Avatar de lefort-joseph
lefort-joseph
Auteur Actif Secouriste

Ça peut monter vite. Lance nix-collect-garbage -d pour nettoyer les anciennes versions inutilisées.

18/05/2026 à 07:21
gilles-daniel
Membre Rédacteur
Avatar de gilles-daniel
gilles-daniel
Membre Rédacteur

C'est quoi le poids final du dossier /nix/store après un gros projet ? Ça sature vite le disque.

18/05/2026 à 01:16
orobin
Membre Actif
Avatar de orobin
orobin
Membre Actif

C'est quoi la différence entre nix shell et nix develop ?

17/05/2026 à 18:20
lefort-joseph
Auteur Actif Secouriste
Avatar de lefort-joseph
lefort-joseph
Auteur Actif Secouriste
devShells.${system}.default = pkgs.mkShell {
  MY_VAR = "valeur";
};
17/05/2026 à 13:22
hremy
Membre
Avatar de hremy
hremy
Membre

Comment je fais pour ajouter une variable d'environnement dans le devShell ?

17/05/2026 à 07:20
lefort-joseph
Auteur Actif Secouriste
Avatar de lefort-joseph
lefort-joseph
Auteur Actif Secouriste

Installe Nix en mode multi-utilisateur ou utilise un conteneur qui a déjà Nix pré-installé.

17/05/2026 à 01:36
fcaron
Membre
Avatar de fcaron
fcaron
Membre

J'ai une erreur permission denied sur /nix. Je suis pas root sur la machine de CI.

16/05/2026 à 20:11
lefort-joseph
Auteur Actif Secouriste
Avatar de lefort-joseph
lefort-joseph
Auteur Actif Secouriste

Obligatoire. Si tu ne le commit pas, tu perds l'avantage de la reproductibilité totale.

16/05/2026 à 12:35
philippe22
Membre
Avatar de philippe22
philippe22
Membre

Le flake.lock, faut le commiter dans Git ?

16/05/2026 à 05:49
lefort-joseph
Auteur Actif Secouriste
Avatar de lefort-joseph
lefort-joseph
Auteur Actif Secouriste

Tu peux utiliser pkgs.dockerTools.buildLayeredImage directement dans ton flake.nix. C'est indestructible.

15/05/2026 à 22:02
rene-gillet
Membre
Avatar de rene-gillet
rene-gillet
Membre

Ça marche nickel pour le dev, mais pour la prod, comment je crée une image Docker avec ça ?

15/05/2026 à 15:54
lefort-joseph
Auteur Actif Secouriste
Avatar de lefort-joseph
lefort-joseph
Auteur Actif Secouriste

C'est probablement un problème de cache local corrompu. Fais un rm -rf ~/.cache/nix et réessaie.

15/05/2026 à 10:30
edurand
Membre
Avatar de edurand
edurand
Membre

J'ai une erreur de signature avec nix flake update. Un truc lié aux clés publiques ?

15/05/2026 à 05:35
margot64
Membre
Avatar de margot64
margot64
Membre

On peut mixer des paquets de différentes versions de nixpkgs dans un seul flake.nix ?

15/05/2026 à 00:57
lefort-joseph
Auteur Actif Secouriste
Avatar de lefort-joseph
lefort-joseph
Auteur Actif Secouriste

Oui, nix flake init crée un template par défaut qui est parfois trop minimaliste. Utilise celui que j'ai mis dans l'article, il est déjà configuré pour nodejs_20.

14/05/2026 à 19:51
ejean
Membre
Avatar de ejean
ejean
Membre

J'ai testé nix flake init mais le fichier généré est vide. C'est normal ?

14/05/2026 à 13:01
lefort-joseph
Auteur Actif Secouriste
Avatar de lefort-joseph
lefort-joseph
Auteur Actif Secouriste

Utilise cachix. Ça te permet d'avoir un cache binaire distant. Ajoute ça dans ton workflow :

- uses: cachix/cachix-action@v12
  with:
    name: mon-cache-perso
14/05/2026 à 05:04
tpasquier
Membre Actif
Avatar de tpasquier
tpasquier
Membre Actif

Mon pipeline GitHub Actions est super lent au démarrage. Il re-télécharge tout à chaque fois. Comment je cache ça ?

13/05/2026 à 21:17
lefort-joseph
Auteur Actif Secouriste
Avatar de lefort-joseph
lefort-joseph
Auteur Actif Secouriste

Nix est agnostique. Tu peux remplacer nodejs_20 par python3 dans ton flake.nix sans problème.

13/05/2026 à 16:20
yarnaud
Membre
Avatar de yarnaud
yarnaud
Membre

Est-ce que je peux utiliser ça avec un projet Python ou c'est juste pour du Node ?

13/05/2026 à 08:51
lefort-joseph
Auteur Actif Secouriste
Avatar de lefort-joseph
lefort-joseph
Auteur Actif Secouriste

Vérifie que le démon Nix tourne bien. Si tu viens d'installer, le service a peut-être besoin d'un redémarrage. Lance sudo systemctl restart nix-daemon.

13/05/2026 à 04:01

Rejoindre la communauté

Recevoir les derniers articles gratuitement en créant un compte !

S'inscrire