Pimp my environnement de développement
💅💅💅💅💅💅💅💅💅💅💅💅💅💅💅💅💅💅💅💅💅💅💅
💅💅💅💅💅💅💅💅💅💅💅💅💅💅💅💅💅💅💅💅💅💅💅
✨✨✨✨✨✨✨✨✨✨✨✨✨
✨✨✨✨✨✨✨✨✨✨✨✨✨
Django meetup #50
30.08.2023
😶
🙂
🙂💻🏢
🙂📱😠
✌️😏🥂😎👍🏖️
🤔💻
😩💻
😩📱😡
😣💻
😖💻
😭💻
😤 ⌨️ ✨
👮🥴👮🌄
😶
Prenez soin de vos environnements de développement
Bonjour
Je m’appelle Sylvain

Dans un environnement de développement on trouve…
-
des exécutables (p.ex. Python)
-
des librairies (p.ex. zlib)
-
des services (p.ex. Postgresql)
# C’EST QUOI?
✨✨✨✨✨✨✨✨✨✨✨
Quelques qualités d’un bon environnement
- Minimum d’opérations manuelles
- Reproductible
- Isolé
- Rapide
- Transparent
- Ressemblance avec la prod
- Fournit des outils dédiés au dev
- Multi-plateformes
Qualité
Pre-commit, CI/CD, reproduction de bugs en local.
1.
2.
Coût
Gain de temps lors de l’onboarding d’une nouvelle personne sur le projet ou après changement de machine.
3.
Efficacité
L’équipe qui travaille sur le projet peut se concentrer sur ce qui est important, réduction de la frustration.
# POURQUOI ?
Pourquoi ?
2010
Manuels d’installation
🧘
- Instructions différentes pour chaque OS
- Demande des connaissances en admin système
- Pas du tout reproductible
- Risques d’erreurs
- Perte de temps
Oui mais…

🔥🔥
🔥🔥
🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥
Bref, les manuels d’installation…
- Rapide ✅
- Transparent ✅
- Fournit des outils dédiés au dev ✅
- Multi-plateformes ✅
- Minimum d’opérations manuelles ❌
- Reproductible ❌
- Isolé ❌
- Ressemblance avec la prod ❌
Ne faites pas ça à la maison
/ 10
2010
Manuels d’installation
🔥 / 10
2013
Vagrant
🧘
1 machine virtuelle par projet
Vagrant en théorie
$ vagrant up
✨
✨
✨
✨
✨
✨
✨
Vagrant en pratique
C’est pire lent j’ai envie de mourir
La mise à jour Ruby a tout pété
Le plugin LXC est plus compatible
Personne sait comment rebuilder une box
Bonjour j’utilise Windows
Ça crashe à mort
Les miroirs pour cette version de Debian existent plus
🔥
🔥
🔥
🔥
🔥
🔥
🔥
🔥🔥🔥🔥🔥
🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥
Bref, Vagrant…
- Isolé ✅
- Fournit des outils dédiés au dev ✅
- Transparent 🤷
- Minimum d’opérations manuelles 🤷
- Multi-plateformes 🤷
- Rapide 🤷
- Ressemblance avec la prod ❌
- Reproductible ❌
11 / 20
2010
Manuels d’installation
🔥 / 10
2013
Vagrant
11 / 20
2019
Docker
🧘
1 conteneur par service
Docker en théorie
$ docker-compose up
✨
✨
✨
✨
✨
✨
✨
Docker en pratique
Permission denied: migrations/0001_initial.py
C’est pire lent j’ai envie de mourir
docker-compose rebuild à chaque changement de branche
Comment j’utilise PDB ?
Charger un dump de db ça devrait pas être si compliqué, non ?
Mon IDE trouve pas Black
Pourquoi c’est si compliqué ?

🔥
🔥
🔥
🔥
🔥
🔥
No space left on device
🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥
Bref, Docker…
- Minimum d’opérations manuelles ✅
- Isolé ✅
- Multi-plateformes ✅
- Reproductible 🤷
- Rapide 🤷
- Ressemblance avec la prod 🤷
- Fournit des outils dédiés au dev 🤷
- Transparent ❌
Docker m’a tuer
/ 10
2010
Manuels d’installation
🔥 / 10
2013
Vagrant
11 / 20
2019
Docker
6 / 10
2021
Nix
🧘
Description des paquets avec Nix
Puis installation directement sur l’hôte
Nix est un gestionnaire de paquets multi-plateformes
nixpkgs est une collection de paquets Nix

