forked from fasouto/django-starter-template
-
Notifications
You must be signed in to change notification settings - Fork 0
/
fabfile.py
194 lines (153 loc) · 4.44 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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
"""
Basic fabfile for django projects
"""
import posixpath
from fabric.api import run, local, env, settings, cd, task
from fabric.contrib.files import exists
from fabric.operations import _prefix_commands, _prefix_env_vars, sudo
# Set to true if you can restart your webserver (via wsgi.py),
# false to stop/start your webserver
DJANGO_SERVER_RESTART = False
# EDIT THIS INFORMATION
env.hosts = ['']
env.password = ''
env.code_dir = ''
env.project_dir = ''
env.static_root = ''
env.virtualenv = ''
env.code_repo = ''
env.django_settings_module = ''
# Python version
PYTHON_BIN = "python3.4"
def virtualenv(venv_dir):
"""
Context manager that establishes a virtualenv to use.
"""
return settings(venv=venv_dir)
def run_venv(command, **kwargs):
"""
Runs a command in a virtualenv (which has been specified using
the virtualenv context manager
"""
run("source %s/bin/activate" % env.virtualenv + " && " + command, **kwargs)
def install_dependencies():
ensure_virtualenv()
with virtualenv(env.virtualenv):
with cd(env.code_dir):
run_venv("pip install -r requirements.txt")
def ensure_virtualenv():
if exists(env.virtualenv):
return
with cd(env.code_dir):
run("virtualenv --no-site-packages --python=%s %s" %
(PYTHON_BIN, env.virtualenv))
run("echo %s > %s/lib/%s/site-packages/projectsource.pth" %
(env.project_dir, env.virtualenv, PYTHON_BIN))
def ensure_src_dir():
if not exists(env.code_dir):
run("mkdir -p %s" % env.code_dir)
with cd(env.code_dir):
if not exists(posixpath.join(env.code_dir, '.git')):
run('git clone %s .' % (env.code_repo))
@task
def push_sources():
"""
Push source code to server
"""
ensure_src_dir()
local('git push origin master')
with cd(env.code_dir):
run('git pull origin master')
@task
def run_tests():
""" Runs the Django test suite as is. """
local("./manage.py test")
@task
def version():
""" Show last commit to the deployed repo. """
with cd(env.code_dir):
run('git log -1')
@task
def test():
"""
Prints information about the host.
Use it to check if env configuration is ok.
"""
run("uname -a")
@task
def webserver_stop():
"""
Stop the webserver that is running the Django instance
"""
sudo("service gunicorn stop")
@task
def webserver_start():
"""
Starts the webserver that is running the Django instance
"""
sudo("service gunicorn start")
@task
def webserver_restart():
"""
Restarts the webserver that is running the Django instance
"""
if DJANGO_SERVER_RESTART:
with cd(env.code_dir):
run("touch %s/wsgi.py" % env.project_dir)
else:
with settings(warn_only=True):
webserver_stop()
webserver_start()
def restart():
""" Restart the wsgi process """
with cd(env.code_dir):
run("touch %s/glance/wsgi.py" % env.code_dir)
def collectstatic():
assert env.static_root.strip() != '' and env.static_root.strip() != '/'
with virtualenv(env.virtualenv):
with cd(env.code_dir):
run_venv("./manage.py collectstatic --clear --noinput")
run("chmod -R ugo+r %s" % env.static_root)
@task
def run_migrations(app=None):
"""
Run the migrations to the database
Usage: fab run_migrations:app_name
"""
with virtualenv(env.virtualenv):
with cd(env.code_dir):
if app:
run_venv("./manage.py migrate %s --noinput" % app)
else:
run_venv("./manage.py migrate --noinput")
@task
def sshagent_run(cmd):
"""
Helper function.
Runs a command with SSH agent forwarding enabled.
Note:: Fabric (and paramiko) can't forward your SSH agent.
This helper uses your system's ssh to do so.
"""
# Handle context manager modifications
wrapped_cmd = _prefix_commands(_prefix_env_vars(cmd), 'remote')
try:
host, port = env.host_string.split(':')
return local(
"ssh -p %s -A %s@%s '%s'" % (port, env.user, host, wrapped_cmd)
)
except ValueError:
return local(
"ssh -A %s@%s '%s'" % (env.user, env.host_string, wrapped_cmd)
)
@task
def deploy():
"""
Deploy the project.
"""
with settings(warn_only=True):
webserver_stop()
push_sources()
install_dependencies()
run_migrations()
collectstatic()
webserver_start()