From 0578564c37be9b2e297cff0cbc3359c0dcc29b81 Mon Sep 17 00:00:00 2001 From: Fred Pauchet Date: Fri, 17 Jun 2022 21:31:50 +0200 Subject: [PATCH] Resize images to fit page layout --- chapters/maintenability.tex | 119 ++++++++++-------- chapters/tools.tex | 76 ++++++++--- .../diagrams/12factors-codebase-deploys.png | Bin 0 -> 25403 bytes 3 files changed, 124 insertions(+), 71 deletions(-) create mode 100644 images/diagrams/12factors-codebase-deploys.png diff --git a/chapters/maintenability.tex b/chapters/maintenability.tex index 86564ef..04f063b 100644 --- a/chapters/maintenability.tex +++ b/chapters/maintenability.tex @@ -1,96 +1,109 @@ \chapter{Fiabilité, évolutivité et maintenabilité} \begin{quote} - The primary cost of maintenance is in spelunking and risk\cite[139]{clean_architecture} - - --- Robert C. Martin + The primary cost of maintenance is in spelunking and risk\cite[p. 139]{clean_architecture} \end{quote} -Que l'utilisateur soit humain, bot automatique ou client Web, la finalité d'un développement est de fournir des applications résilientes, pouvant être mises à l'échelle et maintenables \cite[p. 6]{data_design} : +Que l'utilisateur soit humain, bot automatique ou client Web, la finalité d'un développement est de fournir des applications résilientes, pouvant être mises à l'échelle et maintenables \cite[p. 6]{data_intensive} : -\begin{itemize} +\begin{enumerate} \item - La résilience consiste à ce que l'application continue à fonctionner \textit{correctement} - c'est-à-dire à ce qu'elle fournisse un service correct au niveau de performance désiré, même quand les choses passent mal. - Cela signifie que ces systèmes ont la capacité: + \textbf{La résilience} consiste à ce que l'application continue à fonctionner \textit{correctement}, c'est-à-dire à ce qu'elle fournisse un service correct au niveau de performance désiré, même quand les choses se passent mal. + Ceci signifie qu'un système a la capacité: \begin{enumerate} \item - D'anticiper certains types d'erreurs (ou en tout cas, de les gérer de manière propre), par exemple en proposition une solution de repli (\textit{fallback}) \footnote{Lors d'un incident AWS, Netlix proposait des recommandations statiques et ne se basait plus sur des recommandations personnalisées. Ceci leur a permis de tenir six heures avant de décréter être impacté. \cite{devops_handbook}} + D'anticiper certains types d'erreurs (ou en tout cas, de les gérer de manière propre), par exemple en proposant une solution de repli (\textit{fallback}) \footnote{Lors d'un incident AWS, Netlix proposait des recommandations statiques et ne se basait plus sur des recommandations personnalisées. Ceci leur a permis de tenir six heures avant de décréter être impacté. \cite{devops_handbook}} \item De se rendre rapidement indisponibles les composants qui posent problème, de manière à ce que ceux-ci n'entraînent pas tout le système avec eux (\textit{fail fast}) \item De retirer certaines fonctionnalités non-critiques lorsqu'elles répondent plus lentement ou lorsqu'elles présentent un impact sur le reste de l'application (\textit{feature removal}). \end{enumerate} \item - La mise à échelle consiste à autoriser le système à \textit{grandir} - soit par le trafic pouvant être pris en charge, soit par son volume de données, soit par sa complexité. + \textbf{La mise à échelle} consiste à autoriser le système à \textit{grandir} - soit par le trafic pouvant être pris en charge, soit par son volume de données, soit par sa complexité. \item - Au fil du temps, il est probable que plusieurs personnes se succèdent à travailler sur l'évolution d'une application, qu'ils travaillent sur sa conception ou sur son exploitation. - La maintenabilité consiste à faire en sorte que toute intervention puisse être réalisée de manière productive. -\end{itemize} + \textbf{La maintenabilité} consiste à faire en sorte que toute intervention puisse être réalisée de manière productive: au fil du temps, il est probable que plusieurs personnes se succèdent à travailler sur l'évolution d'une application, qu'ils travaillent sur sa conception ou sur son exploitation. +\end{enumerate} -Pour la méthode de travail et de développement, nous allons nous baser sur les \href{https://12factor.net/fr/}{The Twelve-factor App} - ou plus simplement les \textbf{12 facteurs}. -Suivre ces concepts permet de: +Une manière de développer de telles applications consiste à suivre la méthodologie des \textbf{12 facteurs} \footnote{\href{https://12factor.net/fr/}{The Twelve-factor App}} +Il s'agit d'une méthodologie consistant à suivre douze principes, qui permettent de: \begin{enumerate} \item - \textbf{Faciliter la mise en place de phases d'automatisation}; plus - concrètement, de faciliter les mises à jour applicatives, simplifier - la gestion de l'hôte qui héberge l'application ou les services, - diminuer la divergence entre les différents environnements d'exécution et offrir la possibilité d'intégrer le - projet dans un processus - d'\href{https://en.wikipedia.org/wiki/Continuous_integration}{intégration - continue} ou - \href{https://en.wikipedia.org/wiki/Continuous_deployment}{déploiement - continu} + \textbf{Faciliter la mise en place de phases d'automatisation}; plus concrètement, de faciliter les mises à jour applicatives, simplifier la gestion de l'hôte qui héberge l'application ou les services, diminuer la divergence entre les différents environnements d'exécution et offrir la possibilité d'intégrer le projet dans un processus d'\href{https://en.wikipedia.org/wiki/Continuous_integration}{intégration continue} ou \href{https://en.wikipedia.org/wiki/Continuous_deployment}{déploiement continu} \item - \textbf{Faciliter l'intégration de nouveaux développeurs dans l'équipe ou de - personnes souhaitant rejoindre le projet}, dans la mesure où la construction d'un nouvel environnement sera grandement facilitée. + \textbf{Faciliter l'intégration de nouveaux développeurs dans l'équipe ou de personnes souhaitant rejoindre le projet}, dans la mesure où la construction d'un nouvel environnement sera grandement facilitée. \item - \textbf{Minimiser les divergences entre les différents environnemens} - sur lesquels un projet pourrait être déployé, pour éviter de découvrir un bogue sur l'environnement de production qui serait impossible à reproduire ailleurs, simplement parce qu'un des composants varierait + \textbf{Minimiser les divergences entre les différents environnemens} sur lesquels un projet pourrait être déployé, pour éviter de découvrir un bogue sur l'environnement de production qui serait impossible à reproduire ailleurs, simplement parce qu'un des composants varierait \item - \textbf{Augmenter l'agilité générale du projet}, en permettant une - meilleure évolutivité architecturale et une meilleure mise à l'échelle. + \textbf{Augmenter l'agilité générale du projet}, en permettant une meilleure évolutivité architecturale et une meilleure mise à l'échelle. \end{enumerate} -En pratique, les points ci-dessus permettront de gagner un temps précieux à la construction d'un nouvel environnement - qu'il soit sur la machine du petit nouveau dans l'équipe, sur un serveur Azure/Heroku/Digital Ocean ou votre nouveau Raspberry Pi Zéro planqué à la cave - et vous feront gagner un temps précieux. +En pratique, les points ci-dessus permettront de gagner un temps précieux à la construction et à la maintenance de n'importe quel environnement - qu'il soit sur la machine du petit nouveau dans l'équipe, sur un serveur Azure/Heroku/Digital Ocean ou sur votre nouveau Raspberry Pi Zéro planqué à la cave. -Pour reprendre plus spécifiquement les différentes idées derrière cette méthode, nous avons: +Pour reprendre plus spécifiquement les différentes idées derrière cette méthode, nous trouvons des conseils concernant: + +\begin{enumerate} + \item + Une base de code unique, suivie par un contrôle de versions + \item + Une déclaration explicite et une isolation des dépendances + \item + Configuration applicative + \item + Ressources externes + \item + La séparation des phases de constructions + \item + La mémoire des processus d'exécution + \item + La liaison des ports + \item + Une connaissance et une confiance dans les processus systèmes + \item + La possibilité d'arrêter élégamment l'application, tout en réduisant au minimum son temps de démarrage + \item + La similarité des environnements + \item + La gestion des journaux et des flux d'évènements + \item + L'isolation des tâches administratives +\end{enumerate} \section{Une base de code unique, suivie par un contrôle de versions} -Chaque déploiement de l'application, et quel que soit l'environnement ciblé, se basera sur une source unique, afin de minimiser les différences que l'on pourrait trouver entre deux environnements d'un même projet. +Chaque déploiement de l'application, et quel que soit son environnement cible, se basera sur une source unique, afin de minimiser les différences que l'on pourrait trouver entre deux déploiements d'un même projet. + +\begin{figure}[H] + \centering + \scalebox{1.0}{\includegraphics[max size={\textwidth}{\textheight}]{images/diagrams/12factors-codebase-deploys.png}} +\end{figure} + Git est reconnu dans l'industrie comme standard des systèmes de contrôles de versions, malgré une courbe d'apprentissage assez ardue. Comme dépôt, nous pourrons par exemple utiliser GitHub, Gitea ou Gitlab, suivant que vous ayez besoin d'une plateforme centralisée, propriétaire, payante ou auto-hébergée. \index{Git} \index{Github} \index{Gitlab} \index{Gitea} -\includegraphics{images/diagrams/12-factors-1.png} +En résumé: -Comme l'explique Eran Messeri, ingénieur dans le groupe Google Developer Infrastructure: "Un des avantages d'utiliser un dépôt unique de sources, est qu'il permet un accès facile et rapide à la forme la plus à jour du code, sans aucun besoin de coordination. \cite[pp. 288-298]{devops_handbook}. -Ce dépôt n'est pas uniquement destiné à hébergé le code source, mais également à d'autres artefacts et autres formes de connaissance : +\begin{quote} + \textit{Il y a seulement une base de code par application, mais il y aura plusieurs déploiements de l’application. Un déploiement est une instance en fonctionnement de l’application. C’est, par exemple, le site en production, ou bien un ou plusieurs sites de validation. En plus de cela, chaque développeur a une copie de l’application qui fonctionne dans son environnement local de développement, ce qui compte également comme un déploiement}. \footnote{\url{https://12factor.net/fr/codebase}} +\end{quote} -\begin{itemize} - \item Standards de configuration (Chef recipes, Puppet manifests, \ldots - \item Outils de déploiement - \item Standards de tests, y compris tout ce qui touche à la sécurité - \item Outils de déploiement de pipeline - \item Outils d'analyse et de monitoring - \item Tutoriaux -\end{itemize} +Comme l'explique Eran Messeri, ingénieur dans le groupe Google Developer Infrastructure: "\textit{Un des avantages d'utiliser un dépôt unique de sources, est qu'il permet un accès facile et rapide à la forme la plus à jour du code, sans aucun besoin de coordination}. \cite[pp. 288-298]{devops_handbook}. +Ce dépôt n'est pas uniquement destiné à hébergé le code source, mais également à d'autres artefacts et autres formes de connaissance, comme les standards de configuration (Chef recipes, Puppet manifests, \ldots), outils de déploiement, standards de tests (y compris ce qui touche à la sécurité), outils d'analyse et de monitoring ou tutoriaux. \section{Déclaration explicite et isolation des dépendances} -Chaque installation ou configuration doit toujours être faite de la même manière, et doit pouvoir être répétée quel que soit l'environnement cible. -Ceci permet d'éviter que l'application n'utilise une dépendance qui ne soit déjà installée sur un des sytèmes de développement, et qu'elle soit difficile, voire impossible, à répercuter sur un autre environnement. -Dans le cas de Python, cela pourra être fait au travers de \href{https://pypi.org/project/pip/}{PIP - Package Installer for Python} ou \href{https://python-poetry.org/}{Poetry}. -La majorité des langages moderners proposent des mécanismes similaires (\href{https://rubygems.org/}{Gem} pour Ruby, \href{https://www.npmjs.com/}{NPM} pour NodeJS, \ldots) -Dans tous les cas, chaque application doit disposer d'un environnement sain, qui lui est assigné. Vu le peu de ressources que cela coûte, il ne faut pas s'en priver. +Chaque installation ou configuration doit être toujours réalisée de la même manière, et doit pouvoir être répétée quel que soit l'environnement cible. +Ceci permet d'éviter que l'application n'utilise une dépendance qui ne soit installée que sur l'un des sytèmes de développement, et qu'elle soit difficile, voire impossible, à réinstaller sur un autre environnement. -Chaque dépendance devra déclarer et épingler dans un fichier la version nécessaire. -Lors de la création d'un nouvel environnement vierge, il suffira d'utiliser ce fichier comme paramètre afin d'installer les prérequis au bon fonctionnement de notre application. -Ceci autorise une reproductibilité quasi parfaite de l'environnement. +Chaque dépendance devra être déclarée dans un fichier présent au niveau de la base de code. +Lors de la création d'un nouvel environnement vierge, il suffira d'utiliser ce fichier comme paramètre afin d'installer les prérequis au bon fonctionnement de notre application, afin d'assurer une reproductibilité quasi parfaite de l'environnement d'exécution. -Il est important de bien "épingler" les versions liées aux dépendances de l'application. Cela peut éviter des effets de bord comme une nouvelle version d'une librairie dans laquelle un bug aurait pu avoir été introduit. -Parce qu'il arrive que ce genre de problème apparaisse, et lorsque ce sera le cas, ce sera systématiquement au mauvais moment \footnote{Le paquet PyLint dépend par exemple d'Astroid; \href{https://github.com/PyCQA/pylint-django/issues/343}{en janvier 2022}, ce dernier a été mis à jour sans respecter le principe de versions sémantiques et introduisant une régression. PyLint spécifiait que sa dépendance avec Astroid devait respecter une version ~2.9. Lors de sa mise à jour en 2.9.1, Astroid a introduit un changement majeur, qui faisait planter Pylint. L'épinglage explicite aurait pu éviter ceci.} +Il est important de bien "épingler" les versions liées aux dépendances de l'application. +Ceci peut éviter des effets de bord comme une nouvelle version d'une librairie dans laquelle un bug aurait pu avoir été introduit.\footnote{Le paquet PyLint dépend par exemple d'Astroid; \href{https://github.com/PyCQA/pylint-django/issues/343}{en janvier 2022}, ce dernier a été mis à jour sans respecter le principe de versions sémantiques et introduisant une régression. PyLint spécifiait que sa dépendance avec Astroid devait respecter une version ~2.9. Lors de sa mise à jour en 2.9.1, Astroid a introduit un changement majeur, qui faisait planter Pylint. L'épinglage explicite aurait pu éviter ceci.}. + +Dans le cas de Python, la déclaration explicite et l'épinglage pourront notamment être réalisés au travers de \href{https://pypi.org/project/pip/}{PIP} ou \href{https://python-poetry.org/}{Poetry}. +La majorité des langages modernes proposent des mécanismes similaires (\href{https://rubygems.org/}{Gem} pour Ruby, \href{https://www.npmjs.com/}{NPM} pour NodeJS, \ldots) \section{Configuration applicative} diff --git a/chapters/tools.tex b/chapters/tools.tex index 8234301..7be0cfe 100644 --- a/chapters/tools.tex +++ b/chapters/tools.tex @@ -23,17 +23,55 @@ Si vous manquez d'idées ou si vous ne savez pas par où commencer: Si vous hésitez, et même si Codium n'est pas le plus léger (la faute à \href{https://www.electronjs.org/}{Electron}\ldots\hspace{0pt}), il fera correctement son travail (à savoir : faciliter le vôtre), en intégrant suffisament de fonctionnalités qui gâteront les papilles émoustillées du développeur impatient. \begin{figure}[H] - \centering - \includegraphics{images/environment/codium.png} - \caption{Codium en action} + \centering + \scalebox{1.0}{\includegraphics[max size={\textwidth}{\textheight}]{images/environment/codium.png}} + \caption{Codium en action} \end{figure} +\subsection{Configuration} -\subsection{Greffons} +VSCodium permet également de définir certaines clés de configuration globalement ou au niveau d'un projet. +Celle qui nous semble critique, indispensable et primordial est la suppression automatique des espaces en fin de ligne, qui facilite énormément la relecture de \textit{commits} et la collaboration entre intervenants. -\subsection{settings.json} +\begin{minted}{js} + /* fichier placé habituellement dans ~/.config/code/User/settings.json */ -\subsection{Mode debug - launch.json} + { + [...] + "files.trimTrailingWhitespace": true, + } +\end{minted} + +Nous pouvons également noter la possibilité d'installer des greffons (dont un gestionnaire d'interpréteur Python), l'intégration poussée de Git \index{git} ou l'énorme support de plein de langages de programmation ou de mise en forme: Go, XML, HTML, Java, C\#, PHP, LaTeX, \ldots, ainsi que tout l'atirail d'aides à l'utilisation de Docker. + +\subsection{Mode debug} + +Le débugger intégré vous permettra de spécifier le point d'entrée à utiliser, de placer des points d'arrêt (éventuellement conditionnés par certaines valeurs attribuées à des variables), de lancer une analyse sur les variables et contextes, sur la pile d'appels, ... +Bref: de savoir où vous en êtes et pourquoi vous êtes là. + +Ce débugger fonctionne soit sur le fichier courant (déconseillé), soit \textit{via} un fichier \texttt{launch.json} que vous pourrez placer dans le répertoire \texttt{.vscode} placé à la racine de votre projet. +Pour une application Django, ce fichier contiendra par exemple la configuration suivante: + +\begin{minted}{js} + { + "version": "0.2.0", + "configurations": [ + { + "name": "Python Django", + "type": "python", + "request": "launch", + "program": "${workspaceFolder}/manage.py", + "args": [ + "runserver" + ], + "django": true, + "justMyCode": true + } + ] + } +\end{minted} + +Les \textit{configurations} peuvent être multiples, et nous pouvons voir que l'objectif de cette configuration-ci est de démarrer la commande \texttt{\$\{workspaceFolder\}/manage.py}, avec le paramètre \texttt{runserver}, ce qui aura pour effet de démarrer l'exécution du code dans une enveloppe sécurisée et plombée de capteurs en tout genre qui faciliteront énormément votre travail de recherche et d'introspection du code. \section{Terminal} @@ -52,9 +90,8 @@ A nouveau, si vous manquez d'idées : \end{enumerate} \begin{figure}[H] - \centering - \includegraphics{images/environment/terminal.png} - \caption{Mise en abîme} + \centering + \scalebox{1.0}{\includegraphics[max size={\textwidth}{\textheight}]{images/environment/terminal.png}} \end{figure} @@ -63,9 +100,13 @@ A nouveau, si vous manquez d'idées : Nous en auront besoin pour gé(né)rer des phrases secrètes pour nos applications. Si vous n'en utilisez pas déjà un, partez sur \href{https://keepassxc.org/}{KeepassXC}: il est multi-plateformes, suivi et s'intègre correctement aux différents environnements, tout en restant accessible. -\includegraphics{images/environment/keepass.png} +\begin{figure}[H] + \centering + \scalebox{1.0}{\includegraphics[max size={\textwidth}{\textheight}]{images/environment/keepass.png}} +\end{figure} La finalité de cette application va être de centraliser la gestion de vos phrases de passe, pour les accès aux bases de données, services en ligne, etc. +Il existe des alternatives, comme Bitwarden, qui proposent des services libres, gratuits ou payants. \subsection{Un système de gestion de versions} @@ -75,9 +116,9 @@ Il est une aide précieuse pour développer rapidement des preuves de concept, s Ses deux plus gros défauts concernent sa courbe d'apprentissage pour les nouveaux venus et la complexité des actions qu'il permet de réaliser. \begin{figure}[H] -\centering -\includegraphics{images/xkcd-1597-git.png} -\caption{\url{https://xkcd.com/1597/}} + \centering + \scalebox{1.0}{\includegraphics[max size={\textwidth}{\textheight}]{images/xkcd-1597-git.png}} + \caption{\url{https://xkcd.com/1597/}} \end{figure} \begin{enumerate} @@ -96,9 +137,9 @@ Ses deux plus gros défauts concernent sa courbe d'apprentissage pour les nouvea \end{enumerate} \begin{figure}[H] -\centering -\includegraphics{images/diagrams/git-workflow.png} -\caption{Git en action} + \centering + \scalebox{1.0}{\includegraphics[max size={\textwidth}{\textheight}]{images/diagrams/git-workflow.png}} + \caption{Git en action} \end{figure} Cas pratique: vous développez une nouvelle fonctionnalité qui va révolutionner le monde de demain et d'après-demain, quand, tout à coup (!), vous vous rendez compte que vous avez perdu votre conformité aux normes PCI parce les données des titulaires de cartes ne sont pas isolées correctement. @@ -126,7 +167,6 @@ Les plus connues sont \href{https://www.gitflow.com/}{Gitflow} et \href{https:// La gestion de versions de fichiers permet de conserver un historique de toutes les modifications enregistrées, associées à un horodatage et une description. - \subsection{Décrire ses changements} La description d'un changement se fait \emph{via} la commande \texttt{git\ commit}. @@ -137,7 +177,7 @@ De plus, la plupart des plateformes de dépôts présenteront ces informations d \begin{figure}[H] \centering - \includegraphics{images/environment/gitea-commit-message.png} + \scalebox{1.0}{\includegraphics[max size={\textwidth}{\textheight}]{images/environment/gitea-commit-message.png}} \caption{Un exemple de commit affiché dans Gitea} \end{figure} diff --git a/images/diagrams/12factors-codebase-deploys.png b/images/diagrams/12factors-codebase-deploys.png new file mode 100644 index 0000000000000000000000000000000000000000..c7e1a4614569170d186e6609b6ba1bbe6c7f2fef GIT binary patch literal 25403 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 literal 0 HcmV?d00001