Nix flakes et devshells : environnements de développement reproductibles
À la fin de ce tutoriel, vous saurez installer Nix, écrire un
flake.nixavecdevShells.default, entrer dans le shell vianix develop(ou direnv +use flake), comparer Nix / Dev Containers / Homebrew, et dérouler un lab (local + EC2t3.microoptionnelle enca-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-1Slug :
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
- Linux / macOS / WSL2 — sudo (Determinate ou multi-user)
- Bases shell — bash · apt / dnf
- AWS lab (profil
lab) si EC2 — Démarrer avec AWS · EC2 + SSM - Git ; VS Code / Cursor ; Platform Engineering
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
- Dev Containers + Remote SSH · Platform Engineering 2026
- Dagger CI · Installer Terraform · EC2 + SSM
- https://nix.dev · https://nixos.wiki/wiki/Flakes · https://devenv.sh
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)
Pour aller plus loin — hubs live
Retour parcours Catalogue Tutoriels — hub de la série et leçons sœurs.