From 208ea90e2f68d279b665fe8867449062db7cd328 Mon Sep 17 00:00:00 2001 From: Fred Pauchet Date: Sun, 24 Apr 2022 19:00:11 +0200 Subject: [PATCH] Working on environment isolation --- asciidoc-to-tex.tex | 200 -------------- chapters/new-project.tex | 69 ++++- chapters/python.tex | 45 +-- chapters/tools.tex | 310 --------------------- chapters/working-in-isolation.tex | 437 ++++++++++++++++++++++++++++++ images/docker.jpg | Bin 0 -> 98105 bytes main.tex | 2 + 7 files changed, 507 insertions(+), 556 deletions(-) create mode 100644 chapters/working-in-isolation.tex create mode 100644 images/docker.jpg diff --git a/asciidoc-to-tex.tex b/asciidoc-to-tex.tex index 3ffbcae..aafd341 100644 --- a/asciidoc-to-tex.tex +++ b/asciidoc-to-tex.tex @@ -1,205 +1,5 @@ -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{def}\NormalTok{ test\_add():} - \ControlFlowTok{assert} \DecValTok{1} \OperatorTok{+} \DecValTok{1} \OperatorTok{==} \StringTok{"argh"} -\end{Highlighting} -\end{Shaded} - - -\begin{Shaded} -\begin{Highlighting}[] -\NormalTok{λ }\ExtensionTok{pytest} -\NormalTok{============================= }\BuiltInTok{test}\NormalTok{ session starts ====================================} -\ExtensionTok{platform}\NormalTok{ ...} -\ExtensionTok{rootdir}\NormalTok{: ...} -\ExtensionTok{plugins}\NormalTok{: django{-}4.1.0} -\ExtensionTok{collected}\NormalTok{ 1 item} - -\ExtensionTok{gwift}\NormalTok{\textbackslash{}test\_models.py F [100\%]} - -\NormalTok{================================== }\ExtensionTok{FAILURES}\NormalTok{ ==========================================} -\ExtensionTok{\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_}\NormalTok{ test\_basic\_add \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_} - - \ExtensionTok{def}\NormalTok{ test\_basic\_add()}\BuiltInTok{:} -\OperatorTok{\textgreater{}} \ExtensionTok{assert}\NormalTok{ 1 + 1 == }\StringTok{"argh"} -\ExtensionTok{E}\NormalTok{ AssertionError: assert (1 + 1) == }\StringTok{\textquotesingle{}argh\textquotesingle{}} - -\ExtensionTok{gwift}\NormalTok{\textbackslash{}test\_models.py:2: AssertionError} - -\NormalTok{=========================== }\ExtensionTok{short}\NormalTok{ test summary info ==================================} -\ExtensionTok{FAILED}\NormalTok{ gwift/test\_models.py::test\_basic\_add {-} AssertionError: assert (1 + 1) == }\StringTok{\textquotesingle{}argh\textquotesingle{}} -\NormalTok{============================== }\ExtensionTok{1}\NormalTok{ failed in 0.10s =====================================} -\end{Highlighting} -\end{Shaded} - -\hypertarget{_couverture_de_code}{% -\subsubsection{Couverture de code}\label{_couverture_de_code}} - - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{\# requirements/base.text} -\NormalTok{[}\ExtensionTok{...}\NormalTok{]} -\ExtensionTok{django\_coverage\_plugin} -\end{Highlighting} -\end{Shaded} - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{\# .coveragerc to control coverage.py} -\NormalTok{[}\ExtensionTok{run}\NormalTok{]} -\ExtensionTok{branch}\NormalTok{ = True} -\ExtensionTok{omit}\NormalTok{ = ../*migrations*} -\ExtensionTok{plugins}\NormalTok{ =} - \ExtensionTok{django\_coverage\_plugin} - -\NormalTok{[}\ExtensionTok{report}\NormalTok{]} -\ExtensionTok{ignore\_errors}\NormalTok{ = True} - -\NormalTok{[}\ExtensionTok{html}\NormalTok{]} -\ExtensionTok{directory}\NormalTok{ = coverage\_html\_report} -\end{Highlighting} -\end{Shaded} - -\begin{Shaded} -\begin{Highlighting}[] -\NormalTok{$ }\ExtensionTok{coverage}\NormalTok{ run {-}{-}source }\StringTok{"."}\NormalTok{ manage.py test} -\NormalTok{$ }\ExtensionTok{coverage}\NormalTok{ report} - - \ExtensionTok{Name}\NormalTok{ Stmts Miss Cover} - \ExtensionTok{{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}} - \ExtensionTok{gwift}\NormalTok{\textbackslash{}gwift\textbackslash{}\_\_init\_\_.py 0 0 100\%} - \ExtensionTok{gwift}\NormalTok{\textbackslash{}gwift\textbackslash{}settings.py 17 0 100\%} - \ExtensionTok{gwift}\NormalTok{\textbackslash{}gwift\textbackslash{}urls.py 5 5 0\%} - \ExtensionTok{gwift}\NormalTok{\textbackslash{}gwift\textbackslash{}wsgi.py 4 4 0\%} - \ExtensionTok{gwift}\NormalTok{\textbackslash{}manage.py 6 0 100\%} - \ExtensionTok{gwift}\NormalTok{\textbackslash{}wish\textbackslash{}\_\_init\_\_.py 0 0 100\%} - \ExtensionTok{gwift}\NormalTok{\textbackslash{}wish\textbackslash{}admin.py 1 0 100\%} - \ExtensionTok{gwift}\NormalTok{\textbackslash{}wish\textbackslash{}models.py 49 16 67\%} - \ExtensionTok{gwift}\NormalTok{\textbackslash{}wish\textbackslash{}tests.py 1 1 0\%} - \ExtensionTok{gwift}\NormalTok{\textbackslash{}wish\textbackslash{}views.py 6 6 0\%} - \ExtensionTok{{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}{-}} - \ExtensionTok{TOTAL}\NormalTok{ 89 32 64\%} - \ExtensionTok{{-}{-}{-}{-}} - -\NormalTok{$ }\ExtensionTok{coverage}\NormalTok{ html} -\end{Highlighting} -\end{Shaded} - - - -\hypertarget{_duxe9marrer_un_nouveau_projet}{% -\section{Démarrer un nouveau -projet}\label{_duxe9marrer_un_nouveau_projet}} - -\hypertarget{_travailler_en_isolation}{% -\subsection{Travailler en isolation}\label{_travailler_en_isolation}} - -Nous allons aborder la gestion et l'isolation des dépendances. Cette -section est aussi utile pour une personne travaillant seule, que pour -transmettre les connaissances à un nouveau membre de l'équipe ou pour -déployer l'application elle-même. - -Il en était déjà question au deuxième point des 12 facteurs: même dans -le cas de petits projets, il est déconseillé de s'en passer. Cela évite -les déploiements effectués à l'arrache à grand renfort de \texttt{sudo} -et d'installation globale de dépendances, pouvant potentiellement -occasioner des conflits entre les applications déployées: - -\begin{enumerate} -\def\labelenumi{\arabic{enumi}.} -\item - Il est tout à fait envisagable que deux applications différentes - soient déployées sur un même hôte, et nécessitent chacune deux - versions différentes d'une même dépendance. -\item - Pour la reproductibilité d'un environnement spécifique, cela évite - notamment les réponses type "Ca juste marche chez moi", puisque la - construction d'un nouvel environnement fait partie intégrante du - processus de construction et de la documentation du projet; grâce à - elle, nous avons la possibilité de construire un environnement sain et - d'appliquer des dépendances identiques, quelle que soit la machine - hôte. -\end{enumerate} - -\includegraphics{images/it-works-on-my-machine.jpg} - -Dans la suite de ce chapitre, nous allons considérer deux projets -différents: - -\begin{enumerate} -\def\labelenumi{\arabic{enumi}.} -\item - Gwift, une application permettant de gérer des listes de souhaits -\item - Khana, une application de suivi d'apprentissage pour des élèves ou - étudiants. -\end{enumerate} - -\hypertarget{_roulements_de_versions}{% -\subsubsection{Roulements de versions}\label{_roulements_de_versions}} - -Django fonctionne sur un -\href{https://docs.djangoproject.com/en/dev/internals/release-process/}{roulement -de trois versions mineures pour une version majeure}, clôturé par une -version LTS (\emph{Long Term Support}). - -\includegraphics{images/django-support-lts.png} - -La version utilisée sera une bonne indication à prendre en considération -pour nos dépendances, puisqu'en visant une version particulière, nous ne -devrons pratiquement pas nous soucier (bon, un peu quand même, mais nous -le verrons plus tard\ldots\hspace{0pt}) des dépendances à installer, -pour peu que l'on reste sous un certain seuil. - -Dans les étapes ci-dessous, nous épinglerons une version LTS afin de -nous assurer une certaine sérénité d'esprit (= dont nous ne occuperons -pas pendant les 3 prochaines années). - -\hypertarget{_environnements_virtuels}{% -\subsubsection{Environnements virtuels}\label{_environnements_virtuels}} - -\begin{figure} -\centering -\includegraphics{images/xkcd-1987.png} -\caption{\url{https://xkcd.com/1987}} -\end{figure} - -Un des reproches que l'on peut faire au langage concerne sa versatilité: -il est possible de réaliser beaucoup de choses, mais celles-ci ne sont -pas toujours simples ou directes. Pour quelqu'un qui débarquererait, la -quantité d'options différentes peut paraître rebutante. Nous pensons -notamment aux environnements virtuels: ils sont géniaux à utiliser, mais -on est passé par virtualenv (l'ancêtre), virtualenvwrapper (sa version -améliorée et plus ergonomique), \texttt{venv} (la version intégrée -depuis la version 3.3 de l'interpréteur, et -\href{https://docs.python.org/3/library/venv.html}{la manière -recommandée} de créer un environnement depuis la 3.5). - -Pour créer un nouvel environnement, vous aurez donc besoin: - -\begin{enumerate} -\def\labelenumi{\arabic{enumi}.} -\item - D'une installation de Python - \url{https://www.python.org/} -\item - D'un terminal - voir le point - \href{../environment/_index.xml\#un-terminal}{Un terminal} -\end{enumerate} - -Il existe plusieurs autres modules permettant d'arriver au même -résultat, avec quelques avantages et inconvénients pour chacun d'entre -eux. Le plus prometteur d'entre eux est -\href{https://python-poetry.org/}{Poetry}, qui dispose d'une interface -en ligne de commande plus propre et plus moderne que ce que PIP propose. - -Poetry se propose de gérer le projet au travers d'un fichier -pyproject.toml. TOML (du nom de son géniteur, Tom Preston-Werner, -légèrement CEO de GitHub à ses heures), se place comme alternative aux -formats comme JSON, YAML ou INI. - \begin{Shaded} \begin{Highlighting}[] \ExtensionTok{La}\NormalTok{ commande poetry new }\OperatorTok{\textless{}}\NormalTok{project}\OperatorTok{\textgreater{}}\NormalTok{ créera une structure par défaut relativement compréhensible:} diff --git a/chapters/new-project.tex b/chapters/new-project.tex index afff66b..882cb15 100644 --- a/chapters/new-project.tex +++ b/chapters/new-project.tex @@ -1,11 +1,21 @@ \chapter{Démarrer un nouveau projet} -chaque application est créée par défaut avec un fichier \textbf{tests.py}, qui inclut la classe \texttt{TestCase} depuis le package \texttt{django.test}: -Comme indiqué ci-dessus, Django propose son propre cadre de tests, au travers du package \texttt{django.tests}. +Django fonctionne sur un +\href{https://docs.djangoproject.com/en/dev/internals/release-process/}{roulement de trois versions mineures pour une version majeure}, clôturé par une version LTS (\emph{Long Term Support}). + +\includegraphics{images/django-support-lts.png} + +La version utilisée sera une bonne indication à prendre en considération pour nos dépendances, puisqu'en visant une version particulière, nous ne devrons pratiquement pas nous soucier (bon, un peu quand même, mais nous le verrons plus tard\ldots\hspace{0pt}) des dépendances à installer, pour peu que l'on reste sous un certain seuil. + +Dans les étapes ci-dessous, nous épinglerons une version LTS afin de nous assurer une certaine sérénité d'esprit (= dont nous ne occuperons pas pendant les 3 prochaines années). + \section{Tests unitaires} +Chaque application est créée par défaut avec un fichier \textbf{tests.py}, qui inclut la classe \texttt{TestCase} depuis le package \texttt{django.test}: + + On a deux choix ici: \begin{enumerate} @@ -26,3 +36,58 @@ On a deux choix ici: \subsection{Pytest} +\subsection{Couverture de code} + +La couverture de code est une analyse qui donne un pourcentage lié à la quantité de code couvert par les tests. Il ne s'agit pas de vérifier que le code est bien testé, mais de vérifier quelle partie du code est testée. +Le paquet coverage se charge d’évaluer le pourcentage de code couvert par les tests. +Avec pytest, il convient d’utiliser le paquet pytest-cov, suivi de la commande pytest +--cov=gwift tests/. +Si vous préférez rester avec le cadre de tests de Django, vous pouvez passer par le paquet django-coverage-plugin. +Ajoutez-le dans le fichier requirements/base.txt, et lancez une couverture de code grâce à la commande coverage. +La configuration peut se faire dans un fichier .coveragerc que vous placerez à la racine de votre projet, et qui sera lu lors de l’exécution. + + +\begin{verbatim} + # requirements/base.text + [...] + django_coverage_plugin +\end{verbatim} + +\begin{verbatim} + # .coveragerc to control coverage.py + [run] + branch = True + omit = ../*migrations* + plugins = + django_coverage_plugin + + [report] + ignore_errors = True + + [html] + directory = coverage_html_report +\end{verbatim} + +\begin{verbatim} + $ coverage run --source "." manage.py test + + $ coverage report + + Name Stmts Miss Cover + --------------------------------------------- + gwift\gwift\__init__.py 0 0 100% + gwift\gwift\settings.py 17 0 100% + gwift\gwift\urls.py 5 5 0% + gwift\gwift\wsgi.py 4 4 0% + gwift\manage.py 6 0 100% + gwift\wish\__init__.py 0 0 100% + gwift\wish\admin.py 1 0 100% + gwift\wish\models.py 49 16 67% + gwift\wish\tests.py 1 1 0% + gwift\wish\views.py 6 6 0% + --------------------------------------------- + TOTAL 89 32 64% + ---- + $ coverage html + +\end{verbatim} diff --git a/chapters/python.tex b/chapters/python.tex index dff24da..c306cd3 100644 --- a/chapters/python.tex +++ b/chapters/python.tex @@ -695,50 +695,6 @@ TODO: Intérêt des containers. Décrire le fichier setup.cfg. -\section{Docker \& Dockerfile} - -\begin{listing} - \begin{verbatim} - # Dockerfile - - # Pull base image - FROM python:3.8-slim-buster - - # Set environment variables - ENV PYTHONDONTWRITEBYTECODE 1 - ENV PYTHONUNBUFFERED 1 - ENV DEBIAN_FRONTEND noninteractive - ENV ACCEPT_EULA=Y - - # install Microsoft SQL Server requirements. - ENV ACCEPT_EULA=Y - RUN apt-get update -y && apt-get update \ - && apt-get install -y --no-install-recommends curl gcc g++ gnupg - - - # Add SQL Server ODBC Driver 17 - RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - - RUN curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list - RUN apt-get update \ - && apt-get install -y msodbcsql17 unixodbc-dev - - # clean the install. - RUN apt-get -y clean - - # Set work directory - WORKDIR /code - - # Install dependencies - COPY ./requirements/base.txt /code/requirements/ - RUN pip install --upgrade pip - RUN pip install -r ./requirements/base.txt - - # Copy project - COPY . /code/ - - \end{verbatim} - \caption{Un exemple de Dockerfile} -\end{listing} \section{Makefile} @@ -772,6 +728,7 @@ reste extrêmement efficace. + \section{Conclusions (et intégration continue)} Mypy + black + pylint + flake8 + pyflakes + ... diff --git a/chapters/tools.tex b/chapters/tools.tex index f61a675..ff1e45f 100644 --- a/chapters/tools.tex +++ b/chapters/tools.tex @@ -180,314 +180,4 @@ Most websites don't need that kind of throughput. \cite{consider_sqlite} \end{quote} -\section{Un système de virtualisation} -Par "\emph{système de virtualisation}", nous entendons n'importe quel application, système d'exploitation, système de containeurisation, ... qui permette de créer ou recréer un environnement de -développement aussi proche que celui en production. -Les solutions sont nombreuses: - -\begin{itemize} -\item - \href{https://www.virtualbox.org/}{VirtualBox} -\item - \href{https://www.vagrantup.com/}{Vagrant} -\item - \href{https://www.docker.com/}{Docker} -\item - \href{https://linuxcontainers.org/lxc/}{Linux Containers (LXC)} -\item - \href{https://docs.microsoft.com/fr-fr/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v}{Hyper-V} -\end{itemize} - -Ces quelques propositions se situent un cran plus loin que la "simple" isolation d'un environnement, puisqu'elles vous permettront de construire un environnement complet. -Elles constituent donc une étape supplémentaires dans la configuration de votre espace de travail, mais en amélioreront la qualité. - -Dans la suite, nous détaillerons Vagrant et Docker, qui constituent deux solutions automatisables et multiplateformes, dont la configuration peut faire partie intégrante de vos sources. - -\subsection{Vagrant} - -Vagrant consiste en un outil de création et de gestion d'environnements virtualisés, en respectant toujours une même manière de travailler, indépendamment des choix techniques et de l'infrastructure que vous pourriez sélectionner. - -\begin{quote} - Vagrant is a tool for building and managing virtual machine environments - in a single workflow. With an easy-to-use workflow and focus on - automation, Vagrant lowers development environment setup time, increases - production parity, and makes the "works on my machine" excuse a relic of - the past. \footnote{\url{https://www.vagrantup.com/intro}} - \end{quote} - - La partie la plus importante de la configuration de Vagrant pour votre - projet consiste à placer un fichier \texttt{Vagrantfile} - \emph{a - priori} à la racine de votre projet - et qui contiendra les information - suivantes: - - \begin{itemize} - \item - Le choix du \emph{fournisseur} (\textbf{provider}) de virtualisation - (Virtualbox, Hyper-V et Docker sont natifs; il est également possible - de passer par VMWare, AWS, etc.) - \item - Une \emph{box}, qui consiste à lui indiquer le type et la version - attendue du système virtualisé (Debian 10, Ubuntu 20.04, etc. - et - \href{https://app.vagrantup.com/boxes/search}{il y a du choix}). - \item - La manière dont la fourniture (\textbf{provisioning}) de - l'environnement doit être réalisée: scripts Shell, fichiers, Ansible, - Puppet, Chef, \ldots\hspace{0pt} Choisissez votre favori :-) même s'il - est toujours possible de passer par une installation et une - maintenance manuelle, après s'être connecté sur la machine. - \item - Si un espace de stockage doit être partagé entre la machine virtuelle - et l'hôte - \item - Les ports qui doivent être transmis de la machine virtuelle vers - l'hôte. - \end{itemize} - -La syntaxe de ce fichier \texttt{Vagrantfile} est en \href{https://www.ruby-lang.org/en/}{Ruby}. -Vous trouverez ci-dessous un exemple, généré (et nettoyé) après avoir exécuté la commande \texttt{vagrant\ init}: - -\begin{listing}[H] - \begin{minted}{ruby} - # -*- mode: ruby -*- - # vi: set ft=ruby : - - Vagrant.configure("2") do |config| - - config.vm.box = "ubuntu/bionic64" - config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: - "127.0.0.1" - - config.vm.provider "virtualbox" do |vb| - vb.gui = true - vb.memory = "1024" - end - - config.vm.provision "shell", inline: <<-SHELL - apt-get update - apt-get install -y nginx - SHELL - end - \end{minted} -\end{listing} - -Dans le fichier ci-dessus, nous créons: - -\begin{itemize} -\item - Une nouvelle machine virtuelle (ie. \emph{invitée}) sous Ubuntu Bionic Beaver, en x64 -\item - Avec une correspondance du port \texttt{80} de la machine vers le port \texttt{8080} de l'hôte, en limitant l'accès à celui-ci - accédez à \texttt{localhost:8080} et vous accéderez au port \texttt{80} de la machine virtuelle. -\item - En utilisant Virtualbox comme backend - la mémoire vive allouée sera limitée à 1Go de RAM et nous ne voulons pas voir l'interface graphique au démarrage -\item - Et pour finir, nous voulons appliquer un script de mise à jour \texttt{apt-get\ update} et installer le paquet \texttt{nginx} -\end{itemize} - -Par défaut, le répertoire courant (ie. le répertoire dans lequel notre fichier \texttt{Vagrantfile} se trouve) sera synchronisé dans le répertoire \texttt{/vagrant} sur la machine invitée. - -\subsection{Docker} - -(copié/collé de cookie-cutter) - -\begin{listing}[H] - \begin{verbatim} - version: '3' - - volumes: - local_postgres_data: {} - local_postgres_data_backups: {} - - services: - << description des services >> - \end{verbatim} -\end{listing} - -\begin{listing}[H] - \begin{verbatim} - django: &django - build: - context: . - dockerfile: ./compose/local/django/Dockerfile - image: khana_local_django - container_name: django - depends_on: - - postgres - volumes: - - .:/app:z - env_file: - - ./.envs/.local/.django - - ./.envs/.local/.postgres - ports: - - "8000:8000" - command: /start - \end{verbatim} -\end{listing} - -\begin{listing}[H] - \begin{verbatim} - postgres: - build: - context: . - dockerfile: ./compose/production/postgres/Dockerfile - image: khana_production_postgres - container_name: postgres - volumes: - - local_postgres_data:/var/lib/postgresql/data:Z - - local_postgres_data_backups:/backups:z - env_file: - - ./.envs/.local/.postgres - \end{verbatim} -\end{listing} - -\begin{listing}[H] - \begin{verbatim} - docs: - image: khana_local_docs - container_name: docs - build: - context: . - dockerfile: ./compose/local/docs/Dockerfile - env_file: - - ./.envs/.local/.django - volumes: - - ./docs:/docs:z - - ./config:/app/config:z - - ./khana:/app/khana:z - ports: - - "7000:7000" - command: /start-docs - \end{verbatim} -\end{listing} - -\begin{listing}[H] - \begin{verbatim} - redis: - image: redis:5.0 - container_name: redis - \end{verbatim} -\end{listing} - -\begin{listing}[H] - \begin{verbatim} - celeryworker: - <<: *django - image: khana_local_celeryworker - container_name: celeryworker - depends_on: - - redis - - postgres - ports: [] - command: /start-celeryworker - \end{verbatim} -\end{listing} - -\begin{listing}[H] - \begin{verbatim} - celerybeat: - <<: *django - image: khana_local_celerybeat - container_name: celerybeat - depends_on: - - redis - - postgres - ports: [] - command: /start-celerybeat - \end{verbatim} -\end{listing} - -\begin{listing}[H] - \begin{verbatim} - flower: - <<: *django - image: khana_local_flower - container_name: flower - ports: - - "5555:5555" - command: /start-flower - \end{verbatim} -\end{listing} - -\subsection{Docker-compose} - -\begin{listing}[H] - \begin{verbatim} - # docker-compose.yml - - version: '3.8' - services: - web: - build: . - command: python /code/manage.py runserver 0.0.0.0:8000 - volumes: - - .:/code - ports: - - 8000:8000 - depends_on: - - slqserver - - slqserver: - image: mcr.microsoft.com/mssql/server:2019-latest - environment: - - "ACCEPT_EULA=Y" - - "SA_PASSWORD=sqklgjqihagrtdgqk12§!" - ports: - - 1433:1433 - volumes: - - ../sqlserver/data:/var/opt/mssql/data - - ../sqlserver/log:/var/opt/mssql/log - - ../sqlserver/secrets:/var/opt/mssql/secrets - \end{verbatim} -\end{listing} - -\subsection{Dockerfile} - -\begin{listing}[H] -\begin{verbatim} - FROM python:3.8-slim-buster - - ENV PYTHONUNBUFFERED 1 - ENV PYTHONDONTWRITEBYTECODE 1 - - RUN apt-get update \ - - # dependencies for building Python packages - && apt-get install -y build-essential \ - # psycopg2 dependencies - && apt-get install -y libpq-dev \ - # Translations dependencies - && apt-get install -y gettext \ - # cleaning up unused files - && apt-get purge -y --auto-remove -o - APT::AutoRemove::RecommendsImportant=false \ - && rm -rf /var/lib/apt/lists/* - - # Requirements are installed here to ensure they will be cached. - COPY ./requirements /requirements - RUN pip install -r /requirements/local.txt - - COPY ./compose/production/django/entrypoint /entrypoint - RUN sed -i 's/\r$//g' /entrypoint - RUN chmod +x /entrypoint - - COPY ./compose/local/django/start /start - RUN sed -i 's/\r$//g' /start - RUN chmod +x /start - - COPY ./compose/local/django/celery/worker/start /start-celeryworker - RUN sed -i 's/\r$//g' /start-celeryworker - RUN chmod +x /start-celeryworker - - COPY ./compose/local/django/celery/beat/start /start-celerybeat - RUN sed -i 's/\r$//g' /start-celerybeat - RUN chmod +x /start-celerybeat - - COPY ./compose/local/django/celery/flower/start /start-flower - RUN sed -i 's/\r$//g' /start-flower - RUN chmod +x /start-flower - - WORKDIR /app - - ENTRYPOINT ["/entrypoint"] -\end{verbatim} -\end{listing} diff --git a/chapters/working-in-isolation.tex b/chapters/working-in-isolation.tex new file mode 100644 index 0000000..fb75b58 --- /dev/null +++ b/chapters/working-in-isolation.tex @@ -0,0 +1,437 @@ + +\chapter{Travailler en isolation} + +Nous allons aborder la gestion et l'isolation des dépendances. Cette +section est aussi utile pour une personne travaillant seule, que pour +transmettre les connaissances à un nouveau membre de l'équipe ou pour +déployer l'application elle-même. + +Il en était déjà question au deuxième point des 12 facteurs: même dans +le cas de petits projets, il est déconseillé de s'en passer. Cela évite +les déploiements effectués à l'arrache à grand renfort de \texttt{sudo} +et d'installation globale de dépendances, pouvant potentiellement +occasioner des conflits entre les applications déployées: + +\begin{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + Il est tout à fait envisagable que deux applications différentes + soient déployées sur un même hôte, et nécessitent chacune deux + versions différentes d'une même dépendance. +\item + Pour la reproductibilité d'un environnement spécifique, cela évite + notamment les réponses type "Ca juste marche chez moi", puisque la + construction d'un nouvel environnement fait partie intégrante du + processus de construction et de la documentation du projet; grâce à + elle, nous avons la possibilité de construire un environnement sain et + d'appliquer des dépendances identiques, quelle que soit la machine + hôte. +\end{enumerate} + +\includegraphics{images/it-works-on-my-machine.jpg} + +\section{Environnements virtuels} + +\begin{figure} + \centering + \includegraphics{images/xkcd-1987.png} + \caption{\url{https://xkcd.com/1987}} + \end{figure} + +Un des reproches que l'on peut faire au langage concerne sa versatilité: il est possible de réaliser beaucoup de choses, mais celles-ci ne sont +pas toujours simples ou directes. +Pour quelqu'un qui débarquererait, la quantité d'options différentes peut paraître rebutante. Nous pensons notamment aux environnements virtuels: ils sont géniaux à utiliser, mais on est passé par virtualenv (l'ancêtre), virtualenvwrapper (sa version améliorée et plus ergonomique), \texttt{venv} (la version intégrée depuis la version 3.3 de l'interpréteur, et \href{https://docs.python.org/3/library/venv.html}{la manière recommandée} de créer un environnement depuis la 3.5). + +Pour créer un nouvel environnement, vous aurez donc besoin: + +\begin{enumerate} +\item + D'une installation de Python - \url{https://www.python.org/} +\item + D'un terminal - voir le point \href{../environment/_index.xml\#un-terminal}{Un terminal} +\end{enumerate} + + +Il existe plusieurs autres modules permettant d'arriver au même résultat, avec quelques avantages et inconvénients pour chacun d'entre eux. +Le plus prometteur d'entre eux est \href{https://python-poetry.org/}{Poetry}, qui dispose d'une interface +en ligne de commande plus propre et plus moderne que ce que PIP propose. + + +\subsection{Poetry} + +Poetry se propose de gérer le projet au travers d'un fichier pyproject.toml. +TOML (du nom de son géniteur, Tom Preston-Werner, légèrement CEO de GitHub à ses heures), se place comme alternative aux formats comme JSON, YAML ou INI. + + +\begin{verbatim} + $ poetry new django-gecko + $ tree django-gecko/ + django-gecko/ + django_gecko + __init__.py + pyproject.toml + README.rst + tests + __init__.py + test_django_gecko.py + 2 directories, 5 files +\end{verbatim} + +\section{Un système de virtualisation} + +Par "\emph{système de virtualisation}", nous entendons n'importe quel application, système d'exploitation, système de containeurisation, ... qui permette de créer ou recréer un environnement de +développement aussi proche que celui en production. +Les solutions sont nombreuses: + +\begin{itemize} +\item + \href{https://www.virtualbox.org/}{VirtualBox} +\item + \href{https://www.vagrantup.com/}{Vagrant} +\item + \href{https://www.docker.com/}{Docker} +\item + \href{https://linuxcontainers.org/lxc/}{Linux Containers (LXC)} +\item + \href{https://docs.microsoft.com/fr-fr/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v}{Hyper-V} +\end{itemize} + +Ces quelques propositions se situent un cran plus loin que la "simple" isolation d'un environnement, puisqu'elles vous permettront de construire un environnement complet. +Elles constituent donc une étape supplémentaires dans la configuration de votre espace de travail, mais en amélioreront la qualité. + +Dans la suite, nous détaillerons Vagrant et Docker, qui constituent deux solutions automatisables et multiplateformes, dont la configuration peut faire partie intégrante de vos sources. + +\subsection{Vagrant} + +Vagrant consiste en un outil de création et de gestion d'environnements virtualisés, en respectant toujours une même manière de travailler, indépendamment des choix techniques et de l'infrastructure que vous pourriez sélectionner. + +\begin{quote} + Vagrant is a tool for building and managing virtual machine environments + in a single workflow. With an easy-to-use workflow and focus on + automation, Vagrant lowers development environment setup time, increases + production parity, and makes the "works on my machine" excuse a relic of + the past. \footnote{\url{https://www.vagrantup.com/intro}} + \end{quote} + + La partie la plus importante de la configuration de Vagrant pour votre + projet consiste à placer un fichier \texttt{Vagrantfile} - \emph{a + priori} à la racine de votre projet - et qui contiendra les information + suivantes: + + \begin{itemize} + \item + Le choix du \emph{fournisseur} (\textbf{provider}) de virtualisation + (Virtualbox, Hyper-V et Docker sont natifs; il est également possible + de passer par VMWare, AWS, etc.) + \item + Une \emph{box}, qui consiste à lui indiquer le type et la version + attendue du système virtualisé (Debian 10, Ubuntu 20.04, etc. - et + \href{https://app.vagrantup.com/boxes/search}{il y a du choix}). + \item + La manière dont la fourniture (\textbf{provisioning}) de + l'environnement doit être réalisée: scripts Shell, fichiers, Ansible, + Puppet, Chef, \ldots\hspace{0pt} Choisissez votre favori :-) même s'il + est toujours possible de passer par une installation et une + maintenance manuelle, après s'être connecté sur la machine. + \item + Si un espace de stockage doit être partagé entre la machine virtuelle + et l'hôte + \item + Les ports qui doivent être transmis de la machine virtuelle vers + l'hôte. + \end{itemize} + +La syntaxe de ce fichier \texttt{Vagrantfile} est en \href{https://www.ruby-lang.org/en/}{Ruby}. +Vous trouverez ci-dessous un exemple, généré (et nettoyé) après avoir exécuté la commande \texttt{vagrant\ init}: + +\begin{listing}[H] + \begin{minted}{ruby} + # -*- mode: ruby -*- + # vi: set ft=ruby : + + Vagrant.configure("2") do |config| + + config.vm.box = "ubuntu/bionic64" + config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: + "127.0.0.1" + + config.vm.provider "virtualbox" do |vb| + vb.gui = true + vb.memory = "1024" + end + + config.vm.provision "shell", inline: <<-SHELL + apt-get update + apt-get install -y nginx + SHELL + end + \end{minted} +\end{listing} + +Dans le fichier ci-dessus, nous créons: + +\begin{itemize} +\item + Une nouvelle machine virtuelle (ie. \emph{invitée}) sous Ubuntu Bionic Beaver, en x64 +\item + Avec une correspondance du port \texttt{80} de la machine vers le port \texttt{8080} de l'hôte, en limitant l'accès à celui-ci - accédez à \texttt{localhost:8080} et vous accéderez au port \texttt{80} de la machine virtuelle. +\item + En utilisant Virtualbox comme backend - la mémoire vive allouée sera limitée à 1Go de RAM et nous ne voulons pas voir l'interface graphique au démarrage +\item + Et pour finir, nous voulons appliquer un script de mise à jour \texttt{apt-get\ update} et installer le paquet \texttt{nginx} +\end{itemize} + +Par défaut, le répertoire courant (ie. le répertoire dans lequel notre fichier \texttt{Vagrantfile} se trouve) sera synchronisé dans le répertoire \texttt{/vagrant} sur la machine invitée. + +\subsection{Docker} + +\includegraphics{images/docker.jpg} + +(copié/collé de cookie-cutter) + +\begin{listing}[H] + \begin{verbatim} + version: '3' + + volumes: + local_postgres_data: {} + local_postgres_data_backups: {} + + services: + << description des services >> + \end{verbatim} +\end{listing} + +\begin{listing}[H] + \begin{verbatim} + django: &django + build: + context: . + dockerfile: ./compose/local/django/Dockerfile + image: khana_local_django + container_name: django + depends_on: + - postgres + volumes: + - .:/app:z + env_file: + - ./.envs/.local/.django + - ./.envs/.local/.postgres + ports: + - "8000:8000" + command: /start + \end{verbatim} +\end{listing} + +\begin{listing}[H] + \begin{verbatim} + postgres: + build: + context: . + dockerfile: ./compose/production/postgres/Dockerfile + image: khana_production_postgres + container_name: postgres + volumes: + - local_postgres_data:/var/lib/postgresql/data:Z + - local_postgres_data_backups:/backups:z + env_file: + - ./.envs/.local/.postgres + \end{verbatim} +\end{listing} + +\begin{listing}[H] + \begin{verbatim} + docs: + image: khana_local_docs + container_name: docs + build: + context: . + dockerfile: ./compose/local/docs/Dockerfile + env_file: + - ./.envs/.local/.django + volumes: + - ./docs:/docs:z + - ./config:/app/config:z + - ./khana:/app/khana:z + ports: + - "7000:7000" + command: /start-docs + \end{verbatim} +\end{listing} + +\begin{listing}[H] + \begin{verbatim} + redis: + image: redis:5.0 + container_name: redis + \end{verbatim} +\end{listing} + +\begin{listing}[H] + \begin{verbatim} + celeryworker: + <<: *django + image: khana_local_celeryworker + container_name: celeryworker + depends_on: + - redis + - postgres + ports: [] + command: /start-celeryworker + \end{verbatim} +\end{listing} + +\begin{listing}[H] + \begin{verbatim} + celerybeat: + <<: *django + image: khana_local_celerybeat + container_name: celerybeat + depends_on: + - redis + - postgres + ports: [] + command: /start-celerybeat + \end{verbatim} +\end{listing} + +\begin{listing}[H] + \begin{verbatim} + flower: + <<: *django + image: khana_local_flower + container_name: flower + ports: + - "5555:5555" + command: /start-flower + \end{verbatim} +\end{listing} + +\subsection{Docker-compose} + +\begin{listing}[H] + \begin{verbatim} + # docker-compose.yml + + version: '3.8' + services: + web: + build: . + command: python /code/manage.py runserver 0.0.0.0:8000 + volumes: + - .:/code + ports: + - 8000:8000 + depends_on: + - slqserver + + slqserver: + image: mcr.microsoft.com/mssql/server:2019-latest + environment: + - "ACCEPT_EULA=Y" + - "SA_PASSWORD=sqklgjqihagrtdgqk12§!" + ports: + - 1433:1433 + volumes: + - ../sqlserver/data:/var/opt/mssql/data + - ../sqlserver/log:/var/opt/mssql/log + - ../sqlserver/secrets:/var/opt/mssql/secrets + \end{verbatim} +\end{listing} + +\subsection{Dockerfile} + +\begin{listing}[H] +\begin{verbatim} + FROM python:3.8-slim-buster + + ENV PYTHONUNBUFFERED 1 + ENV PYTHONDONTWRITEBYTECODE 1 + + RUN apt-get update \ + + # dependencies for building Python packages + && apt-get install -y build-essential \ + # psycopg2 dependencies + && apt-get install -y libpq-dev \ + # Translations dependencies + && apt-get install -y gettext \ + # cleaning up unused files + && apt-get purge -y --auto-remove -o + APT::AutoRemove::RecommendsImportant=false \ + && rm -rf /var/lib/apt/lists/* + + # Requirements are installed here to ensure they will be cached. + COPY ./requirements /requirements + RUN pip install -r /requirements/local.txt + + COPY ./compose/production/django/entrypoint /entrypoint + RUN sed -i 's/\r$//g' /entrypoint + RUN chmod +x /entrypoint + + COPY ./compose/local/django/start /start + RUN sed -i 's/\r$//g' /start + RUN chmod +x /start + + COPY ./compose/local/django/celery/worker/start /start-celeryworker + RUN sed -i 's/\r$//g' /start-celeryworker + RUN chmod +x /start-celeryworker + + COPY ./compose/local/django/celery/beat/start /start-celerybeat + RUN sed -i 's/\r$//g' /start-celerybeat + RUN chmod +x /start-celerybeat + + COPY ./compose/local/django/celery/flower/start /start-flower + RUN sed -i 's/\r$//g' /start-flower + RUN chmod +x /start-flower + + WORKDIR /app + + ENTRYPOINT ["/entrypoint"] +\end{verbatim} +\end{listing} + +\section{Docker \& Dockerfile} + +\begin{listing} + \begin{verbatim} + # Dockerfile + + # Pull base image + FROM python:3.8-slim-buster + + # Set environment variables + ENV PYTHONDONTWRITEBYTECODE 1 + ENV PYTHONUNBUFFERED 1 + ENV DEBIAN_FRONTEND noninteractive + ENV ACCEPT_EULA=Y + + # install Microsoft SQL Server requirements. + ENV ACCEPT_EULA=Y + RUN apt-get update -y && apt-get update \ + && apt-get install -y --no-install-recommends curl gcc g++ gnupg + + + # Add SQL Server ODBC Driver 17 + RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - + RUN curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list + RUN apt-get update \ + && apt-get install -y msodbcsql17 unixodbc-dev + + # clean the install. + RUN apt-get -y clean + + # Set work directory + WORKDIR /code + + # Install dependencies + COPY ./requirements/base.txt /code/requirements/ + RUN pip install --upgrade pip + RUN pip install -r ./requirements/base.txt + + # Copy project + COPY . /code/ + + \end{verbatim} + \caption{Un exemple de Dockerfile} +\end{listing} diff --git a/images/docker.jpg b/images/docker.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a5947e5e7a1f8781fad27e10e602a0cc23196b44 GIT binary patch literal 98105 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 u5?yRz*5h;mZ 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