Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Application packaging
chez MeilleursAgents
Paris.py - 2016-11-28
Nicolas Mussat
CTO
nicolas@meilleursagents.comAider les particuliers à réussir leur projet immobilier
en leur offrant les ...
MeilleursAgents
Migration de notre hébergeur vers Google Cloud Platform
Architecture cible similaire
Remise en question de...
MeilleursAgents
Nos déploiements avant...
user@prod:~$ git pull
user@prod:~$ pip install -r requirements.txt
user@prod:~$ ...
MeilleursAgents
Nos déploiements avant...
Github en panne ?
pypi inaccessible ?
Gestion des dépendances ?
Rollback ?
Repro...
MeilleursAgents
Comment améliorer la situation
et garantir des déploiements
Contexte
1. Fiables
2. Testable
3. Reproductib...
MeilleursAgents
Industrialisation et séparation du Build et du Run
Github
New Pull Request
Merge Master
Jenkins Code
check...
MeilleursAgents
Comment construire nos packages d'application ?
1. Séparer le Runtime (interpréteur, uwsgi, ...) de l'app ...
MeilleursAgents
Pourquoi ne pas packager le virtualenv complet directement ?
Embarque le runtime complet
Portabilité : arc...
MeilleursAgents
3 fichiers distincts
Gérer les versions des dépendances
flake8
ipdb
pytest-cov
pytest
watchdog
requirement...
MeilleursAgents
user@dev:~/repo$ pip install -t vendors -r requirements.txt
user@dev:~/repo$ tree
├── app.py
├── requireme...
MeilleursAgents
#!/usr/bin/env python3
import site
site.addsitedir('vendors')
from flask import Flask
app = Flask(__name__...
MeilleursAgents
Packager l'application
'''Main website'''
from setuptools import setup
VERSION = '1.0.0'
setup(
name='app'...
MeilleursAgents
user@dev:~/repo$ python3 setup.py sdist
user@dev:~/repo$ ls dist/
app-1.0.0.tar.gz
Packager l'application
MeilleursAgents
Nos déploiements maintenant...
user@dev:~/repo$ make build & make distribute
user@admin:~$ ansible-playboo...
MeilleursAgents
Merci !
Questions ?
Et sinon, on recrute : venez nous voir ! :)
MeilleursAgents
Wheels compilés avec python2, mis en cache et réutilisé en python3 ?!
Contournements possibles :
Désactive...
MeilleursAgents
pkg_resources pour interroger les metadatas de package ne gère pas
toujours bien les sitedirs custom.
eg. ...
Upcoming SlideShare
Loading in …5
×

Python application packaging @ MeilleursAgents

102 views

Published on

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.

Published in: Software
  • Be the first to comment

  • Be the first to like this

Python application packaging @ MeilleursAgents

  1. 1. Application packaging chez MeilleursAgents Paris.py - 2016-11-28
  2. 2. Nicolas Mussat CTO nicolas@meilleursagents.comAider les particuliers à réussir leur projet immobilier en leur offrant les bonnes informations et en les mettant en relation avec les bons pros.
  3. 3. MeilleursAgents Migration de notre hébergeur vers Google Cloud Platform Architecture cible similaire Remise en question de nos processes, notamment du déploiement Contexte
  4. 4. 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)
  5. 5. MeilleursAgents Nos déploiements avant... Github en panne ? pypi inaccessible ? Gestion des dépendances ? Rollback ? Reproductibilité ? Testable ? Staging ? QA ?
  6. 6. MeilleursAgents Comment améliorer la situation et garantir des déploiements Contexte 1. Fiables 2. Testable 3. Reproductibles
  7. 7. 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
  8. 8. 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
  9. 9. 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
  10. 10. 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
  11. 11. MeilleursAgents user@dev:~/repo$ pip install -t vendors -r requirements.txt user@dev:~/repo$ tree ├── app.py ├── requirements.txt └── vendors ├── flask ├── Flask-0.11.1.dist-info ├── itsdangerous-0.24-py3.4.egg-info ├── jinja2 ├── Jinja2-2.8.dist-info ├── markupsafe ├── MarkupSafe-0.23-py3.4.egg-info ├── werkzeug └── Werkzeug-0.11.11.dist-info Embarquer les dépendances
  12. 12. MeilleursAgents #!/usr/bin/env python3 import site site.addsitedir('vendors') from flask import Flask app = Flask(__name__) @app.route('/') def index(): return 'o/' Embarquer les dépendances Technique empruntée à Google AppEngine : https://cloud.google.com/appengine/docs/python/tools/appengineconfig
  13. 13. MeilleursAgents Packager l'application '''Main website''' from setuptools import setup VERSION = '1.0.0' setup( name='app', version=VERSION, author='MeilleursAgents', description=__doc__ # ... ) setup.py include *.py include Makefile graft tests graft vendors global-exclude *.py[co] global-exclude __pycache__ MANIFEST.in
  14. 14. MeilleursAgents user@dev:~/repo$ python3 setup.py sdist user@dev:~/repo$ ls dist/ app-1.0.0.tar.gz Packager l'application
  15. 15. MeilleursAgents Nos déploiements maintenant... user@dev:~/repo$ make build & make distribute user@admin:~$ ansible-playbook plays/ma-app
  16. 16. MeilleursAgents Merci ! Questions ? Et sinon, on recrute : venez nous voir ! :)
  17. 17. 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
  18. 18. 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

×