SlideShare une entreprise Scribd logo
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 bonnes informations et en les
mettant en relation avec les bons pros.
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
Nos déploiements avant...
Github en panne ?
pypi inaccessible ?
Gestion des dépendances ?
Rollback ?
Reproductibilité ?
Testable ?
Staging ? QA ?
MeilleursAgents
Comment améliorer la situation
et garantir des déploiements
Contexte
1. Fiables
2. Testable
3. Reproductibles
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
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
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
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
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-playbook plays/ma-app
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é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

Contenu connexe

Tendances

REX - Passage de CVS à Git
REX - Passage de CVS à GitREX - Passage de CVS à Git
REX - Passage de CVS à GitPierre Templier
 
GitHub - Présentation
GitHub - PrésentationGitHub - Présentation
GitHub - PrésentationDavid RIEHL
 
Développement avec Intégration continue:Git, Jenkins, Tomcat, CentOS, ubuntu
Développement avec Intégration continue:Git, Jenkins, Tomcat, CentOS, ubuntuDéveloppement avec Intégration continue:Git, Jenkins, Tomcat, CentOS, ubuntu
Développement avec Intégration continue:Git, Jenkins, Tomcat, CentOS, ubuntuAhmed Archive
 
DevOps : mission [im]possible ?
DevOps : mission [im]possible ?DevOps : mission [im]possible ?
DevOps : mission [im]possible ?rfelden
 
Devoxx France : Kubernetes University, Cap sur l’orchestration Docker !
Devoxx France : Kubernetes University, Cap sur l’orchestration Docker !Devoxx France : Kubernetes University, Cap sur l’orchestration Docker !
Devoxx France : Kubernetes University, Cap sur l’orchestration Docker !Publicis Sapient Engineering
 
REX sur l'outilage Continuous Delivery
REX sur l'outilage Continuous DeliveryREX sur l'outilage Continuous Delivery
REX sur l'outilage Continuous DeliveryDamien Goldenberg
 
Paris Container Day 2016 : Choisissez votre style avec docker & Amazon Web Se...
Paris Container Day 2016 : Choisissez votre style avec docker & Amazon Web Se...Paris Container Day 2016 : Choisissez votre style avec docker & Amazon Web Se...
Paris Container Day 2016 : Choisissez votre style avec docker & Amazon Web Se...Publicis Sapient Engineering
 
Kubernetes Meetup Paris #5 - Metriques applicatives k8s
Kubernetes Meetup Paris #5 - Metriques applicatives k8sKubernetes Meetup Paris #5 - Metriques applicatives k8s
Kubernetes Meetup Paris #5 - Metriques applicatives k8sArnaud MAZIN
 
Formation autour de git et git lab
Formation autour de git et git labFormation autour de git et git lab
Formation autour de git et git labAbdelghani Azri
 
Git vs SVN
Git vs SVNGit vs SVN
Git vs SVNneuros
 
Prise en main de Jhipster
Prise en main de JhipsterPrise en main de Jhipster
Prise en main de JhipsterKokou Gaglo
 
Intégration continue et déploiement continue avec Jenkins
Intégration continue et déploiement continue avec JenkinsIntégration continue et déploiement continue avec Jenkins
Intégration continue et déploiement continue avec JenkinsKokou Gaglo
 
OpenShift en production - Akram Ben Assi & Eloïse Faure
OpenShift en production - Akram Ben Assi & Eloïse FaureOpenShift en production - Akram Ben Assi & Eloïse Faure
OpenShift en production - Akram Ben Assi & Eloïse FaureParis Container Day
 
Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)
Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)
Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)Publicis Sapient Engineering
 
Migration d'une base de code subversion vers git
Migration d'une base de code subversion vers gitMigration d'une base de code subversion vers git
Migration d'une base de code subversion vers gitGeoffrey Bachelet
 

Tendances (20)

REX - Passage de CVS à Git
REX - Passage de CVS à GitREX - Passage de CVS à Git
REX - Passage de CVS à Git
 
GitHub - Présentation
GitHub - PrésentationGitHub - Présentation
GitHub - Présentation
 
Automatiser l'ère post-dev
Automatiser l'ère post-devAutomatiser l'ère post-dev
Automatiser l'ère post-dev
 
