Montée de version d’une App Python

Imaginons que nous avons une application qui tourne sous python 3.7 que l’on souhaite passer en 3.10 pour une raison quelconque. Il faut alors gérer les librairies compatible, les monter au plus haut niveau possible et vérifier qu’aucune vulnérabilité ne soit détectée sur les version choisies.

La démarche est la suivante :

1 - Safety

Remarque : pour aller plus vite on peut effectuer le scan safety sur le requirements.txt minimal en sortie de pipdeptree (cf partie suivante) 

Commençons par un scan des librairies utilisées afin d’analyser les éventuelles vulnérabilités.
Safety est idéal pour ça : ce scan utilise une BDD en ligne pour regarder les vulnérabilités dans les packages utilisés par l’application. La BDD en question est mise à jour tous les mois. 

Dans un invite de commandes se placer dans le répertoire à scanner :

#Installation 
pip install safety 
#création du rapport
safety check --file requirements.txt --html > report-safety.html

Ici on scan les dépendances répertoriées dans le fichier requirements.txt pour générer un rapport au format HTML nommé report.html.

Safety check sans argument va analyser les librairies / dépendance de l’environnement python en entier et faire un rapport dans le terminal. 

Ce rapport indiquera pour chaque package leurs vulnérabilités connues et à partir de quelle version les vulnérabilités sont patchées dans la colonne « All vunerable specs ».

Exemple :

Ici on a 5 vulnérabilités dont 4 sur la version de fastapi choisie. Il est recommandé de prendre une version supérieure à la 0.109.1 pour fastapi et supérieure à la 2.4.0 pour pydantic. Dans un cas avec plein de librairies et plein de vulnérabilité un classeur excel peut aider à dégrossir le sujet.

2 - Pipdeptree

Pipdeptree permet de visualiser les dépendances des paquets installés dans un environnement virtuel. Il crée un arbre de dépendances qui montre non seulement les paquets installés, mais aussi leurs dépendances respectives. Cela donne une vue claire de la hiérarchie des paquets, permettant de voir quels paquets dépendent de quels autres. En voyant toutes les dépendances installées, les développeurs peuvent identifier et supprimer les paquets inutilisés ou redondants, réduisant ainsi la complexité et la taille de l’environnement.

Pour l’utiliser il suffit de :
# Création de l'environnement virtuel (si ce n'est pas déjà fait) :
python -m venv myenv

# Activation de l'environnement virtuel :
# Sur Windows :
myenv\Scripts\activate

# Sur macOS et Linux :
source myenv/bin/activate

# installer les librairies du projet à analyser en se plaçant dans le dossier du fichier requirements.txt
pip install -r requirements.txt

# installation de l'outil
pip install pipdeptree

# execution de l'outil toujours dans le répertoire de votre projet où l'environnement virtuel est activé
pipdeptree

Exemple d’output :

Ici fastapi et pandas suffisent dans le requirements.txt minimal.

3 - Pypi

Pour rappel: la commande pip install est principalement utilisée pour installer des packages depuis le Python Package Index (PyPI) ou d’autres sources de packages Python. PyPI est un dépôt central qui héberge des milliers de packages Python open source, ce qui en fait une ressource précieuse pour les développeurs Python.

Maintenant voyons les package recommandés pour notre version de python cible (3.10 pour l’exemple).

Un « dry-run » avec pip est une fonctionnalité qui permet de simuler une opération sans réellement l’exécuter. Lorsqu’on exécute une commande pip avec l’option « dry-run », pip effectue toutes les vérifications nécessaires pour déterminer ce qui se passerait si on exécutait réellement la commande, mais sans apporter de modifications réelles à votre système.

Par exemple cela vérifiera si le package spécifié peut être installé, s’il y a des conflits avec d’autres packages déjà installés, et s’il existe des dépendances manquantes ou des problèmes de version. Il montrera ensuite un résumé des actions qu’il effectuerait sans réellement les exécuter.

python -m pip install fastapi --dry-run --python-version 3.10 --no-deps --target foo
  • python -m pip install fastapi: Cela invoque le module pip de Python pour installer le package FastAPI.
  • –dry-run: Cette option demande à pip de simuler l’installation sans effectuer de modifications réelles sur le système. Pip va donc vérifier les dépendances, les conflits potentiels, et afficher un résumé des actions qu’il exécuterait sans les exécuter réellement.
  • –python-version 3.10: Spécifie la version de Python pour laquelle l’installation est simulée. Dans ce cas, il s’agit de Python 3.10.
  • –no-deps: Indique à pip de ne pas installer les dépendances du package spécifié. Cela signifie que seuls FastAPI et ses dépendances directes seront considérés dans la simulation.
  • –target foo: Cette option spécifie un répertoire cible foo où les fichiers FastAPI seraient installés. Dans le cadre d’un « dry-run », cela indique simplement à pip où les fichiers seraient placés s’ils étaient réellement installés.
Exemple de résultat :

4 - Comparaison

Maintenant qu’on a nos 3 recommandations de version il ne reste plus qu’à les mettre en vis à vis pour choisir la solution idéale ! Excel est un allié.

LIBRAIRIE
VERSION INTIALE
RECO SAFETY
RECO PYPI
fastapi
0.85.2
<0.109.1
0.111.0

Dans cet exemple on choisirait assez simplement la version 0.111.0 correspondant à la recommandation Pypi pour notre version de python et respectant la contrainte de la recommandation de safety. Mais certains cas plus complexe peuvent entraîner une analyse plus poussée et d’éventuels choix arbitraires.

5 - Débug

Il ne reste plus qu’à :

  1. Rédiger le fichier requirements.txt minimal avec les librairies choisies à l’étape précédente,
  2. Télécharger la version de python cible
  3. Créer un environnement virtuel utilisant cette version de python
  4. Lancer l’installation des librairies dans un environnement virtuel
  5. Lancer l’application montée de version dans ce même environnement
  6. Lancer les TNR / TU et tests fonctionnels et débugger empiriquement

NB pour l’étape 3 :

python -m virtualenv -p <path-vers-python.exe-de-la-bonne-version> venv

# Exemple
python -m virtualenv -p C:\Users\username\AppData\Local\Programs\Python\Python310\python.exe venv

Publications similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *