## Build pipelines, Python and You
Wes Mason
[@1stvamp](http://twitter.com/1stvamp)
## Who?
- @1stvamp (twitter/github)
- Engineer at ServerDensity
- I release lots of open source code
###"a sub-discipline in software engineering concerned with the compilation, assembly, and delivery of source code into finished products or other software components."
## But builds are for Games and kernels
## Yeah?
```
./env/bin/activate
pip install -r requirements.txt
```
## Continuous integration makes my builds reliable
## My configuration management system deploys everything
## Versions are irrelevant because I deploy continuously
## Our devs know how it's built
## Our ops know how it's shipped
## Our QA dept know how it's tested
## ...and do any of them know *why*?
## My build broke, but why?
## Document, document, document
## Okay, so what's a build pipeline?
{Code change} / {Release}
→
Build steps
→
Package
→
Asset
→
Store
→
Deploy?
### Build steps
- Build server
- Continuous integration
- Buildbot, Jenkins, Travis
### Buildbot
- Built by the Twisted guys
- Continuous builds
- Polling / events (e.g. svn-hooks, git-hooks, Github webhooks etc.)
- Slaves can be VMs, actual machines, local, LXCs etc.
- Configured via Python
### Travis CI
- Free for open source (paid version too)
- Configured via `.travis.yml`
- travis-solo
- buildbot-travis
### Jenkins
- Arse to setup (but so can buildbot)
- ShiningPanda plugin - Python builds win
### Automating your build
- `make install`
- No really..
### Buildout
- Created by the zope/plone guys
- Configured via INI files
- Extended via Python
- 1.x includes virtualenv like abilities
### Buildout cont.
- Can create self contained "packages"
- Install from pretty much anywhere with recipes like `buildouthttp`
- Non-python package builds
- Wrap pretty much anything
- `dumppickedversions`
### fabric
- Automation and deployment tool
- Used for deploying things via SSH
- Can be used for builds steps
- `fabtools` makes this easier
```
from fabric.api import *
from fabtools import require
import fabtools
@task
def setup():
# Require some Debian/Ubuntu packages
require.deb.packages([
'imagemagick',
'libxml2-dev',
])
# Require a Python package
with fabtools.python.virtualenv('/home/myuser/env'):
require.python.package('pyramid')
```
### Virtualenvs
- pip is not a build tool
- (...but it can be, via `build` hooks in setuptools, distutils et al)
- `pip --list --outdated`
- ..also see `yolk`
### ..wrapping everything up..
- `tox` - multiple builds again different envs
- `dh-virtualenv`
- `virtualenvwrapper`
- `pythonbrew`
- `pyenv`
### Rockstack
```
rock build
rock test
rock run
```
### "Golden image" vs "golden package" vs "just rerun all the things"
- Build whole VM images
- ..or LXCs (`docker`)
- Build OS packages (`dh-virtualenv`)
- Build eggs, wheels, tar's
- ..or just let your CM handle it
## sys.exit(0)
- Slides: [github.com/1stvamp/pysheff-build-talk](https://github.com/1stvamp/pysheff-build-talk)
## ^D
- Jonathan "Joff" Oliver: [about.me/joffie](http://about.me/joffie)
- Grab me and say hi `:-)`