~canonical-ca-hackers/isitdeployable/trunk

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
# Copyright (C) 2012  Canonical Ltd.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

include buildout.mk


MANAGE=$(PY) django_project/manage.py
TEST_COMMAND=$(MANAGE) test revtracker


YUIRELEASES := http://yui.zenfs.com/releases/yui3/
YUI := yui_3.15.0.zip
JS_BUILD_PATH = build/revtracker/js/
JS_META_SCRIPT = $(PY) scripts/js/generate_meta.py
REVTRACKER_JS = revtracker/static/
DEV_JS_FILES := $(wildcard $(REVTRACKER_JS)/*.js)
BUILD_JS_FILES := $(patsubst $(REVTRACKER_JS)/%.js,$(JS_BUILD_PATH)/i/%.js,$(DEV_JS_FILES))
GUNICORN := bin/gunicorn

TMP_DIR = tmp
DB_DIR = $(TMP_DIR)/db
export PGHOST=$(DB_DIR)
export PGDATA=$(DB_DIR)/data
PG_BIN_DIR = /usr/lib/postgresql/9.1/bin
SUPERVISOR_CONFIG = $(PWD)/dev_config/supervisor.conf
SUPERVISORD = bin/supervisord
SUPERVISORCTL = bin/supervisorctl -c $(SUPERVISOR_CONFIG)
SUPERVISORD_SOCK = tmp/supervisord.sock

js: js_dirs jsmin $(JS_BUILD_PATH)/i/meta.js

js_dirs: $(JS_BUILD_PATH)/i $(JS_BUILD_PATH)/y

$(JS_BUILD_PATH)/i:
	mkdir -p $(JS_BUILD_PATH)/i

$(JS_BUILD_PATH)/y: build/yui
	mkdir -p $(JS_BUILD_PATH)/y
	cp -r build/yui/build/* $(JS_BUILD_PATH)/y

build/yui:
	mkdir -p build/yui
	wget $(YUIRELEASES)$(YUI) -O /tmp/$(YUI)
	unzip /tmp/$(YUI) -d build

jsmin: $(BUILD_JS_FILES)
	rm $(JS_BUILD_PATH)/i/meta.js || true
	$(PY) scripts/js/jsmin_all.py $(JS_BUILD_PATH)/i

$(BUILD_JS_FILES): $(DEV_JS_FILES)
	cp $(REVTRACKER_JS)/$(@F) $@

$(JS_BUILD_PATH)/i/meta.js: $(BUILD_JS_FILES)
	$(JS_META_SCRIPT) -n YUI_MODULES -s $(JS_BUILD_PATH)/i/ \
		-o $(JS_BUILD_PATH)/i/meta.js \
		-x -min.js$

clean_js:
	rm -rf $(JS_BUILD_PATH)/* || true
	rm -rf jsdoc || true


run: run_db run_combo run_app run_celeryd run_gorun

start: run

run_combo: $(SUPERVISORD_SOCK)
	$(SUPERVISORCTL) start combo

run_app: $(SUPERVISORD_SOCK)
	$(SUPERVISORCTL) start appserver

run_celeryd: $(SUPERVISORD_SOCK)
	$(SUPERVISORCTL) start celeryd

run_gorun: $(SUPERVISORD_SOCK)
	$(SUPERVISORCTL) start gorun

run_db:
	scripts/start-database.sh
	$(MANAGE) syncdb --noinput
	$(MANAGE) migrate --noinput

$(SUPERVISORD_SOCK):
	$(SUPERVISORD) -c $(SUPERVISOR_CONFIG)

stop: stop_combo stop_app stop_db stop_celeryd stop_gorun stop_supervisord

stop_combo: $(SUPERVISORD_SOCK)
	$(SUPERVISORCTL) stop combo

stop_app: $(SUPERVISORD_SOCK)
	$(SUPERVISORCTL) stop appserver

stop_celeryd: $(SUPERVISORD_SOCK)
	$(SUPERVISORCTL) stop celeryd

stop_gorun: $(SUPERVISORD_SOCK)
	$(SUPERVISORCTL) stop gorun

stop_db:
	$(PG_BIN_DIR)/pg_ctl status > /dev/null && $(PG_BIN_DIR)/pg_ctl stop -t 60 -w -m fast

stop_supervisord:
	$(SUPERVISORCTL) shutdown

restart_app: stop_app run_app

reload_supervisord:
	$(SUPERVISORCTL) reread

.PHONY: js js_dirs jsmin clean_js run_combo run run_combo run_app run_db run_gorun stop stop_combo stop_app stop_db stop_gorun run_supervisord stop_supervisord reload_supervisord

prod: $(PY) js $(JS_BUILD_PATH)/combo $(JS_BUILD_PATH)/revno js_revno_link

$(JS_BUILD_PATH)/combo:
	# Because we have to strip out the prefix that
	# convoy sees because it's not at the root
	ln -sf . $(JS_BUILD_PATH)/combo

$(JS_BUILD_PATH)/revno:
	bzr log $(REVTRACKER_JS) --limit 1 | head -n2 | tail -n1 | sed 's/[^0-9]*//' > $(JS_BUILD_PATH)/revno

js_revno_link: $(JS_BUILD_PATH)/revno
	ln -sf . $(JS_BUILD_PATH)/rev-$$(cat $(JS_BUILD_PATH)/revno)


REVNO = $(shell bzr revno)
DIRNAME = isitdeployable-$(REVNO)
TARBALL = $(DIRNAME).tar.bz2
BASEDIR = /srv/isitdeployable.net/production/
CODE_DIR = $(BASEDIR)/$(DIRNAME)
HOST ?= isitdeployable.net

push: prod
	tar --exclude 'download-cache/*' --exclude 'build/yui/*' -cjf $(TARBALL) * .bzr .bzrignore
	scp $(TARBALL) $(HOST):
	ssh $(HOST) 'sudo mkdir -p $(CODE_DIR) && sudo chown ubuntu $(CODE_DIR) && \
		         sudo apt-get install -y puppet && \
		         tar xf /home/ubuntu/$(TARBALL) -C $(CODE_DIR) && \
				 (rm $(CODE_DIR)/download-cache && mkdir -p $(CODE_DIR)/download-cache/dist) && \
				 (cd $(CODE_DIR) && ./bin/buildout)'

remote_prod_deploy:
	ssh $(HOST) 'sudo /etc/init.d/deploy-tracker-celeryd stop && \
				 $(CODE_DIR)/dev_config/apply && \
				 sudo chown deploytracker:deploytracker -R $(CODE_DIR) && \
				 sudo -u deploytracker $(CODE_DIR)/bin/deploy collectstatic --noinput && \
				 sudo -u deploytracker $(CODE_DIR)/bin/deploy syncdb --noinput && \
				 sudo -u deploytracker $(CODE_DIR)/bin/deploy migrate --noinput && \
				 sudo /etc/init.d/deploy-tracker-celeryd start && \
				 (sudo stop deploy-tracker-combo || true) && \
				 sudo start deploy-tracker-combo && \
				 (sudo stop squid3 || true) && \
				 sudo start squid3 && \
				 sudo /etc/init.d/apache2 reload && \
				 sudo ln -snf $(CODE_DIR) $(BASEDIR)/isitdeployable-current'
	for i in seq 4; do wget -O/dev/null -q http://$(HOST); done

deploy: push remote_prod_deploy

.PHONY: prod push remote_prod_deploy deploy js_revno_link