-
Notifications
You must be signed in to change notification settings - Fork 1
/
Makefile
220 lines (190 loc) · 6.97 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
.PHONY: setup lock own build post-build push start qa style safety test qc stop clean logs
################################################################################
# Variables #
################################################################################
IMAGE ?= gcr.io/dd-decaf-cfbf6/metabolic-ninja
BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD)
BUILD_COMMIT ?= $(shell git rev-parse HEAD)
SHORT_COMMIT ?= $(shell git rev-parse --short HEAD)
BUILD_DATE ?= $(shell date -u +%Y-%m-%d)
BUILD_TAG ?= ${BRANCH}_${BUILD_DATE}_${SHORT_COMMIT}
################################################################################
# Commands #
################################################################################
## Create the docker bridge network if necessary.
network:
docker network inspect DD-DeCaF >/dev/null 2>&1 || \
docker network create DD-DeCaF
## Run all initialization targets.
setup: network
## Generate the compiled requirements files.
lock:
docker pull dddecaf/tag-spy:latest
$(eval LATEST_BASE_TAG := $(shell gcloud auth print-access-token | \
docker run -i --rm dddecaf/tag-spy:latest tag-spy \
dd-decaf-cfbf6/modeling-base \
cameo \
--authentication https://gcr.io/v2/token \
--registry https://gcr.io \
--service gcr.io \
--username oauth2accesstoken \
--password-stdin))
$(file >LATEST_BASE_TAG, $(LATEST_BASE_TAG))
$(eval COMPILER_TAG := $(subst cameo,cameo-compiler,$(LATEST_BASE_TAG)))
$(info ************************************************************)
$(info * Compiling service dependencies on the basis of:)
$(info * gcr.io/dd-decaf-cfbf6/modeling-base:$(COMPILER_TAG))
$(info ************************************************************)
docker pull gcr.io/dd-decaf-cfbf6/modeling-base:$(COMPILER_TAG)
docker run --rm --mount \
"source=$(CURDIR)/requirements,target=/opt/requirements,type=bind" \
gcr.io/dd-decaf-cfbf6/modeling-base:$(COMPILER_TAG) \
pip-compile --allow-unsafe --verbose --generate-hashes --upgrade \
/opt/requirements/requirements.in
## Change file ownership from root to local user.
own:
sudo chown "$(shell id --user --name):$(shell id --group --name)" .
## Build the Docker image for deployment.
build-travis:
$(eval LATEST_BASE_TAG := $(shell cat LATEST_BASE_TAG))
$(info ************************************************************)
$(info * Building the service on the basis of:)
$(info * gcr.io/dd-decaf-cfbf6/modeling-base:$(LATEST_BASE_TAG))
$(info * Today is $(shell date -u +%Y-%m-%d).)
$(info * Please re-run `make lock` if you want to check for and)
$(info * depend on a later version.)
$(info ************************************************************)
docker pull gcr.io/dd-decaf-cfbf6/modeling-base:$(LATEST_BASE_TAG)
docker build \
--build-arg BASE_TAG=$(LATEST_BASE_TAG) \
--build-arg BUILD_COMMIT=$(BUILD_COMMIT) \
--tag $(IMAGE):$(BRANCH) \
--tag $(IMAGE):$(BUILD_TAG) \
.
## Build the local docker-compose image.
build:
$(eval LATEST_BASE_TAG := $(shell cat LATEST_BASE_TAG))
BASE_TAG=$(LATEST_BASE_TAG) docker-compose build
## Create the necessary databases.
databases:
docker-compose up -d postgres
./scripts/wait_for_postgres.sh
docker-compose exec postgres psql -U postgres -c "create database metabolic_ninja;"
docker-compose exec postgres psql -U postgres -c "create database metabolic_ninja_testing;"
docker-compose run --rm web flask db upgrade
docker-compose stop
## Run post-build initialization. Only needed once!
post-build: databases
## Push local Docker images to their registries.
push:
docker push $(IMAGE):$(BRANCH)
docker push $(IMAGE):$(BUILD_TAG)
## Start all services in the background.
start:
# docker-compose up --force-recreate -d worker
docker-compose up --force-recreate -d
## Apply all quality assurance (QA) tools.
qa:
docker-compose exec -e ENVIRONMENT=testing web \
isort --recursive src tests
docker-compose exec -e ENVIRONMENT=testing web \
black src tests
isort:
docker-compose exec -e ENVIRONMENT=testing web \
isort --check-only --diff --recursive src tests
black:
docker-compose exec -e ENVIRONMENT=testing web \
black --check --diff src tests
flake8:
docker-compose exec -e ENVIRONMENT=testing web \
flake8 src tests
license:
docker-compose exec -e ENVIRONMENT=testing web \
./scripts/verify_license_headers.sh src tests
## Run all style checks.
style: isort black flake8 license
## Check installed dependencies for vulnerabilities.
safety:
docker-compose exec -e ENVIRONMENT=testing web \
safety check --full-report
## Run the test suite.
test:
docker-compose exec -e ENVIRONMENT=testing web \
pytest --cov=metabolic_ninja --cov-report=term
## Run all quality control (QC) tools.
qc: style safety test
## Check the gunicorn configuration.
gunicorn:
docker-compose run --rm web gunicorn --check-config -c gunicorn.py metabolic_ninja.wsgi:app
## Stop all services.
stop:
docker-compose stop
## Stop all services and remove containers.
clean:
docker-compose down
## Follow the logs.
logs:
docker-compose logs --tail="all" -f
## Create a JSON dump of available products from metabolites in the universal model.
dump-products:
docker-compose run --rm web python src/scripts/dump_products.py
################################################################################
# Self Documenting Commands #
################################################################################
.DEFAULT_GOAL := show-help
# Inspired by
# <http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html>
# sed script explained:
# /^##/:
# * save line in hold space
# * purge line
# * Loop:
# * append newline + line to hold space
# * go to next line
# * if line starts with doc comment, strip comment character off and loop
# * remove target prerequisites
# * append hold space (+ newline) to line
# * replace newline plus comments by `---`
# * print line
# Separate expressions are necessary because labels cannot be delimited by
# semicolon; see <http://stackoverflow.com/a/11799865/1968>
.PHONY: show-help
show-help:
@echo "$$(tput bold)Available rules:$$(tput sgr0)"
@echo
@sed -n -e "/^## / { \
h; \
s/.*//; \
:doc" \
-e "H; \
n; \
s/^## //; \
t doc" \
-e "s/:.*//; \
G; \
s/\\n## /---/; \
s/\\n/ /g; \
p; \
}" ${MAKEFILE_LIST} \
| LC_ALL='C' sort --ignore-case \
| awk -F '---' \
-v ncol=$$(tput cols) \
-v indent=19 \
-v col_on="$$(tput setaf 6)" \
-v col_off="$$(tput sgr0)" \
'{ \
printf "%s%*s%s ", col_on, -indent, $$1, col_off; \
n = split($$2, words, " "); \
line_length = ncol - indent; \
for (i = 1; i <= n; i++) { \
line_length -= length(words[i]) + 1; \
if (line_length <= 0) { \
line_length = ncol - indent - length(words[i]) - 1; \
printf "\n%*s ", -indent, " "; \
} \
printf "%s ", words[i]; \
} \
printf "\n"; \
}' \
| more $(shell test $(shell uname) = Darwin \
&& echo '--no-init --raw-control-chars')