Comment, dans le cadre de la migration vers Google Cloud Platform, MeilleursAgents a revu ses techniques de déploiements d'applications Python pour garantir des releases fiables, testables et reproductibles.
MeilleursAgents
Migration de notre hébergeur vers Google Cloud Platform
Architecture cible similaire
Remise en question de nos processes, notamment du déploiement
Contexte
MeilleursAgents
Nos déploiements avant...
user@prod:~$ git pull
user@prod:~$ pip install -r requirements.txt
user@prod:~$ sudo systemctl restart uwsgi
Quand même scripté avec Fabric, mais globalement, c'était ça :) (sur plusieurs serveurs)
MeilleursAgents
Industrialisation et séparation du Build et du Run
Github
New Pull Request
Merge Master
Jenkins Code
checkout
Packaging Tests Storage
BUILDRUN
Ansible Compute
Engine
(aka VM)
Storage
Ansible-playbook
ma-admin-prod
ssh
MeilleursAgents
Comment construire nos packages d'application ?
1. Séparer le Runtime (interpréteur, uwsgi, ...) de l'app (code, deps, …)
1. Gérer les versions des dépendances
2. Embarquer les dépendances avec le code
3. Utiliser Setuptools pour construire le package
MeilleursAgents
Pourquoi ne pas packager le virtualenv complet directement ?
Embarque le runtime complet
Portabilité : archi, dépendances systèmes, AppEngine/Heroku, ...
Pourquoi pas Docker ?
Excellent candidat pour simplifier beaucoup de chose
Trop compliqué pour nous pour la migration initiale :)
Lot 2 de la migration !
Séparer le runtime
MeilleursAgents
3 fichiers distincts
Gérer les versions des dépendances
flake8
ipdb
pytest-cov
pytest
watchdog
requirements-dev.txt
Tout l'outillage de développement
flask
flask-sqlalchemy
flask-login
requests
requirements-app.txt
Les réelles dépendances de l'application
Flask==0.11.1
Flask-Login==0.4.0
Flask-SQLAlchemy==2.1
Jinja2==2.8
MarkupSafe==0.23
SQLAlchemy==1.1.4
Werkzeug==0.11.11
click==6.6
itsdangerous==0.24
requests==2.12.1
requirements.txt
Toutes les dépendances, versions figées
pip freeze > requirements.txt
Initiative de refonte du requirements.txt intéressante : https://github.com/pypa/pipfile
MeilleursAgents
Wheels compilés avec python2, mis en cache et réutilisé en python3 ?!
Contournements possibles :
Désactiver les wheels :(
Homogénéiser toutes les apps en Python 3 :)
user@dev:~$ pip install --no-binary :all: psycopg2
Gotchas
MeilleursAgents
pkg_resources pour interroger les metadatas de package ne gère pas
toujours bien les sitedirs custom.
eg. Workalendar :
Contournement :
PYTHONPATH=vendors python3 app.py
Renverser la logique et lire la version depuis setup.py
# __init__.py
__version__ = pkg_resources.get_distribution(__package__).version
Gotchas