forked from pirati-cz/helios-server
-
Notifications
You must be signed in to change notification settings - Fork 0
/
fabfile.py
128 lines (103 loc) · 3.68 KB
/
fabfile.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
"""
Deployment Fabric file
A fabric deployment script for Helios that assumes the following:
- locally, development is /web/helios-server
- remotely, a number of production setups
- remotely, a number of staging setups
- all of these directories are git checkouts that have a proper origin pointer
Other assumptions that should probably change:
- both staging and production run under the same apache instance
Deployment is git and tag based, so:
fab staging_deploy:tag=v3.0.4,hosts="vote.heliosvoting.org"
fab production_deploy:tag=v3.0.5,hosts="vote.heliosvoting.org"
also to get the latest
fab production_deploy:tag=latest,hosts="vote.heliosvoting.org"
IMPORTANT: settings file may need to be tweaked manually
"""
from fabric.api import local, settings, abort, cd, run, sudo
from fabric.contrib.console import confirm
STAGING_SETUP = {
'root' : "/web/staging/helios-server",
'celery' : "/etc/init.d/staging-celeryd",
'dbname' : "helios-staging"
}
PRODUCTION_SETUPS = [
{
'root' : "/web/production/helios-server",
'celery' : "/etc/init.d/celeryd",
'dbname' : "helios"
},
{
'root' : "/web/princeton/helios-server",
'celery' : "/etc/init.d/princeton-celeryd",
'dbname' : "princeton-helios"
}
]
def run_tests():
result = local("python manage.py test", capture=False)
if result.failed:
abort("tests failed, will not deploy.")
def check_tag(tag, path):
result = local('git tag')
if tag not in result.split("\n"):
abort("no local tag %s" % tag)
with cd(path):
run('git pull origin master')
run('git fetch --tags')
result = run('git tag')
if tag not in result.split("\n"):
abort("no remote tag %s" % tag)
def get_latest(path):
with cd(path):
result = run('git pull')
if result.failed:
abort("on remote: could not get latest")
result = run('git submodule init')
if result.failed:
abort("on remote: could not init submodules")
result = run('git submodule update')
if result.failed:
abort("on remote: could not update submodules")
def checkout_tag(tag, path):
with cd(path):
result = run('git checkout %s' % tag)
if result.failed:
abort("on remote: could not check out tag %s" % tag)
result = run('git submodule init')
if result.failed:
abort("on remote: could not init submodules")
result = run('git submodule update')
if result.failed:
abort("on remote: could not update submodules")
def migrate_db(path):
with cd(path):
result = run('python manage.py migrate')
if result.failed:
abort("could not migrate")
def restart_apache():
result = sudo('/etc/init.d/apache2 restart')
if result.failed:
abort("could not restart apache")
def restart_celeryd(path):
result = sudo('%s restart' % path)
if result.failed:
abort("could not restart celeryd - %s " % path)
def deploy(tag, path):
if tag == 'latest':
get_latest(path=path)
else:
check_tag(tag, path=path)
checkout_tag(tag, path=path)
migrate_db(path=path)
restart_apache()
def staging_deploy(tag):
deploy(tag, path=STAGING_SETUP['root'])
restart_celeryd(path = STAGING_SETUP['celery'])
def production_deploy(tag):
production_roots = ",".join([p['root'] for p in PRODUCTION_SETUPS])
if not confirm("Ready to deploy %s to %s?" % (tag, production_roots)):
return
run_tests()
for prod_setup in PRODUCTION_SETUPS:
deploy(tag, path = prod_setup['root'])
restart_celeryd(path = prod_setup['celery'])