Poprawka ustawień pip, żeby PIL poprawnie się instalował.
[wolnelektury.git] / fabfile.py
1 from __future__ import with_statement # needed for python 2.5
2 from fabric.api import *
3
4 import os
5
6 # Globals
7 env.project_name = 'wolnelektury'
8
9
10 # ===========
11 # = Servers =
12 # ===========
13 def staging():
14     """Use staging server"""
15     env.hosts = ['zuber@stigma.nowoczesnapolska.org.pl:2222']
16     env.path = '/var/lektury'
17     
18 def production():
19     """Use production server"""
20     env.hosts = ['fundacja@wolnelektury:22123']
21     env.path = '/opt/lektury'
22
23
24 # =========
25 # = Tasks =
26 # =========
27 def test():
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)
31
32 def deploy():
33     """
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
37     """
38     require('hosts', provided_by=[staging, production])
39     require('path')
40     
41     import time
42     env.release = time.strftime('%Y-%m-%dT%H%M')
43     
44     upload_tar_from_git()
45     install_requirements()
46     symlink_current_release()
47     migrate()
48     restart_webserver()
49
50 def deploy_version(version):
51     "Specify a specific version to be made live"
52     require('hosts', provided_by=[localhost,webserver])
53     require('path')
54     env.version = version
55     with cd(env.path):
56         run('rm releases/previous; mv releases/current releases/previous;', pty=True)
57         run('ln -s %(version)s releases/current' % env, pty=True)
58     restart_webserver()
59
60 def rollback():
61     """
62     Limited rollback capability. Simple loads the previously current
63     version of the code. Rolling back again will swap between the two.
64     """
65     require('hosts', provided_by=[staging, production])
66     require('path')
67     with cd(env.path):
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)
71     restart_webserver()
72     
73 # def setup():
74 #     """
75 #     Setup a fresh virtualenv as well as a few useful directories, then run
76 #     a full deployment
77 #     """
78 #     require('hosts', provided_by=[staging, production])
79 #     require('path')
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
89 #     with cd(env.path):
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)
94 #     deploy()
95
96
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)
109
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)
117
118 def symlink_current_release():
119     "Symlink our current release"
120     require('release', provided_by=[deploy])
121     require('path', provided_by=[staging, production])
122     with cd(env.path):
123         with settings(
124             hide('warnings', 'running', 'stdout', 'stderr'),
125             warn_only=True
126         ):
127             run('rm releases/previous; mv releases/current releases/previous;')
128         
129         run('ln -s %(release)s releases/current' % env)
130
131 def migrate():
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)
137
138 def restart_webserver():
139     "Restart the web server"
140     run('touch %(path)s/releases/current/%(project_name)s/%(project_name)s.wsgi' % env)
141
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)