Développement avec Intégration continue:Git, Jenkins, Tomcat, CentOS, ubuntu
Développement avec Intégration continue:Git, Jenkins, Tomcat, CentOS, ubuntuDéveloppement avec Intégration continue:Git, Jenkins, Tomcat, CentOS, ubuntu
Développement avec Intégration continue:Git, Jenkins, Tomcat, CentOS, ubuntu
 
DevOps : mission [im]possible ?
DevOps : mission [im]possible ?DevOps : mission [im]possible ?
DevOps : mission [im]possible ?
 
Versioning avec Git
Versioning avec GitVersioning avec Git
Versioning avec Git
 
Jenkins Workflow
Jenkins WorkflowJenkins Workflow
Jenkins Workflow
 
Devoxx France : Kubernetes University, Cap sur l’orchestration Docker !
Devoxx France : Kubernetes University, Cap sur l’orchestration Docker !Devoxx France : Kubernetes University, Cap sur l’orchestration Docker !
Devoxx France : Kubernetes University, Cap sur l’orchestration Docker !
 
REX sur l'outilage Continuous Delivery
REX sur l'outilage Continuous DeliveryREX sur l'outilage Continuous Delivery
REX sur l'outilage Continuous Delivery
 
Code, ship and run
Code, ship and runCode, ship and run
Code, ship and run
 
Paris Container Day 2016 : Choisissez votre style avec docker & Amazon Web Se...
Paris Container Day 2016 : Choisissez votre style avec docker & Amazon Web Se...Paris Container Day 2016 : Choisissez votre style avec docker & Amazon Web Se...
Paris Container Day 2016 : Choisissez votre style avec docker & Amazon Web Se...
 
Kubernetes Meetup Paris #5 - Metriques applicatives k8s
Kubernetes Meetup Paris #5 - Metriques applicatives k8sKubernetes Meetup Paris #5 - Metriques applicatives k8s
Kubernetes Meetup Paris #5 - Metriques applicatives k8s
 
Formation autour de git et git lab
Formation autour de git et git labFormation autour de git et git lab
Formation autour de git et git lab
 
REX Openshift à la Poste
REX Openshift à la PosteREX Openshift à la Poste
REX Openshift à la Poste
 
Git vs SVN
Git vs SVNGit vs SVN
Git vs SVN
 
Prise en main de Jhipster
Prise en main de JhipsterPrise en main de Jhipster
Prise en main de Jhipster
 
Intégration continue et déploiement continue avec Jenkins
Intégration continue et déploiement continue avec JenkinsIntégration continue et déploiement continue avec Jenkins
Intégration continue et déploiement continue avec Jenkins
 
OpenShift en production - Akram Ben Assi & Eloïse Faure
OpenShift en production - Akram Ben Assi & Eloïse FaureOpenShift en production - Akram Ben Assi & Eloïse Faure
OpenShift en production - Akram Ben Assi & Eloïse Faure
 
Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)
Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)
Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)
 
Migration d'une base de code subversion vers git
Migration d'une base de code subversion vers gitMigration d'une base de code subversion vers git
Migration d'une base de code subversion vers git
 

Similaire à Python application packaging @ MeilleursAgents

Devoteam REX OpenShift DevOps - Red Hat Roadshow Paris - avril 2018
Devoteam REX OpenShift DevOps - Red Hat Roadshow Paris - avril 2018Devoteam REX OpenShift DevOps - Red Hat Roadshow Paris - avril 2018
Devoteam REX OpenShift DevOps - Red Hat Roadshow Paris - avril 2018Cedric Girard
 
Les méthodes agiles dans TFS
Les méthodes agiles dans TFSLes méthodes agiles dans TFS
Les méthodes agiles dans TFSDenis Voituron
 
Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017Julien Dubois
 
Open XKE - Introduire le Continuous Delivery dans votre entreprise par Jean-L...
Open XKE - Introduire le Continuous Delivery dans votre entreprise par Jean-L...Open XKE - Introduire le Continuous Delivery dans votre entreprise par Jean-L...
Open XKE - Introduire le Continuous Delivery dans votre entreprise par Jean-L...Publicis Sapient Engineering
 
WordCamp Lyon 2015 - WordPress, Git et l'intégration continue
 WordCamp Lyon 2015 - WordPress, Git et l'intégration continue WordCamp Lyon 2015 - WordPress, Git et l'intégration continue
WordCamp Lyon 2015 - WordPress, Git et l'intégration continueStéphane HULARD
 
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Alexandre Touret
 
