1 from __future__ import with_statement # needed for python 2.5
2 from fabric.api import *
7 env.project_name = 'wolnelektury'
14 """Use staging server"""
15 env.hosts = ['zuber@stigma.nowoczesnapolska.org.pl:2222']
16 env.path = '/var/lektury'
19 """Use production server"""
20 env.hosts = ['fundacja@wolnelektury:22123']
21 env.path = '/opt/lektury'
28 "Run the test suite and bail out if it fails"
29 require('project_dir', provided_by=[staging, production])
30 result = local('cd %(path)s; python manage.py test' % env)
34 Deploy the latest version of the site to the servers,
35 install any required third party modules,
36 install the virtual host and then restart the webserver
38 require('hosts', provided_by=[staging, production])
42 env.release = time.strftime('%Y-%m-%dT%H%M')
45 install_requirements()
46 symlink_current_release()
50 def deploy_version(version):
51 "Specify a specific version to be made live"
52 require('hosts', provided_by=[localhost,webserver])
56 run('rm releases/previous; mv releases/current releases/previous;', pty=True)
57 run('ln -s %(version)s releases/current' % env, pty=True)
62 Limited rollback capability. Simple loads the previously current
63 version of the code. Rolling back again will swap between the two.
65 require('hosts', provided_by=[staging, production])
68 run('mv releases/current releases/_previous;', pty=True)
69 run('mv releases/previous releases/current;', pty=True)
70 run('mv releases/_previous releases/previous;', pty=True)
75 # Setup a fresh virtualenv as well as a few useful directories, then run
78 # require('hosts', provided_by=[staging, production])
80 # sudo('aptitude install -y python-setuptools')
81 # sudo('easy_install pip')
82 # sudo('pip install virtualenv')
83 # sudo('aptitude install -y apache2-threaded')
84 # sudo('aptitude install -y libapache2-mod-wsgi') # beware, outdated on hardy!
85 # # we want to get rid of the default apache config
86 # sudo('cd /etc/apache2/sites-available/; a2dissite default;', pty=True)
87 # sudo('mkdir -p %(path)s; chown %(user)s:%(user)s %(path)s;' % env, pty=True)
88 # run('ln -s %(path)s www;' % env, pty=True) # symlink web dir in home
90 # run('virtualenv .;' % env, pty=True)
91 # run('mkdir logs; chmod a+w logs; mkdir releases; mkdir shared; mkdir packages;' % env, pty=True)
92 # if env.use_photologue: run('mkdir photologue');
93 # run('cd releases; ln -s . current; ln -s . previous;', pty=True)
97 # =====================================================================
98 # = Helpers. These are called by other functions rather than directly =
99 # =====================================================================
100 def upload_tar_from_git():
101 "Create an archive from the current Git master branch and upload it"
102 require('release', provided_by=[deploy])
103 local('git archive --format=tar master | gzip > %(release)s.tar.gz' % env)
104 run('mkdir -p %(path)s/releases/%(release)s' % env, pty=True)
105 run('mkdir -p %(path)s/packages' % env, pty=True)
106 put('%(release)s.tar.gz' % env, '%(path)s/packages/' % env)
107 run('cd %(path)s/releases/%(release)s && tar zxf ../../packages/%(release)s.tar.gz' % env, pty=True)
108 local('rm %(release)s.tar.gz' % env)
110 def install_requirements():
111 "Install the required packages from the requirements file using pip"
112 require('release', provided_by=[deploy])
113 pip_options = file('pip-options.txt').read().strip()
114 with cd('%(path)s/releases/%(release)s' % env):
115 run('virtualenv --no-site-packages .')
116 run('pip install -E . %s -r requirements.txt' % pip_options)
118 def symlink_current_release():
119 "Symlink our current release"
120 require('release', provided_by=[deploy])
121 require('path', provided_by=[staging, production])
124 hide('warnings', 'running', 'stdout', 'stderr'),
127 run('rm releases/previous; mv releases/current releases/previous;')
129 run('ln -s %(release)s releases/current' % env)
132 "Update the database"
133 require('project_name', provided_by=[staging, production])
134 with cd('%(path)s/releases/current/%(project_name)s' % env):
135 run('../bin/python manage.py syncdb --noinput' % env, pty=True)
136 run('../bin/python manage.py migrate' % env, pty=True)
138 def restart_webserver():
139 "Restart the web server"
140 run('touch %(path)s/releases/current/%(project_name)s/%(project_name)s.wsgi' % env)
142 # def install_site():
143 # "Add the virtualhost file to apache"
144 # require('release', provided_by=[deploy, setup])
145 # #sudo('cd %(path)s/releases/%(release)s; cp %(project_name)s%(virtualhost_path)s%(project_name)s /etc/apache2/sites-available/' % env)
146 # sudo('cd %(path)s/releases/%(release)s; cp vhost.conf /etc/apache2/sites-available/%(project_name)s' % env)
147 # sudo('cd /etc/apache2/sites-available/; a2ensite %(project_name)s' % env, pty=True)