repeatable deployments and installations

56
IDAN GAZIT PyWeb-IL 10, Nov 30 th 2009 repeatable INSTALLS and DEPLOYMENTS PIP, VIRTUALENV and FABRIC

Upload: idan-gazit

Post on 13-May-2015

4.718 views

Category:

Technology


0 download

DESCRIPTION

Using virtualenv, pip, and fabric

TRANSCRIPT

IDAN GAZITPyWeb-IL 10, Nov 30th 2009

repeatable INSTALLS and DEPLOYMENTSPIP, VIRTUALENV and FABRIC

HOORAY.

SO YOU HAVE A PROJECT

NEW DEVELOPERNEW SERVERNEW VERSION

NOW YOU HAVE A

NEW DEVELOPERSNEW SERVERSNEW VERSIONS

NOW YOU HAVE A HUNDRED

MAKING SHIT

OVERHEAD

KILL IT FIRST

THE OVERHEAD WILL KILL YOU

ANY MORE AND YOU'RE F*CKED

ONE CLICK

THESE TOOLS WILL HELP

ELIMINATE OVERHEAD

PULL TOGETHER ALL THE PARTS OF YOUR APPREPEATABILITY

O(1) DEPLOYMENTSSCALABILITY

PROTECT YOUR APP FROM OTHER APPSISOLATION

by IAN BICKING

VIRTUALENV

NOT REALLY.

LIKE GOGGLES FOR YOUR PYTHON

"PRIVATE" SITE-PACKAGES

ISOLATED PYTHON ENVIRONMENTS

APP X APP YFOO 0.8

BAR 1.23BAZ 6.0c9

BLAH 2.2BAR 1.23

BLING 9.1b2

APP X APP YFOO 0.8

BAR 1.23BAZ 6.0c9

BLAH 2.2BAR 1.24

BLING 9.1b2

LIKE A VIRGIN

GLOBAL SITE-PACKAGES

CREATE THE VIRTUALENV

$ python virtualenv.py ENV

COMPLETE ISOLATION

--no-site-packages

A FEW GLOBAL PACKAGES (IPYTHON, IPDB)

ME, PERSONALLY?

TO ENTER THE MATRIX

$ source ENV/bin/activate

WOAH.

(ENV)$ easy_install kungfu

I CAN DODGE BULLETS

(ENV)$ python theone.py

OPERATOR, I NEED AN EXIT!

(ENV)$ deactivate

DIFFERENT VERSIONS OF THE SAME APP

MORE USE CASES

SETUP THE SAME VIRTUALENV

DEPLOYING?

IT'S JUST PYTHONPATH

WEB APPS

YOU GOTTA KEEP'EM SEPARATED

INDEPENDENT VIRTUALENV

by DOUG HELLMANN

VIRTUALENVWRAPPER

$ mkvirtualenv ENV$ workon ENV

also by IAN BICKING

PIP

GOODBYE, EASY_INSTALL

PIP INSTALLS PACKAGES

NO PARTIAL INSTALLSNON-SUCKY CONSOLE OUTPUT

INSTALL FROM VCSREQUIREMENTS FILES

UNINSTALL

SMARTER

PIP is VIRTUALENV-AWARE

$(ENV) pip install -E ENV mypackage

BOOM. I HAZ REQUIREMENTZ FILE.

$(ENV) pip freeze -E ENV > reqs.txt

SIT BACK AND RELAX

$(ENV) pip install -E ENV -r reqs.txt

FRAMEWORK==0.2LIBRARY>=1.3

-e svn+http://myrepo/svn/MyApp#egg=MyApp

REQUIREMENTS FILE

SUBVERSIONGIT

MERCURIALBAZAAR

SUPPORTED VCS's

1. PULL FROM VCS2. CREATE VENV

3. PIP INSTALL FROM REQUIREMENTS FILE4. THERE IS NO STEP FOUR

FRESH DEPLOY

http://www.flickr.com/photos/an-di/274127482

ROCKSTAR.

4 STEPS IS 3 STEPS TOO MANY

NOT SO FAST

maintained by JEFF FORCIER

FABRIC

REMOTE COMMANDS OVER SSH(LOCAL COMMANDS TOO)

AUTOMATE

EXCEPT PYTHONIC AND DELICIOUS

IT'S KIND OF LIKE ‘MAKE'

FABFILE.PY

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')

RUNS test() AND pack()

$ fab prepare

ONE STEP NIRVANA.

$ fab prepare deploy

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')

DEPLOY TO STAGING IN ONE LINE

$ fab staging deploy

LOCALRUN

SUDOGET/PUTPROMPT

FABRIC BUILTINS

REPEATABLE DEPENDENCY INSTALLSPIP

FOR AUTOMATED DEPLOYMENTSFABRIC

TO ISOLATE YOUR PROJECTVIRTUALENV

QUESTIONS?

@[email protected]

http://bit.ly/repeatable-deployments

THANK YOU!