20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache MavenArnaud Héritier
 
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...XavierPestel
 
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014Benoît de CHATEAUVIEUX
 
Installer et configurer NAGIOS sous linux
Installer et configurer NAGIOS sous linuxInstaller et configurer NAGIOS sous linux
Installer et configurer NAGIOS sous linuxZakariyaa AIT ELMOUDEN
 
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Alexandre Touret
 
Industrialisation des développements logiciels
Industrialisation des développements logicielsIndustrialisation des développements logiciels
Industrialisation des développements logicielsSylvain Leroy
 
ASP.NET MVC 6
ASP.NET MVC 6ASP.NET MVC 6
ASP.NET MVC 6Microsoft
 
Paris Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptParis Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptMichael Akbaraly
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureJonathan Bonzy
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureMarc Nazarian
 
Sébastien Coutu: Copy this Meetup Devops - microservices - infrastructure imm...
Sébastien Coutu: Copy this Meetup Devops - microservices - infrastructure imm...Sébastien Coutu: Copy this Meetup Devops - microservices - infrastructure imm...
Sébastien Coutu: Copy this Meetup Devops - microservices - infrastructure imm...MSDEVMTL
 
Introduction à TeamCity
Introduction à TeamCityIntroduction à TeamCity
Introduction à TeamCityUlrich VACHON
 
At2008 Grenoble Hugonnet Sanlaville Public
At2008 Grenoble Hugonnet Sanlaville PublicAt2008 Grenoble Hugonnet Sanlaville Public
At2008 Grenoble Hugonnet Sanlaville PublicEmmanuel Hugonnet
 

Similaire à Python application packaging @ MeilleursAgents (20)

Catalogue PFE 2019
Catalogue PFE 2019Catalogue PFE 2019
Catalogue PFE 2019
 
Devoteam REX OpenShift DevOps - Red Hat Roadshow Paris - avril 2018
Devoteam REX OpenShift DevOps - Red Hat Roadshow Paris - avril 2018Devoteam REX OpenShift DevOps - Red Hat Roadshow Paris - avril 2018
Devoteam REX OpenShift DevOps - Red Hat Roadshow Paris - avril 2018
 
Les méthodes agiles dans TFS
Les méthodes agiles dans TFSLes méthodes agiles dans TFS
Les méthodes agiles dans TFS
 
Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017
 
Open XKE - Introduire le Continuous Delivery dans votre entreprise par Jean-L...
Open XKE - Introduire le Continuous Delivery dans votre entreprise par Jean-L...Open XKE - Introduire le Continuous Delivery dans votre entreprise par Jean-L...
Open XKE - Introduire le Continuous Delivery dans votre entreprise par Jean-L...
 
WordCamp Lyon 2015 - WordPress, Git et l'intégration continue
 WordCamp Lyon 2015 - WordPress, Git et l'intégration continue WordCamp Lyon 2015 - WordPress, Git et l'intégration continue
WordCamp Lyon 2015 - WordPress, Git et l'intégration continue
 
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
 
20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven
 
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
 
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
 
Installer et configurer NAGIOS sous linux
Installer et configurer NAGIOS sous linuxInstaller et configurer NAGIOS sous linux
Installer et configurer NAGIOS sous linux
 
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
 
Industrialisation des développements logiciels
Industrialisation des développements logicielsIndustrialisation des développements logiciels
Industrialisation des développements logiciels
 
ASP.NET MVC 6
ASP.NET MVC 6ASP.NET MVC 6
ASP.NET MVC 6
 
Paris Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptParis Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascript
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeure
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeure
 
Sébastien Coutu: Copy this Meetup Devops - microservices - infrastructure imm...
Sébastien Coutu: Copy this Meetup Devops - microservices - infrastructure imm...Sébastien Coutu: Copy this Meetup Devops - microservices - infrastructure imm...
Sébastien Coutu: Copy this Meetup Devops - microservices - infrastructure imm...
 
Introduction à TeamCity
Introduction à TeamCityIntroduction à TeamCity
Introduction à TeamCity
 
At2008 Grenoble Hugonnet Sanlaville Public
At2008 Grenoble Hugonnet Sanlaville PublicAt2008 Grenoble Hugonnet Sanlaville Public
At2008 Grenoble Hugonnet Sanlaville Public
 

Python application packaging @ MeilleursAgents

  • 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: