1 from __future__ import with_statement # needed for python 2.5
2 from fabric.api import *
3 from fabric.contrib import files
12 env.project_name = 'wolnelektury'
17 """Use staging server"""
18 env.hosts = ['stigma.nowoczesnapolska.org.pl:2222']
19 env.user = 'platforma'
20 env.path = '/var/services/wolnelektury'
21 env.python = '/usr/bin/python'
22 env.virtualenv = '/usr/bin/virtualenv'
23 env.pip = '/usr/bin/pip'
26 """Use production server"""
27 env.hosts = ['wolnelektury.pl']
29 env.path = '/srv/wolnelektury.pl'
30 env.python = '/usr/bin/python'
31 env.virtualenv = '/usr/bin/virtualenv'
32 env.pip = '/usr/bin/pip'
38 "Run the test suite and bail out if it fails"
39 require('hosts', 'path', provided_by=[staging, production])
40 result = run('cd %(path)s/%(project_name)s; %(python)s manage.py test' % env)
44 Setup a fresh virtualenv as well as a few useful directories, then run
45 a full deployment. virtualenv and pip should be already installed.
47 require('hosts', 'path', provided_by=[staging, production])
49 run('mkdir -p %(path)s; cd %(path)s; %(virtualenv)s .;' % env, pty=True)
50 run('cd %(path)s; mkdir releases; mkdir shared; mkdir packages;' % env, pty=True)
51 run('cd %(path)s/releases; ln -s . current; ln -s . previous' % env, pty=True)
56 Deploy the latest version of the site to the servers,
57 install any required third party modules,
58 install the virtual host and then restart the webserver
60 require('hosts', 'path', provided_by=[staging, production])
63 env.release = time.strftime('%Y-%m-%dT%H%M')
69 install_requirements()
71 symlink_current_release()
75 def deploy_version(version):
76 "Specify a specific version to be made live"
77 require('hosts', 'path', provided_by=[localhost,webserver])
80 run('rm releases/previous; mv releases/current releases/previous;', pty=True)
81 run('ln -s %(version)s releases/current' % env, pty=True)
86 Limited rollback capability. Simple loads the previously current
87 version of the code. Rolling back again will swap between the two.
89 require('hosts', provided_by=[staging, production])
92 run('mv releases/current releases/_previous;', pty=True)
93 run('mv releases/previous releases/current;', pty=True)
94 run('mv releases/_previous releases/previous;', pty=True)
98 # =====================================================================
99 # = Helpers. These are called by other functions rather than directly =
100 # =====================================================================
101 def upload_tar_from_git():
102 "Create an archive from the current Git branch and upload it"
103 print '>>> upload tar from git'
104 require('release', provided_by=[deploy])
105 local('git-archive-all.sh --format tar %(release)s.tar' % env)
106 local('gzip %(release)s.tar' % env)
107 run('mkdir -p %(path)s/releases/%(release)s' % env, pty=True)
108 run('mkdir -p %(path)s/packages' % env, pty=True)
109 put('%(release)s.tar.gz' % env, '%(path)s/packages/' % env)
110 run('cd %(path)s/releases/%(release)s && tar zxf ../../packages/%(release)s.tar.gz' % env, pty=True)
111 local('rm %(release)s.tar.gz' % env)
113 def upload_vhost_sample():
114 "Create and upload Apache virtual host configuration sample"
115 print ">>> upload vhost sample"
116 files.upload_template('%(project_name)s.vhost.template' % env, '%(path)s/%(project_name)s.vhost.sample' % env, context=env)
118 def upload_wsgi_script():
119 "Create and upload a wsgi script sample"
120 print ">>> upload wsgi script sample"
121 files.upload_template('%(project_name)s.wsgi.template' % env, '%(path)s/%(project_name)s.wsgi' % env, context=env)
122 run('chmod ug+x %(path)s/%(project_name)s.wsgi' % env)
124 def upload_celery_conf():
125 "Create and upload a Celery conf for supervisord"
126 print ">>> upload celery supervisord conf"
127 files.upload_template('%(project_name)s-celery.conf.template' % env, '%(path)s/%(project_name)s-celery.conf' % env, context=env)
128 run('chmod ug+x %(path)s/%(project_name)s-celery.conf' % env)
130 def install_requirements():
131 "Install the required packages from the requirements file using pip"
132 print '>>> install requirements'
133 require('release', provided_by=[deploy])
134 run('cd %(path)s; %(pip)s install -E . -r %(path)s/releases/%(release)s/requirements.txt' % env, pty=True)
136 def copy_localsettings():
137 "Copy localsettings.py from root directory to release directory (if this file exists)"
138 print ">>> copy localsettings"
139 require('release', provided_by=[deploy])
140 require('path', provided_by=[staging, production])
142 with settings(warn_only=True):
143 run('cp %(path)s/localsettings.py %(path)s/releases/%(release)s/%(project_name)s' % env)
145 def symlink_current_release():
146 "Symlink our current release"
147 print '>>> symlink current release'
148 require('release', provided_by=[deploy])
149 require('path', provided_by=[staging, production])
151 run('rm releases/previous; mv releases/current releases/previous')
152 run('ln -s %(release)s releases/current' % env)
155 "Update the database"
157 require('project_name', provided_by=[staging, production])
158 with cd('%(path)s/releases/current/%(project_name)s' % env):
159 run('../../../bin/python manage.py syncdb --noinput' % env, pty=True)
161 run('../../../bin/python manage.py migrate' % env, pty=True)
163 def restart_webserver():
164 "Restart the web server"
165 print '>>> restart webserver'
166 run('touch %(path)s/%(project_name)s.wsgi' % env)
167 print '>>> restart Celery'
168 sudo('supervisorctl restart celery.%(project_name)s' % env)