\chapter{Intégration continue / Déploiement Continu}

\begin{quote}
    \textit{New code should never go live without first being audited for correctness and security}. \cite{django_for_startup_founders}
\end{quote}

Les processus d'intégration continue \footnote{CI - Continuous Integration} et de déploiement continu \footnote{CD - Continuous Deployment} permettent d'automatiser des étapes de vérifications, initialement réalisées par un être humain, par des automates réagissant à des évènements particuliers: typiquement, une nouvelle version du code, un nouveau \textit{commit}, la mise à jour d'un des composants, \ldots

\section{Intégration continue}

L'intégration continue consiste à pousser la pyramide des tests jusqu'à son paroxysme, toujours en laissant un automatate jouer son rôle de bouée de sauvetage.

Chaque pipeline peut être modélisé selon plusieurs étapes, en parallèle ou en séquence, appelant chacune un ensemble de règles, d'outils, et proposant deux états de sortie possibles: soit c'est OK, soit pas.
Au sens booléen des termes.

\textit{A priori}, une sortie négative impliquera une \textit{failure} de l'ensemble du pipeline, bien qu'il soit possible de définir des étapes facultatives (pouvant être exécutées sur certains environnements uniquement), etc.

Un pipeline simpliste, mais déjà complet ressemble à ceci:

\begin{minted}{yaml}
matrix:
  PYTHON_VERSION:
    - latest
    - 3.9
    - 3.8

pipeline:
  lint:
    image: python:${PYTHON_VERSION}
    commands:
      - pip3 install poetry
      - poetry install
      - poetry run flake8 src/
      - poetry run pylint src/
      - poetry run bandit --silent -r src/
      - poetry run mypy .

  unit_tests:
    image: python:${PYTHON_VERSION}
    commands:
      - pip3 install poetry
      - poetry config virtualenvs.create false
      - poetry run pytest --cov-report term-missing tests/unit/

\end{minted}

\section{Déploiement continu}

Le déploiement continu est une extension de l'intégration continue, qui est jusqu'au-boutiste à s'occuper lui-même de mettre à disposition une nouvelle version, sous réserve qu'elle ait passé les différentes étapes du pipeline.
C'est ainsi qu'Amazon ou certaines grandes \footnote{ie. \textit{"envahissantes"}} entreprises publient jusqu'à plusieurs miliers de nouvelles fonctionnalités \textbf{par jour}.
