Nix flakes et devshells : environnements de développement reproductibles

À la fin de ce tutoriel, vous saurez installer Nix, écrire un flake.nix avec devShells.default, entrer dans le shell via nix develop (ou direnv + use flake), comparer Nix / Dev Containers / Homebrew, et dérouler un lab (local + EC2 t3.micro optionnelle en ca-central-1) sans secrets dans le flake.

Niveau : Intermédiaire · Temps estimé : 50–70 min · Versions cibles : Nix 2.24+ · flakes stables · direnv 2.x · Node.js 22 · AWS CLI v2 · Terraform 1.x · Dernière vérification : 2026-09-11 · Region : ca-central-1

Slug : wow-nix-devshells · Série : WOW (40/50) · Mot-clé SEO : nix flakes · Publish : LIVE

← Précédent : Dagger CI · → Suivant : Dev Containers + Remote SSH · Aussi : Platform Engineering 2026 · Dev Containers

Prérequis

Coût : 0 € local. EC2 t3.micro ca-central-1 : 0–1 € puis terminate. Pas de NAT, EBS > 8 Go, EIP.

export AWS_PROFILE=lab
export AWS_DEFAULT_REGION=ca-central-1
aws sts get-caller-identity

Ce que nous allons construire

Nix flakes + devshells (WOW 40/50) — ca-central-1
  ├── Pourquoi Nix en 2026 (reproductibilité, pin, pas de drift brew)
  ├── Flakes vs channels ; flake.nix + flake.lock
  ├── Anatomie : inputs, outputs.devShells.default (nodejs_22, awscli2, terraform)
  ├── nix develop · direnv + .envrc (use flake) · mention devenv
  ├── Comparatif : Nix vs Dev Containers vs Homebrew
  ├── Lab : (1) install Nix (2) flake lab (3) nix develop
  │         (4) direnv optionnel (5) EC2 t3.micro optionnel + terminate
  ├── Tip CI + check-list + erreurs fréquentes
  └── Quiz + FAQ + maillage WOW

(Schéma — alt : « flake.nix piné + flake.lock → nix develop / direnv ; outils Node, AWS CLI, Terraform identiques sur laptop et lab ca-central-1 ».)

Étape 1 — Pourquoi Nix en 2026 ?

« Works on my machine » survit aux README brew install : Node 20 vs 22, Terraform divergents, aws v1. La CI n’est pas votre laptop.

Nix décrit l’environnement dans le dépôt : paquets pinés, store isolé (/nix/store). En 2026, flakes = contrat d’équipe : flake.nix + flake.lock = mêmes binaires partout.

C’est l’inner loop du golden path plateforme. Les Dev Containers visent la même repro via Docker ; en 2026 on combine souvent Nix (binaires) et Dev Container (Docker, IDE).

Pression Réponse Nix
Onboarding / drift nix develop / direnv, store isolé
Parité local / CI Même flake + lock dans le job
Multi-outils packages déclaratifs (Node, AWS, TF)

Étape 2 — Flakes vs channels

Historiquement, nix-channel + nix-env -i tirait « la dernière » version : non reproductible.

Approche Repro Usage 2026
Channels Faible Legacy
Flakes Forte (flake.lock) Défaut DEH
devenv Forte (sur flakes) DX languages/services

Activez flakes (Determinate ou experimental-features = nix-command flakes). Plus de nix-env -iA au hasard : tout passe par le flake du repo.

Étape 3 — Anatomie de flake.nix + flake.lock

Fichiers canoniques à la racine :

Fichier Rôle
flake.nix Déclaration : inputs, outputs (packages, devShells, apps)
flake.lock Pins exacts des inputs (commitez-le)
.envrc Optionnel : use flake pour direnv

Exemple minimal DEH (Node 22 + AWS CLI v2 + Terraform) :

