hello fabric

In an effort to teach myself a little about Fabric, I threw together a script to help publish updates for this blog. It's stored on Github and is an auto-generated static site created by FlipFlop.

from __future__ import with_statement
import re
from fabric.api import run, cd, env

env.hosts = ['selfcontained.us']

def publish():
	with cd('/data/www/selfcontained'):
		run('git pull')
		run('flipflop generate')
	print('changes published')

So simple, just a fab publish and changes are out there. Sure beats ssh'ing around and doing it manually. I realize this is a super basic useage of fabric, but I'm a fan.

Here's a few more commands I put together for tagging and deploying tags to a server:

def tag(version=None):
	if version is None:
		version = getNextVersion()
	if(confirm('create new tag (%s)?' % version) is False):
		abort('no tag for u')
	local('git tag -a %s -m "%s"' % (version, version))
	local('git push --tags');
	print('tag %s created' % version)

def deploy(version=None):
	if version is None:
		version = getNextVersion()
	if newVersion(version):
		tag(version)
	if(confirm('Deploy tag "%s" to production?' % version) is False):
		abort('no deploy for u')
	with cd('/path/to/repo'):
		run('git fetch')
		run('git co %s' % version)
		sudo('/etc/init.d/apache2 restart')
	print('tag %s deployed' % version)

def getNextVersion():
	latest = local('git tag | sort -V | tail -1').strip().split('.')
	latest.append(str(int(latest.pop())+1))
	return '.'.join(latest)

def newVersion(version):
	return version not in local('git tag').strip().split('\n')