Publicité
Publicité

Contenu connexe

Similaire à Python application packaging @ MeilleursAgents(20)

Publicité

Python application packaging @ MeilleursAgents

  1. Application packaging chez MeilleursAgents Paris.py - 2016-11-28
  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. 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. 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. MeilleursAgents Nos déploiements avant... Github en panne ? pypi inaccessible ? Gestion des dépendances ? Rollback ? Reproductibilité ? Testable ? Staging ? QA ?
  6. MeilleursAgents Comment améliorer la situation et garantir des déploiements Contexte 1. Fiables 2. Testable 3. Reproductibles
  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. 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. 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. 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. 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. 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. 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. MeilleursAgents user@dev:~/repo$ python3 setup.py sdist user@dev:~/repo$ ls dist/ app-1.0.0.tar.gz Packager l'application
  15. MeilleursAgents Nos déploiements maintenant... user@dev:~/repo$ make build & make distribute user@admin:~$ ansible-playbook plays/ma-app
  16. MeilleursAgents Merci ! Questions ? Et sinon, on recrute : venez nous voir ! :)
  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. 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

Notes de l'éditeur

  1. Fix Build:
Publicité