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 = 'platforma'
14 env.giturl = "git://github.com/fnp/redakcja.git"
19 """Use staging server"""
20 env.hosts = ['stigma.nowoczesnapolska.org.pl:2222']
21 env.user = 'platforma'
22 env.path = '/var/services/platforma'
23 env.python = '/usr/bin/python'
24 env.virtualenv = '/usr/bin/virtualenv'
25 env.pip = '/usr/bin/pip'
26 env.gitbranch = "staging"
31 """Use production server"""
32 env.hosts = ['szo.nowoczesnapolska.org.pl:2225']
33 env.user = 'librarian'
34 env.gitbranch = 'master'
35 env.sandbox = '/srv/library-in-a-box/sandbox/'
36 env.virtualenv = os.path.join(env.sandbox, 'bin', 'virtualenv')
38 env.pip = os.path.join(env.sandbox, 'python', 'bin', 'pip')
39 env.python = env.target = os.path.join(env.sandbox, 'python', 'bin', 'python')
45 env.path = os.path.join(env.sandbox, env.project_name)
52 "Run the test suite and bail out if it fails"
53 require('hosts', 'path', provided_by=[staging, production])
54 result = run('cd %(path)s/%(project_name)s; %(python)s manage.py test' % env)
59 Setup a fresh virtualenv as well as a few useful directories, then run
60 a full deployment. virtualenv and pip should be already installed.
62 require('hosts', 'sandbox', provided_by=[staging, production])
64 run("mkdir -p %(path)s; mkdir -p %(path)s/www/wsgi;" % env)
69 git clone %(giturl)s mirror;
71 git pull""" % env, pty=True)
73 run('%(virtualenv)s %(path)s' % env, pty=True)
74 run('cd %(path)s; mkdir -p releases; mkdir -p shared; mkdir -p packages;' % env, pty=True)
75 run('cd %(path)s/releases; ln -s . current; ln -s . previous' % env, pty=True)
81 Deploy the latest version of the site to the servers,
82 install any required third party modules,
83 install the virtual host and then restart the webserver
85 require('hosts', 'sandbox', 'gitbranch', provided_by=[staging, production])
87 env.release = time.strftime('%Y-%m-%dT%H%M')
89 prepare_package_from_git()
92 # upload_vhost_sample()
93 install_requirements()
95 symlink_current_release()
101 def deploy_version(version):
102 "Specify a specific version to be made live"
103 require('hosts', 'path', provided_by=[localhost, webserver])
104 env.version = version
106 run('rm releases/previous; mv releases/current releases/previous;', pty=True)
107 run('ln -s %(version)s releases/current' % env, pty=True)
114 Limited rollback capability. Simple loads the previously current
115 version of the code. Rolling back again will swap between the two.
117 require('hosts', provided_by=[staging, production])
120 run('mv releases/current releases/_previous;', pty=True)
121 run('mv releases/previous releases/current;', pty=True)
122 run('mv releases/_previous releases/previous;', pty=True)
126 # =====================================================================
127 # = Helpers. These are called by other functions rather than directly =
128 # =====================================================================
129 def prepare_package_from_git():
130 "Create an archive from the current Git master branch and upload it"
131 print '>>> upload tar from git'
133 require('release', provided_by=[deploy])
135 run('mkdir -p %(path)s/releases/%(release)s' % env, pty=True)
136 run('mkdir -p %(path)s/packages' % env, pty=True)
137 run('cd %(path)s/mirror; git archive --format=tar %(gitbranch)s | gzip > %(path)s/packages/%(release)s.tar.gz' % env)
138 run('cd %(path)s/releases/%(release)s && tar zxf ../../packages/%(release)s.tar.gz' % env, pty=True)
141 #def upload_vhost_sample():
142 # "Create and upload Apache virtual host configuration sample"
143 # print ">>> upload vhost sample"
144 # files.upload_template('%(project_name)s.vhost.template' % env, '%(path)s/%(project_name)s.vhost.sample' % env, context=env)
147 def upload_wsgi_script():
148 "Create and upload a wsgi script sample"
149 print ">>> upload wsgi script sample"
150 files.upload_template('%(project_name)s/config/%(project_name)s.wsgi.template' % env, '%(path)s/www/wsgi/%(project_name)s.wsgi' % env, context=env)
151 run('chmod ug+x %(path)s/www/wsgi/%(project_name)s.wsgi' % env)
154 def install_requirements():
155 "Install the required packages from the requirements file using pip"
156 print '>>> install requirements'
157 require('release', provided_by=[deploy])
158 run('cd %(path)s; %(path)s/bin/pip install -r %(path)s/releases/%(release)s/%(project_name)s/config/requirements.txt' % env, pty=True)
161 def copy_localsettings():
162 "Copy localsettings.py from root directory to release directory (if this file exists)"
163 print ">>> copy localsettings"
164 require('release', 'path', provided_by=[deploy])
165 require('sandbox', provided_by=[staging, production])
167 with settings(warn_only=True):
168 run('cp %(sandbox)s/etc/%(project_name)s/localsettings.py %(path)s/releases/%(release)s/%(project_name)s' % env)
171 def symlink_current_release():
172 "Symlink our current release"
173 print '>>> symlink current release'
174 require('release', provided_by=[deploy])
175 require('path', provided_by=[staging, production])
177 run('rm releases/previous; mv releases/current releases/previous')
178 run('ln -s %(release)s releases/current' % env)
182 "Update the database"
184 require('project_name', provided_by=[staging, production])
185 with cd('%(path)s/releases/current/%(project_name)s' % env):
186 run('%(target) manage.py syncdb --noinput' % env, pty=True)
189 run('%(target) manage.py migrate' % env, pty=True)
192 def django_compress():
193 "Update static files"
195 require('project_name', provided_by=[staging, production])
196 with cd('%(path)s/releases/current/%(project_name)s' % env):
197 run('%(target) manage.py synccompress --force' % env, pty=True)
200 def restart_webserver():
201 "Restart the web server"
202 print '>>> restart webserver'
203 run('touch %(path)s/www/wsgi/%(project_name)s.wsgi' % env)