Un faux paquet Nix, Python style
def my_package(
buildPythonPackage,
fetchFromGitHub,
django_4, dateutil,
django_tables2,
**kwargs
):
version = "1.0.0"
return buildPythonPackage(
pname="my_package",
version=version,
src=fetchFromGitHub(
owner="sephii",
repo="my_package",
rev=f"v{version}",
hash="sha256-s89gs3H//Dc3k6BLZUC4APyDgiWY9LetWAkI+kXQTf8=",
),
buildInputs=[django_4, dateutil, django_tables2],
)
# NIXNIXNIXNIXNIXN
Un vrai paquet Nix
{ buildPythonPackage
, fetchFromGitHub
, django_4
, dateutil
, django_tables2
, ...
}: buildPythonPackage rec {
pname = "my_package";
version = "1.0.0";
src = fetchFromGitHub {
owner = "sephii";
repo = "my_package";
rev = "v${version}";
hash = "sha256-s89gs3H//Dc3k6BLZUC4APyDgiWY9LetWAkI+kXQTf8=";
};
buildInputs = [ django_4 dateutil django_tables2 ];
}
# NIXNIXNIXNIXNIXN
Déclaration d’un environnement Nix (venv)
{ pkgs, ... }: pkgs.mkShell {
venvDir = "./.venv";
packages = [
pkgs.python311
pkgs.python311.pkgs.venvShellHook
pkgs.nodejs
];
postVenvCreation = ''
unset SOURCE_DATE_EPOCH
pip install -r requirements.txt
'';
postShellHook = ''
unset SOURCE_DATE_EPOCH
'';
}
🔥💖🔥💖🔥💖🔥💖🔥💖🔥
Déclaration d’un environnement Nix (nix style)
{ pkgs, ... }: pkgs.mkShell {
packages = [
(pkgs.python311.withPackages (ps: [ ps.django ]))
pkgs.nodejs
];
shellHook = ''${pkgs.fortune}/bin/fortune | ${pkgs.ponysay}/bin/ponysay'';
}
🔥💖🔥💖🔥💖🔥💖🔥💖🔥
Cool tricks
Exécuter un programme pour l’essayer
$ nix run nixpkgs#strawberry
Exécuter un programme pour l’essayer
$ nix run github:sephii/taxi
Créer un environnement temporaire
$ nix-shell -p "python39.withPackages (ps: [ ps.django ps.requests ])"
Générer une image Docker / OCI
pkgs.dockerTools.buildLayeredImage {
name = "myproject";
config.Cmd = [
"${pythonEnv.interpreter} -m gunicorn"
];
}
Bonus
Intégration avec ✨ direnv ✨
⚠️ Mais… ⚠️
Pas de gestion des services
🔥💖🔥💖🔥💖🔥💖🔥💖🔥
Bref, Nix…
- Isolé ✅
- Rapide ✅
- Transparent ✅
- Fournit des outils dédiés au dev ✅
- Multi-plateformes ✅
- Ressemblance avec la prod 🤷
- Minimum d’opérations manuelles ❌
- Reproductible ❌
Poney / 10
2010
Manuels d’installation
🔥 / 10
2013
Vagrant
11 / 20
2019
Docker
6 / 10
2023
devenv
2021
Nix
8 / 10
🧘
Description de l’environnement en Nix
Et génération de procfile pour les services
"Fast, Declarative, Reproducible, and Composable Developer Environments using Nix"
Déclaration d’un environnement devenv avec poetry
{ pkgs, ... }: {
enterShell = ''
echo "Run just -l to see the list of available commands"
'';
languages.python.enable = true;
languages.python.package = pkgs.python311;
languages.python.poetry.enable = true;
languages.python.poetry.activate.enable = true;
processes = {
runserver.exec = "poetry run -- python -m django runserver";
};
services.postgres.enable = true;
services.mailhog.enable = true;
pre-commit.hooks.ruff.enable = true;
pre-commit.hooks.black.enable = true;
scripts.dj.exec = "python -m django $@";
packages = [ pkgs.nodejs-18_x ];
}
💖💖💖💖💖💖💖💖💖💖💖
Besoin d’une CI ?
$ devenv ci
Besoin d’un container ?
$ devenv container
💖💖💖💖💖💖💖💖💖💖💖
Bref, devenv…
- Minimum d’opérations manuelles ✅
- Reproductible ✅
- Isolé ✅
- Rapide ✅
- Transparent ✅
- Fournit des outils dédiés au dev ✅
- Multi-plateformes ✅
- Ressemblance avec la prod 🤷
Tip top / 10
2010
Manuels d’installation
🔥 / 10
2013
Vagrant
11 / 20
2019
Docker
6 / 10
2023
devenv
9.999 / 10
2021
Nix
8 / 10
20xx
devenv++
🧘
💖💖💖💖💖💖💖💖💖💖💖
Ce qu’il manque à devenv pour être number one
- Meilleur support des packages Python avec librairies partagées
- Meilleur support pour le packaging Node (et autres écosystèmes)
- Meilleure doc avec plus d’exemples
Bonus 1
Environnement de développement GeoDjango
Bonus 2
Mon django-template
# RESSOURCES
Nix
https://nixos.org/
https://nix.dev/ (doc)
Direnv
https://github.com/direnv/direnv
Devenv
django-template
😶
🙂
Merci!
@sephi@tooting.ch
sylvain@django-meetups.ch
🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂🙂
😶😶😶😶😶😶😶😶😶😶😶😶😶😶😶😶😶😶😶😶😶😶😶
🏖️🏖️🏖️🏖️🏖️🏖️🏖️🏖️🏖️🏖️🏖️🏖️🏖️
🏖️🏖️🏖️🏖️🏖️🏖️🏖️🏖️🏖️🏖️🏖️🏖️🏖️
Prochain meetup le 01.11.2023!
Pimp my environnement de développement
By Sylvain Roflmao
Pimp my environnement de développement
- 200