{
  description = "DEH lab — nix flakes / devshells (WOW 40)";

  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";

  outputs = { self, nixpkgs }:
    let
      system = "x86_64-linux"; # aarch64-linux / aarch64-darwin / x86_64-darwin
      pkgs = import nixpkgs { inherit system; };
    in {
      devShells.${system}.default = pkgs.mkShell {
        packages = [
          pkgs.nodejs_22
          pkgs.awscli2
          pkgs.terraform
          pkgs.git
        ];
        shellHook = ''
          echo "DEH nix develop — $(node -v) · $(aws --version 2>&1 | head -1)"
          export AWS_PROFILE="''${AWS_PROFILE:-lab}"
          export AWS_DEFAULT_REGION="''${AWS_DEFAULT_REGION:-ca-central-1}"
        '';
      };
    };
}

Jamais de secrets dans flake.nix, shellHook ou .env commité. AWS : profil lab + ca-central-1 hors Git. Commitez flake.lock (SBOM d’outils).

Étape 4 — nix develop, direnv et devenv

nix develop          # entre dans devShells.default
nix develop --command node -v
nix flake metadata   # inputs pinés

direnv charge le flake à chaque cd :

echo 'use flake' > .envrc && direnv allow

devenv (https://devenv.sh) ajoute languages/services sur flakes ; pour ce lab, mkShell suffit. Multi-arch : aarch64-darwin / flake-utils selon le poste.

Étape 5 — Nix vs Dev Containers vs Homebrew

Outil Force Limite Quand DEH
Homebrew / apt Simple Drift global Perso hors équipe
Nix flakes Pin + store isolé Courbe ; cold cache Toolchains
Dev Containers Docker + IDE Daemon ; image Parité Docker / IDE

Pattern 2026 : flake pour les binaires ; Dev Container pour Docker / extensions / Remote SSH. Même repo : flake.nix + .devcontainer/.

Étape 6 — Lab reproductible

6.1 — Installer Nix (local)

# Determinate (flakes ON) — recommandé
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install
# ou multi-user : sh <(curl -L https://nixos.org/nix/install) --daemon
# + experimental-features = nix-command flakes
nix --version && nix flake --help >/dev/null && echo "flakes OK"

6.2 — Scaffold flake lab

mkdir -p wow-nix-lab && cd wow-nix-lab && git init
# flake.nix étape 3 (adapter system)
printf '%sn' '.direnv/' '.env' '*.pem' '.aws/' > .gitignore
echo "# lab WOW 40 — pas de secrets" > README.md
git add flake.nix .gitignore README.md
nix develop   # → flake.lock
git add flake.lock && git commit -m "chore: nix flake lab DEH WOW 40"
node -v && aws --version && terraform version
echo "$AWS_DEFAULT_REGION"   # ca-central-1

6.3 — direnv (optionnel)

echo 'use flake' > .envrc && direnv allow

6.4 — EC2 t3.micro optionnel (ca-central-1)

Pas de SSH 0.0.0.0/0 — SG /32 ou SSM only.

export AWS_PROFILE=lab AWS_DEFAULT_REGION=ca-central-1
aws ec2 run-instances --image-id ami-XXXXXXXX --instance-type t3.micro 
  --iam-instance-profile Name=lab-ec2-profile 
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=deh-nix-lab},{Key=Owner,Value=lab},{Key=Env,Value=lab}]' 
  --count 1

Via SSM : Nix + clone + nix develop. t3.micro juste (cache froid) — POC puis terminate.

6.5 — Cleanup

IID=$(aws ec2 describe-instances --filters Name=tag:Name,Values=deh-nix-lab 
  Name=instance-state-name,Values=running,stopped,pending 
  --query 'Reservations[].Instances[].InstanceId' --output text)
[ -n "$IID" ] && aws ec2 terminate-instances --instance-ids $IID

Pas d’EBS orphelin ni d’EIP. Local : exit ; nix-collect-garbage si besoin.

Étape 7 — Tip CI

- uses: DeterminateSystems/nix-installer-action@main
- uses: DeterminateSystems/magic-nix-cache-action@main
- run: nix develop --command bash -lc 'node -v && aws --version && terraform version'

Même flake.lock = mêmes versions. AWS : OIDC ; région ca-central-1 en env du job, pas dans le store.

