-
Notifications
You must be signed in to change notification settings - Fork 10
/
Makefile
295 lines (219 loc) · 12.1 KB
/
Makefile
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
.DEFAULT_GOAL := help
.PHONY: help clean piptools requirements ci_requirements dev_requirements \
validation_requirements doc_requirements production-requirements static shell \
test coverage isort_check isort style lint quality pii_check validate \
migrate html_coverage upgrade extract_translation dummy_translations \
compile_translations fake_translations pull_translations \
push_translations start-devstack open-devstack pkg-devstack \
detect_changed_source_translations validate_translations check_keywords
COMMON_CONSTRAINTS_TXT=requirements/common_constraints.txt
.PHONY: $(COMMON_CONSTRAINTS_TXT)
$(COMMON_CONSTRAINTS_TXT):
wget -O "$(@)" https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt || touch "$(@)"
define BROWSER_PYSCRIPT
import os, webbrowser, sys
try:
from urllib import pathname2url
except:
from urllib.request import pathname2url
webbrowser.open("file://" + pathname2url(os.path.abspath(sys.argv[1])))
endef
export BROWSER_PYSCRIPT
BROWSER := python -c "$$BROWSER_PYSCRIPT"
# Generates a help message. Borrowed from https://github.com/pydanny/cookiecutter-djangopackage.
help: ## display this help message
@echo "Please use \`make <target>\` where <target> is one of"
@awk -F ':.*?## ' '/^[a-zA-Z]/ && NF==2 {printf "\033[36m %-25s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) | sort
clean: ## delete generated byte code and coverage reports
find . -name '*.pyc' -delete
coverage erase
rm -rf assets
rm -rf pii_report
piptools: ## install pinned version of pip-compile and pip-sync
pip install -r requirements/pip-tools.txt
requirements: piptools dev_requirements ## sync to default requirements
ci_requirements: validation_requirements ## sync to requirements needed for CI checks
dev_requirements: ## sync to requirements for local development
pip-sync -q requirements/dev.txt
validation_requirements: ## sync to requirements for testing & code quality checking
pip-sync -q requirements/validation.txt
doc_requirements:
pip-sync -q requirements/doc.txt
production-requirements: piptools ## install requirements for production
pip-sync -q requirements/production.txt
static: ## generate static files
python manage.py collectstatic --noinput
shell: ## run Django shell
python manage.py shell
test: clean ## run tests and generate coverage report
pytest --ds=enterprise_access.settings.test
# To be run from CI context
coverage: clean
pytest --cov-report html
$(BROWSER) htmlcov/index.html
isort_check: ## check that isort has been run
isort --check-only enterprise_access/
isort: ## run isort to sort imports in all Python files
isort --atomic enterprise_access/
style: ## run Python style checker
pycodestyle enterprise_access manage.py
lint: ## run Python code linting
pylint --rcfile=pylintrc enterprise_access *.py
quality: style isort_check lint ## check code style and import sorting, then lint
@echo "\e[32mQuality tests passed!\e[0m"
quality_fix: style isort lint ## Check code style, FIX any imports, then lint
@echo "\e[32mQuality tests passed!\e[0m"
pii_check: ## check for PII annotations on all Django models
DJANGO_SETTINGS_MODULE=enterprise_access.settings.test \
code_annotations django_find_annotations --config_file .pii_annotations.yml --lint --report --coverage
check_keywords: ## Scan the Django models in all installed apps in this project for restricted field names
python manage.py check_reserved_keywords --override_file db_keyword_overrides.yml
validate: test quality pii_check check_keywords ## run tests, quality, and PII annotation checks
migrate: ## apply database migrations
python manage.py migrate
html_coverage: ## generate and view HTML coverage report
coverage html && open htmlcov/index.html
subsidy_client_local: # re-install edx-enterprise-subsidy-client from local code
pip uninstall -y edx-enterprise-subsidy-client && pip install -e /edx/src/edx-enterprise-subsidy-client/ && pip freeze | grep subsidy-client
COMMON_CONSTRAINTS_TXT=requirements/common_constraints.txt
.PHONY: $(COMMON_CONSTRAINTS_TXT)
$(COMMON_CONSTRAINTS_TXT):
wget -O "$(@)" https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt || touch "$(@)"
echo "$(COMMON_CONSTRAINTS_TEMP_COMMENT)" | cat - $(@) > temp && mv temp $(@)
upgrade: export CUSTOM_COMPILE_COMMAND=make upgrade
upgrade: piptools $(COMMON_CONSTRAINTS_TXT) ## update the requirements/*.txt files with the latest packages satisfying requirements/*.in
sed 's/django-simple-history==3.0.0//g' requirements/common_constraints.txt > requirements/common_constraints.tmp
mv requirements/common_constraints.tmp requirements/common_constraints.txt
# Make sure to compile files after any other files they include!
sed 's/Django<4.0//g' requirements/common_constraints.txt > tmp_con; cat tmp_con > requirements/common_constraints.txt; rm tmp_con
pip-compile --allow-unsafe --rebuild --upgrade -o requirements/pip.txt requirements/pip.in
pip-compile --upgrade -o requirements/pip-tools.txt requirements/pip-tools.in
pip install -qr requirements/pip.txt
pip install -qr requirements/pip-tools.txt
pip-compile --upgrade -o requirements/base.txt requirements/base.in
pip-compile --upgrade -o requirements/test.txt requirements/test.in
pip-compile --upgrade -o requirements/doc.txt requirements/doc.in
pip-compile --upgrade -o requirements/quality.txt requirements/quality.in
pip-compile --upgrade -o requirements/validation.txt requirements/validation.in
pip-compile --upgrade -o requirements/dev.txt requirements/dev.in
pip-compile --upgrade -o requirements/production.txt requirements/production.in
# Let tox control the Django version for tests
grep -e "^django==" requirements/base.txt > requirements/django.txt
sed '/^[dD]jango==/d' requirements/test.txt > requirements/test.tmp
mv requirements/test.tmp requirements/test.txt
extract_translations: ## extract strings to be translated, outputting .mo files
python manage.py makemessages -l en -v1 -d django
python manage.py makemessages -l en -v1 -d djangojs
dummy_translations: ## generate dummy translation (.po) files
cd enterprise_access && i18n_tool dummy
compile_translations: # compile translation files, outputting .po files for each supported language
python manage.py compilemessages
fake_translations: ## generate and compile dummy translation files
pull_translations: ## pull translations from Transifex
tx pull -t -a -f --mode reviewed
push_translations: ## push source translation files (.po) from Transifex
tx push -s
start-devstack: ## run a local development copy of the server
docker-compose --x-networking up
open-devstack: ## open a shell on the server started by start-devstack
docker exec -it enterprise-access /edx/app/enterprise-access/devstack.sh open
pkg-devstack: ## build the enterprise-access image from the latest configuration and code
docker build -t enterprise-access:latest -f docker/build/enterprise-access/Dockerfile git://github.com/edx/configuration
detect_changed_source_translations: ## check if translation files are up-to-date
cd enterprise_access && i18n_tool changed
validate_translations: fake_translations detect_changed_source_translations ## install fake translations and check if translation files are up-to-date
docker_build_no_cache:
docker-compose build --no-cache
docker_build:
docker build . -f Dockerfile --target app -t openedx/enterprise-access
docker build . -f Dockerfile --target app -t openedx/enterprise-access.worker
docker build . -f Dockerfile --target newrelic -t openedx/enterprise-access:latest-newrelic
docker build . -f Dockerfile --target devstack -t openedx/enterprise-access:latest-devstack
docker build . -f Dockerfile --target devstack -t openedx/enterprise-access.worker:latest-devstack
travis_docker_tag: docker_build
docker tag openedx/enterprise-access openedx/enterprise-access:$$TRAVIS_COMMIT
docker tag openedx/enterprise-access:latest-newrelic openedx/enterprise-access:$$TRAVIS_COMMIT-newrelic
travis_docker_auth:
echo "$$DOCKER_PASSWORD" | docker login -u "$$DOCKER_USERNAME" --password-stdin
travis_docker_push: travis_docker_tag travis_docker_auth ## push to docker hub
docker push 'openedx/enterprise-access:latest'
docker push "openedx/enterprise-access:$$TRAVIS_COMMIT"
docker push 'openedx/enterprise-access:latest-newrelic'
docker push "openedx/enterprise-access:$$TRAVIS_COMMIT-newrelic"
dev.provision:
bash ./provision-enterprise-access.sh
# devstack-themed shortcuts
# Starts all containers
dev.up: dev.up.redis
docker-compose up -d
dev.up.build: docker_build dev.up.redis
docker-compose up -d
dev.up.build-no-cache: docker_build_no_cache dev.up.redis
docker-compose up -d
dev.up.with-events: dev.up.kafka-control-center dev.up
# Start redis via the devstack docker-compose.yml
dev.up.redis:
docker-compose -f $(DEVSTACK_WORKSPACE)/devstack/docker-compose.yml up -d redis
# Start kafka via the devstack docker-compose.yml
# https://github.com/openedx-unsupported/devstack/blob/323b475b885a2704489566b262e2895a4dca62b6/docker-compose.yml#L140
dev.up.kafka-control-center:
docker-compose -f $(DEVSTACK_WORKSPACE)/devstack/docker-compose.yml up -d kafka-control-center
# Useful for just restarting everything related to the event broker
dev.down.kafka-control-center:
docker-compose -f $(DEVSTACK_WORKSPACE)/devstack/docker-compose.yml down kafka zookeeper schema-registry kafka-control-center
# Kills containers and all of their data that isn't in volumes
dev.down:
docker-compose down
# Stops containers so they can be restarted
dev.stop:
docker-compose stop
dev.backup:
docker-compose stop app worker
docker-compose up -d mysql80
sleep 10 # let mysql process get fully warmed up
docker compose exec mysql80 mysqldump --all-databases > .dev/enterprise_access_all.sql
dev.restore:
docker-compose stop app worker
docker-compose up -d mysql80
sleep 10 # let mysql process get fully warmed up
docker compose exec -T mysql80 mysql < .dev/enterprise_access_all.sql
app-shell: # Run the app shell as root
docker exec -u 0 -it enterprise_access.app bash
db-shell-57: # Run the mysql 5.7 shell as root, enter the app's database
docker exec -u 0 -it enterprise_access.db mysql -u root enterprise_access
db-shell-8: # Run the mysql 8 shell as root, enter the app's database
docker exec -u 0 -it enterprise_access.mysql80 mysql -u root enterprise_access
dev.dbcopy8: ## Copy data from old mysql 5.7 container into a new 8 db
mkdir -p .dev/
docker-compose exec db bash -c "mysqldump --databases enterprise_access" > .dev/enterprise_access.sql
docker-compose exec -T mysql80 bash -c "mysql" < .dev/enterprise_access.sql
rm .dev/enterprise_access.sql
%-logs: # View the logs of the specified service container
docker-compose logs -f --tail=500 $*
%-restart: # Restart the specified service container
docker-compose restart $*
app-restart-devserver: # restart just the app Django dev server
docker-compose exec app bash -c 'kill $$(ps aux | egrep "manage.py ?\w* runserver" | egrep -v "while|grep" | awk "{print \$$2}")'
%-attach:
docker attach enterprise_access.$*
%-shell: # Run a shell, as root, on the specified service container
docker exec -u 0 -it enterprise_access.$* bash
dev.static:
docker-compose exec -u 0 app python3 manage.py collectstatic --noinput
dev.migrate:
docker-compose exec -u 0 app python manage.py migrate
github_docker_build:
docker build . -f Dockerfile --target app -t openedx/enterprise-access
docker build . -f Dockerfile --target newrelic -t openedx/enterprise-access:latest-newrelic
github_docker_tag: github_docker_build
docker tag openedx/enterprise-access openedx/enterprise-access:${GITHUB_SHA}
docker tag openedx/enterprise-access:latest-newrelic openedx/enterprise-access:${GITHUB_SHA}-newrelic
github_docker_auth:
echo "$$DOCKERHUB_PASSWORD" | docker login -u "$$DOCKERHUB_USERNAME" --password-stdin
github_docker_push: github_docker_tag github_docker_auth ## push to docker hub
docker push 'openedx/enterprise-access:latest'
docker push "openedx/enterprise-access:${GITHUB_SHA}"
docker push 'openedx/enterprise-access:latest-newrelic'
docker push "openedx/enterprise-access:${GITHUB_SHA}-newrelic"
selfcheck: ## check that the Makefile is well-formed
@echo "The Makefile is well-formed."