Page 1
IDAN GAZITPyWeb-IL 10, Nov 30th 2009
repeatable INSTALLS and DEPLOYMENTSPIP, VIRTUALENV and FABRIC
Page 2
HOORAY.
SO YOU HAVE A PROJECT
Page 3
NEW DEVELOPERNEW SERVERNEW VERSION
NOW YOU HAVE A
Page 4
NEW DEVELOPERSNEW SERVERSNEW VERSIONS
NOW YOU HAVE A HUNDRED
Page 5
MAKING SHIT
OVERHEAD
Page 6
http://www.flickr.com/photos/derpunk/3875534682
Page 7
KILL IT FIRST
THE OVERHEAD WILL KILL YOU
Page 8
ANY MORE AND YOU'RE F*CKED
ONE CLICK
Page 9
THESE TOOLS WILL HELP
ELIMINATE OVERHEAD
Page 10
PULL TOGETHER ALL THE PARTS OF YOUR APPREPEATABILITY
O(1) DEPLOYMENTSSCALABILITY
PROTECT YOUR APP FROM OTHER APPSISOLATION
Page 11
by IAN BICKING
VIRTUALENV
Page 12
http://www.flickr.com/photos/fensterbme/145621388
Page 13
NOT REALLY.
LIKE GOGGLES FOR YOUR PYTHON
Page 14
"PRIVATE" SITE-PACKAGES
ISOLATED PYTHON ENVIRONMENTS
Page 15
APP X APP YFOO 0.8
BAR 1.23BAZ 6.0c9
BLAH 2.2BAR 1.23
BLING 9.1b2
Page 16
APP X APP YFOO 0.8
BAR 1.23BAZ 6.0c9
BLAH 2.2BAR 1.24
BLING 9.1b2
Page 17
LIKE A VIRGIN
GLOBAL SITE-PACKAGES
Page 18
CREATE THE VIRTUALENV
$ python virtualenv.py ENV
Page 19
COMPLETE ISOLATION
--no-site-packages
Page 20
A FEW GLOBAL PACKAGES (IPYTHON, IPDB)
ME, PERSONALLY?
Page 21
TO ENTER THE MATRIX
$ source ENV/bin/activate
Page 22
WOAH.
(ENV)$ easy_install kungfu
Page 23
I CAN DODGE BULLETS
(ENV)$ python theone.py
Page 24
OPERATOR, I NEED AN EXIT!
(ENV)$ deactivate
Page 25
DIFFERENT VERSIONS OF THE SAME APP
MORE USE CASES
Page 26
SETUP THE SAME VIRTUALENV
DEPLOYING?
Page 27
IT'S JUST PYTHONPATH
WEB APPS
Page 28
YOU GOTTA KEEP'EM SEPARATED
INDEPENDENT VIRTUALENV
Page 29
http://www.flickr.com/photos/wendycopley/3025707754
Page 30
by DOUG HELLMANN
VIRTUALENVWRAPPER
Page 31
$ mkvirtualenv ENV$ workon ENV
Page 32
also by IAN BICKING
PIP
Page 33
GOODBYE, EASY_INSTALL
PIP INSTALLS PACKAGES
Page 34
NO PARTIAL INSTALLSNON-SUCKY CONSOLE OUTPUT
INSTALL FROM VCSREQUIREMENTS FILES
UNINSTALL
SMARTER
Page 35
PIP is VIRTUALENV-AWARE
$(ENV) pip install -E ENV mypackage
Page 36
BOOM. I HAZ REQUIREMENTZ FILE.
$(ENV) pip freeze -E ENV > reqs.txt
Page 37
SIT BACK AND RELAX
$(ENV) pip install -E ENV -r reqs.txt
Page 38
FRAMEWORK==0.2LIBRARY>=1.3
-e svn+http://myrepo/svn/MyApp#egg=MyApp
REQUIREMENTS FILE
Page 39
SUBVERSIONGIT
MERCURIALBAZAAR
SUPPORTED VCS's
Page 40
1. PULL FROM VCS2. CREATE VENV
3. PIP INSTALL FROM REQUIREMENTS FILE4. THERE IS NO STEP FOUR
FRESH DEPLOY
Page 41
http://www.flickr.com/photos/an-di/274127482
ROCKSTAR.
Page 42
4 STEPS IS 3 STEPS TOO MANY
NOT SO FAST
Page 43
maintained by JEFF FORCIER
FABRIC
Page 44
REMOTE COMMANDS OVER SSH(LOCAL COMMANDS TOO)
AUTOMATE
Page 45
EXCEPT PYTHONIC AND DELICIOUS
IT'S KIND OF LIKE ‘MAKE'
Page 47
FABFILE.PYfrom __future__ import with_statementfrom fabric.api import *
env.hosts = ['server1.foo.com', 'server2.foo.com']
def test(): with settings(warn_only=True): result = local('./manage.py test my_app', capture=False) if result.failed: abort("Aborting at user request.")
def pack(): local('tar czf /tmp/my_project.tgz .', capture=False)
def prepare(): test() pack()
def deploy(): put('/tmp/my_project.tgz', '/tmp/') with cd('/srv/django/my_project/'): run('tar xzf /tmp/my_project.tgz') run('touch app.wsgi')
Page 48
RUNS test() AND pack()
$ fab prepare
Page 49
ONE STEP NIRVANA.
$ fab prepare deploy
Page 50
FABFILE.PY
from __future__ import with_statementfrom fabric.api import *
def staging(): env.hosts = ['staging.foo.com']
def production(): env.hosts = ['prod1.foo.com', 'prod2.foo.com']
# ... more fab actions ...
def deploy(): put('/tmp/my_project.tgz', '/tmp/') with cd('/srv/django/my_project/'): run('tar xzf /tmp/my_project.tgz') run('touch app.wsgi')
Page 51
DEPLOY TO STAGING IN ONE LINE
$ fab staging deploy
Page 52
LOCALRUN
SUDOGET/PUTPROMPT
FABRIC BUILTINS
Page 53
REPEATABLE DEPENDENCY INSTALLSPIP
FOR AUTOMATED DEPLOYMENTSFABRIC
TO ISOLATE YOUR PROJECTVIRTUALENV
Page 54
http://pip.openplans.org/PIP
http://docs.fabfile.org/FABRIC
http://pypi.python.org/pypi/virtualenvVIRTUALENV
Page 56
@[email protected]
http://bit.ly/repeatable-deployments
THANK YOU!