Étape 8 — Check-list et anti-patterns

Règle DEH Détail
Pas de secrets dans le flake Ni shellHook ni .env commité
flake.lock versionné Pin = reproductibilité
Profil AWS lab ~/.aws/, région ca-central-1
Flakes ON Pas de channels pour l’équipe
Destruction lab terminate EC2 fin de session
Combiner avec Dev Containers Lien wow-devcontainers-remote

Anti-patterns : nix-env -i au feeling ; lock oublié ; secrets dans le flake ; t3.micro laissé running ; region ≠ ca-central-1.

Erreurs fréquentes

Erreur Impact Correction
Flakes désactivés experimental feature 'flakes' is disabled nix.conf / Determinate
Mauvais system Attribut devShells.… manquant Aligner arch (uname -m)
Secrets dans flake Fuite Git Profil lab + OIDC CI
Cache froid sur t3.micro Timeout / OOM Patience ou laptop ; puis terminate
Region us-east-1 Drift IAM AWS_DEFAULT_REGION=ca-central-1
flake.lock non commité Drift collègues Toujours committer le lock

Quiz (5 questions)

1. Un flake Nix vise surtout à :
– A. Remplacer Kubernetes
– B. Déclarer et piner un environnement reproductible (devShells, lock)
– C. Facturer le store Nix

2. flake.lock sert à :
– A. Stocker des secrets AWS
– B. Figer les inputs (reproductibilité entre machines)
– C. Remplacer nix.conf

3. nix develop vs direnv :
– A. develop : shell explicite ; direnv : charge le flake au cd via .envrc
– B. Identique toujours
– C. direnv interdit flakes

4. Region lab DEH :
– A. us-east-1
– B. ca-central-1
– C. eu-west-3

5. Où mettre les credentials AWS ?
– A. Dans shellHook du flake
– B. Profil lab (~/.aws) / OIDC CI — jamais dans le flake
– C. Dans flake.lock

Réponses : 1‑B · 2‑B · 3‑A · 4‑B · 5‑B

FAQ

Nix remplace-t-il Docker ?

Non. Nix pinne des paquets ; Docker isole process/images. Complémentaires : flake + Dev Container.

Faut-il flakes et channels ?

Non. Flakes + lock en 2026 ; channels = legacy.

macOS Apple Silicon ?

system = "aarch64-darwin" (ou multi-system). Même logique, binaires différents.

devenv est-il obligatoire ?

Non — mkShell suffit. devenv = DX (languages, services) sur flakes.

Comment coller la CI au flake ?

Nix dans le job + nix develop --command … + même lock. Cache (Cachix / magic-nix-cache). Pas de secrets dans le store.

Nix + Remote SSH ?

Oui : SSM/SSH vers EC2 ca-central-1, Nix sur l’hôte, nix develop — voir Dev Containers + Remote SSH.

Pour aller plus loin

Maillage série WOW

← Précédent Dagger CI
→ Suivant Dev Containers + Remote SSH
Aussi Platform Engineering · Dev Containers · Installer Terraform

Meta publication (SEO)

  • Title SEO : Nix flakes et devshells : environnements reproductibles 2026 (guide FR)
  • Meta description : Nix flakes + nix develop + direnv : devshells reproductibles, flake.nix, lab EC2 ca-central-1. FAQ, quiz et check-list DEH.
  • Focus keyword : nix flakes
  • Secondary : nix develop, direnv, devenv, flake.nix, ca-central-1
  • Image : assets/web/devopelastichayway/cover-wow-nix-devshells-1200x630.webp (à générer)
  • Catégorie : WOW / Inner loop · Niveau : Intermédiaire
  • URL cible : https://devopelastichayway.com/tutoriels/wow-nix-devshells/
  • Post live : N/A (nouveau) · slug wow-nix-devshells · Publish : LIVE (feu vert Maître — auto-push)

← Catalogue Tutoriels

Pour aller plus loin — hubs live

Retour parcours Catalogue Tutoriels — hub de la série et leçons sœurs.