Create external tools
continuous-integration/drone/push Build is failing
Details
continuous-integration/drone/push Build is failing
Details
This commit is contained in:
parent
2fd26218da
commit
083069d812
|
@ -88,133 +88,18 @@
|
||||||
\end{Highlighting}
|
\end{Highlighting}
|
||||||
\end{Shaded}
|
\end{Shaded}
|
||||||
|
|
||||||
←-\/- / partie obsolète -\/-→
|
|
||||||
|
|
||||||
Ceci vous affichera non seulement la couverture de code estimée, et
|
|
||||||
générera également vos fichiers sources avec les branches non couvertes.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\hypertarget{_configuration_globale}{%
|
|
||||||
\subsubsection{Configuration globale}\label{_configuration_globale}}
|
|
||||||
|
|
||||||
Décrire le fichier setup.cfg
|
|
||||||
|
|
||||||
\begin{Shaded}
|
|
||||||
\begin{Highlighting}[]
|
|
||||||
\NormalTok{$ }\FunctionTok{touch}\NormalTok{ setup.cfg}
|
|
||||||
\end{Highlighting}
|
|
||||||
\end{Shaded}
|
|
||||||
|
|
||||||
\hypertarget{_dockerfile}{%
|
\hypertarget{_dockerfile}{%
|
||||||
\subsubsection{Dockerfile}\label{_dockerfile}}
|
\subsubsection{Dockerfile}\label{_dockerfile}}
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
# Dockerfile
|
|
||||||
|
|
||||||
# Pull base image
|
|
||||||
#FROM python:3.8
|
|
||||||
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}
|
\end{verbatim}
|
||||||
|
|
||||||
\hypertarget{_makefile}{%
|
\hypertarget{_makefile}{%
|
||||||
\subsubsection{Makefile}\label{_makefile}}
|
\subsubsection{Makefile}\label{_makefile}}
|
||||||
|
|
||||||
Pour gagner un peu de temps, n'hésitez pas à créer un fichier
|
|
||||||
\texttt{Makefile} que vous placerez à la racine du projet. L'exemple
|
|
||||||
ci-dessous permettra, grâce à la commande \texttt{make\ coverage},
|
|
||||||
d'arriver au même résultat que ci-dessus:
|
|
||||||
|
|
||||||
\begin{verbatim}
|
|
||||||
# Makefile for gwift
|
|
||||||
#
|
|
||||||
|
|
||||||
# User-friendly check for coverage
|
|
||||||
ifeq ($(shell which coverage >/dev/null 2>&1; echo $$?), 1)
|
|
||||||
$(error The 'coverage' command was not found. Make sure you have coverage installed)
|
|
||||||
endif
|
|
||||||
|
|
||||||
.PHONY: help coverage
|
|
||||||
|
|
||||||
help:
|
|
||||||
@echo " coverage to run coverage check of the source files."
|
|
||||||
|
|
||||||
coverage:
|
|
||||||
coverage run --source='.' manage.py test; coverage report; coverage html;
|
|
||||||
@echo "Testing of coverage in the sources finished."
|
|
||||||
\end{verbatim}
|
|
||||||
|
|
||||||
Pour la petite histoire, \texttt{make} peu sembler un peu désuet, mais
|
|
||||||
reste extrêmement efficace.
|
|
||||||
|
|
||||||
\hypertarget{_environnement_de_duxe9veloppement}{%
|
|
||||||
\subsection{Environnement de
|
|
||||||
développement}\label{_environnement_de_duxe9veloppement}}
|
|
||||||
|
|
||||||
Concrètement, nous pourrions tout à fait nous limiter à Notepad ou
|
|
||||||
Notepad++. Mais à moins d'aimer se fouetter avec un câble USB, nous
|
|
||||||
apprécions la complétion du code, la coloration syntaxique,
|
|
||||||
l'intégration des tests unitaires et d'un debugger, ainsi que deux-trois
|
|
||||||
sucreries qui feront plaisir à n'importe quel développeur.
|
|
||||||
|
|
||||||
Si vous manquez d'idées ou si vous ne savez pas par où commencer:
|
|
||||||
|
|
||||||
\begin{itemize}
|
|
||||||
\item
|
|
||||||
\href{https://vscodium.com/}{VSCodium}, avec les plugins
|
|
||||||
\href{https://marketplace.visualstudio.com/items?itemName=ms-python.python}{Python}et
|
|
||||||
\href{https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens}{GitLens}
|
|
||||||
\item
|
|
||||||
\href{https://www.jetbrains.com/pycharm/}{PyCharm}
|
|
||||||
\item
|
|
||||||
\href{https://www.vim.org/}{Vim} avec les plugins
|
|
||||||
\href{https://github.com/davidhalter/jedi-vim}{Jedi-Vim} et
|
|
||||||
\href{https://github.com/preservim/nerdtree}{nerdtree}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
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}
|
|
||||||
\centering
|
|
||||||
\includegraphics{images/environment/codium.png}
|
|
||||||
\caption{Codium en action}
|
|
||||||
\end{figure}
|
|
||||||
|
|
||||||
\hypertarget{_un_terminal}{%
|
\hypertarget{_un_terminal}{%
|
||||||
\subsection{Un terminal}\label{_un_terminal}}
|
\subsection{Un terminal}\label{_un_terminal}}
|
||||||
|
|
|
@ -651,19 +651,11 @@ Pour nous en assurer (dès fois que quelqu'un en doute), il nous suffit de déma
|
||||||
|
|
||||||
\subsection{Couverture de code}
|
\subsection{Couverture de code}
|
||||||
|
|
||||||
|
Avec \texttt{pytest}, il convient d'utiliser le paquet \href{https://pypi.org/project/pytest-cov/}{\texttt{pytest-cov}}, suivi de la commande \texttt{pytest\ -\/-cov=gwift\ tests/}.
|
||||||
|
|
||||||
Avec \texttt{pytest}, il convient d'utiliser le paquet
|
Si vous préférez rester avec le cadre de tests de Django, vous pouvez passer par le paquet\href{https://pypi.org/project/django-coverage-plugin/}{django-coverage-plugin}.
|
||||||
\href{https://pypi.org/project/pytest-cov/}{\texttt{pytest-cov}}, suivi
|
Ajoutez-le dans le fichier \texttt{requirements/base.txt}, et lancez une couverture de code grâce à la commande \texttt{coverage}.
|
||||||
de la commande \texttt{pytest\ -\/-cov=gwift\ tests/}.
|
La configuration peut se faire dans un fichier \texttt{.coveragerc} que vous placerez à la racine de votre projet, et qui sera lu lors de l'exécution.
|
||||||
|
|
||||||
Si vous préférez rester avec le cadre de tests de Django, vous pouvez
|
|
||||||
passer par le paquet
|
|
||||||
\href{https://pypi.org/project/django-coverage-plugin/}{django-coverage-plugin}
|
|
||||||
Ajoutez-le dans le fichier \texttt{requirements/base.txt}, et lancez une
|
|
||||||
couverture de code grâce à la commande \texttt{coverage}. La
|
|
||||||
configuration peut se faire dans un fichier \texttt{.coveragerc} que
|
|
||||||
vous placerez à la racine de votre projet, et qui sera lu lors de
|
|
||||||
l'exécution.
|
|
||||||
|
|
||||||
\section{Matrice de compatibilité}
|
\section{Matrice de compatibilité}
|
||||||
|
|
||||||
|
@ -699,6 +691,170 @@ Ci-dessus, la commande retournera une erreur pour chaque version non trouvée, a
|
||||||
|
|
||||||
TODO: Intérêt des containers.
|
TODO: Intérêt des containers.
|
||||||
|
|
||||||
|
\section{Glue de configuration}
|
||||||
|
|
||||||
|
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}
|
||||||
|
|
||||||
|
Pour gagner un peu de temps, n'hésitez pas à créer un fichier \texttt{Makefile} que vous placerez à la racine du projet.
|
||||||
|
L'exemple ci-dessous permettra, grâce à la commande \texttt{make\ coverage}, d'arriver au même résultat que ci-dessus:
|
||||||
|
|
||||||
|
\begin{listing}
|
||||||
|
\begin{verbatim}
|
||||||
|
# Makefile for gwift
|
||||||
|
#
|
||||||
|
|
||||||
|
# User-friendly check for coverage
|
||||||
|
ifeq ($(shell which coverage >/dev/null 2>&1; echo $$?), 1)
|
||||||
|
$(error The 'coverage' command was not found. Make sure you have coverage installed)
|
||||||
|
endif
|
||||||
|
|
||||||
|
.PHONY: help coverage
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo " coverage to run coverage check of the source files."
|
||||||
|
|
||||||
|
coverage:
|
||||||
|
coverage run --source='.' manage.py test; coverage report; coverage html;
|
||||||
|
@echo "Testing of coverage in the sources finished."
|
||||||
|
\end{verbatim}
|
||||||
|
\caption{Un exemple de fichier Makefile}
|
||||||
|
\end{listing}
|
||||||
|
|
||||||
|
Pour la petite histoire, \texttt{make} peu sembler un peu désuet, mais
|
||||||
|
reste extrêmement efficace.
|
||||||
|
|
||||||
|
\section{Outils de développement}
|
||||||
|
|
||||||
|
\subsection{Environnement de développement}
|
||||||
|
|
||||||
|
Concrètement, nous pourrions tout à fait nous limiter à Notepad ou Notepad++.
|
||||||
|
Mais à moins d'aimer se fouetter avec un câble USB, nous apprécions la complétion du code, la coloration syntaxique, l'intégration des tests unitaires et d'un debugger, ainsi que deux-trois sucreries qui feront plaisir à n'importe quel développeur.
|
||||||
|
|
||||||
|
Si vous manquez d'idées ou si vous ne savez pas par où commencer:
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item
|
||||||
|
\href{https://vscodium.com/}{VSCodium}, avec les plugins
|
||||||
|
\href{https://marketplace.visualstudio.com/items?itemName=ms-python.python}{Python}et
|
||||||
|
\href{https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens}{GitLens}
|
||||||
|
\item
|
||||||
|
\href{https://www.jetbrains.com/pycharm/}{PyCharm}
|
||||||
|
\item
|
||||||
|
\href{https://www.vim.org/}{Vim} avec les plugins
|
||||||
|
\href{https://github.com/davidhalter/jedi-vim}{Jedi-Vim} et
|
||||||
|
\href{https://github.com/preservim/nerdtree}{nerdtree}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
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}
|
||||||
|
\centering
|
||||||
|
\includegraphics{images/environment/codium.png}
|
||||||
|
\caption{Codium en action}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{Terminal}
|
||||||
|
|
||||||
|
\emph{A priori}, les IDE \footnote{Integrated Development Environment}
|
||||||
|
proposés ci-dessus fournissent par défaut ou \emph{via} des greffons un
|
||||||
|
terminal intégré. Ceci dit, disposer d'un terminal séparé facilite
|
||||||
|
parfois certaines tâches.
|
||||||
|
|
||||||
|
A nouveau, si vous manquez d'idées:
|
||||||
|
|
||||||
|
\begin{enumerate}
|
||||||
|
\item
|
||||||
|
Si vous êtes sous Windows, téléchargez une copie de
|
||||||
|
\href{https://cmder.net/}{Cmder}. Il n'est pas le plus rapide, mais
|
||||||
|
propose une intégration des outils Unix communs (\texttt{ls},
|
||||||
|
\texttt{pwd}, \texttt{grep}, \texttt{ssh}, \texttt{git},
|
||||||
|
\ldots\hspace{0pt}) sans trop se fouler.
|
||||||
|
\item
|
||||||
|
Pour tout autre système, vous devriez disposer en natif de ce qu'il
|
||||||
|
faut.
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\centering
|
||||||
|
\includegraphics{images/environment/terminal.png}
|
||||||
|
\caption{Mise en abîme}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{Un gestionnaire de base de données}
|
||||||
|
|
||||||
|
Django gère plusieurs moteurs de base de données.
|
||||||
|
Certains sont gérés nativement par Django (PostgreSQL, MariaDB, SQLite); \emph{a priori}, ces trois-là sont disponibles pour tous les systèmes d'exploitation.
|
||||||
|
D'autres moteurs nécessitent des librairies tierces (Oracle, Microsoft SQL Server).
|
||||||
|
|
||||||
|
Il n'est pas obligatoire de disposer d'une application de gestion pour ces moteurs: pour les cas d'utilisation simples, le shell Django pourra largement suffire (nous y reviendrons).
|
||||||
|
Mais pour faciliter la gestion des bases de données elles-même, et si vous n'êtes pas à l'aise avec la
|
||||||
|
ligne de commande, choisissez l'une des applications d'administration
|
||||||
|
ci-dessous en fonction du moteur de base de données que vous souhaitez
|
||||||
|
utiliser.
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item
|
||||||
|
Pour \textbf{PostgreSQL}, il existe
|
||||||
|
\href{https://www.pgadmin.org/}{pgAdmin}
|
||||||
|
\item
|
||||||
|
Pour \textbf{MariaDB} ou \textbf{MySQL}, partez sur
|
||||||
|
\href{https://www.phpmyadmin.net/}{PHPMyAdmin}
|
||||||
|
\item
|
||||||
|
Pour \textbf{SQLite}, il existe
|
||||||
|
\href{https://sqlitebrowser.org/}{SQLiteBrowser} PHPMyAdmin ou
|
||||||
|
PgAdmin.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
\section{Conclusions (et intégration continue)}
|
\section{Conclusions (et intégration continue)}
|
||||||
|
|
||||||
|
|
|
@ -6,46 +6,29 @@ Make it work, make it right, make it fast
|
||||||
--- Kent Beck
|
--- Kent Beck
|
||||||
\end{quote}
|
\end{quote}
|
||||||
|
|
||||||
En fonction de vos connaissances et compétences, la création d'une
|
En fonction de vos connaissances et compétences, la création d'une nouvelle application est une étape relativement facile à mettre en place.
|
||||||
nouvelle application est uneé tape relativement facile à mettre en
|
Le code qui permet de faire tourner cette application peut ne pas être élégant, voire buggé jusqu'à la moëlle, il pourra fonctionner et faire "preuve de concept".
|
||||||
place. Le code qui permet de faire tourner cette application peut ne pas
|
|
||||||
être élégant, voire buggé jusqu'à la moëlle, il pourra fonctionner et
|
|
||||||
faire "preuve de concept".
|
|
||||||
|
|
||||||
Les problèmes arriveront lorsqu'une nouvelle demande sera introduite,
|
Les problèmes arriveront lorsqu'une nouvelle demande sera introduite, lorsqu'un bug sera découvert et devra être corrigé ou lorsqu'une dépendance cessera de fonctionner ou d'être disponible.
|
||||||
lorsqu'un bug sera découvert et devra être corrigé ou lorsqu'une
|
Or, une application qui n'évolue pas, meurt.
|
||||||
dépendance cessera de fonctionner ou d'être disponible. Or, une
|
Toute application est donc destinée, soit à être modifiée, corrigée et suivie, soit à déperrir et à être
|
||||||
application qui n'évolue pas, meurt. Tout application est donc destinée,
|
délaissée par ses utilisateurs.
|
||||||
soit à être modifiée, corrigée et suivie, soit à déperrir et à être
|
Et c'est juste cette maintenance qui est difficile.
|
||||||
délaissée par ses utilisateurs. Et c'est juste cette maintenance qui est
|
|
||||||
difficile.
|
|
||||||
|
|
||||||
L'application des principes présentés et agrégés ci-dessous permet
|
L'application des principes présentés et agrégés ci-dessous permet surtout de préparer correctement tout ce qui pourra arriver, sans aller jusqu'au « \textbf{You Ain't Gonna Need It} » (ou \textbf{YAGNI\index{YAGNI}}), qui consiste à surcharger tout développement avec des fonctionnalités non demandées, juste « au cas ou ».
|
||||||
surtout de préparer correctement tout ce qui pourra arriver, sans aller
|
Pour paraphraser une partie de l'introduction du livre \emph{Clean Architecture} \cite{clean_architecture}:
|
||||||
jusqu'au « \textbf{You Ain't Gonna Need It} » (ou \textbf{YAGNI\index{YAGNI}}), qui
|
|
||||||
consiste à surcharger tout développement avec des fonctionnalités non
|
|
||||||
demandées, juste « au cas ou ». Pour paraphraser une partie de
|
|
||||||
l'introduction du livre \emph{Clean Architecture}
|
|
||||||
\cite{clean_architecture}:
|
|
||||||
|
|
||||||
\begin{quote}
|
\begin{quote}
|
||||||
Getting software right is hard: it takes knowledge and skills that most
|
Getting software right is hard: it takes knowledge and skills that most young programmers don't take the time to develop.
|
||||||
young programmers don't take the time to develop. It requires a level of
|
It requires a level of discipline and dedication that most programmers never dreamed they'd need.
|
||||||
discipline and dedication that most programmers never dreamed they'd
|
Mostly, it takes a passion for the craft and the desire to be a professional.
|
||||||
need. Mostly, it takes a passion for the craft and the desire to be a
|
|
||||||
professional.
|
|
||||||
|
|
||||||
--- Robert C. Martin Clean Architecture
|
--- Robert C. Martin Clean Architecture
|
||||||
\end{quote}
|
\end{quote}
|
||||||
|
|
||||||
Le développement d'un logiciel nécessite une rigueur d'exécution et des
|
Le développement d'un logiciel nécessite une rigueur d'exécution et des connaissances précises dans des domaines extrêmement variés.
|
||||||
connaissances précises dans des domaines extrêmement variés. Il
|
Il nécessite également des intentions, des (bonnes) décisions et énormément d'attention.
|
||||||
nécessite également des intentions, des (bonnes) décisions et énormément
|
Indépendamment de l'architecture que vous aurez choisie, des technologies que vous aurez patiemment évaluées et mises en place, une architecture et une solution peuvent être cassées en un instant, en même temps que tout ce que vous aurez construit, dès que vous en aurez détourné le regard.
|
||||||
d'attention. Indépendamment de l'architecture que vous aurez choisie,
|
|
||||||
des technologies que vous aurez patiemment évaluées et mises en place,
|
|
||||||
une architecture et une solution peuvent être cassées en un instant, en
|
|
||||||
même temps que tout ce que vous aurez construit, dès que vous en aurez
|
|
||||||
détourné le regard.
|
|
||||||
|
|
||||||
Un des objectifs ici est de placer les barrières et les gardes-fous (ou
|
Un des objectifs ici est de placer les barrières et les gardes-fous (ou
|
||||||
plutôt, les "\textbf{garde-vous}"), afin de péréniser au maximum les
|
plutôt, les "\textbf{garde-vous}"), afin de péréniser au maximum les
|
||||||
|
|
Loading…
Reference in New Issue