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

  1. Minimum d’opérations manuelles
  2. Reproductible
  3. Isolé
  4. Rapide
  5. Transparent
  6. Ressemblance avec la prod
  7. Fournit des outils dédiés au dev
  8. 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

😶

🙂

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