-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
206 lines (177 loc) · 6.34 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
.PHONY: setup lock own build post-build push start qa style safety test qc stop clean logs
################################################################################
# Variables #
################################################################################
IMAGE ?= gcr.io/dd-decaf-cfbf6/warehouse
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 docker run --rm dddecaf/tag-spy:latest tag-spy dddecaf/postgres-base alpine))
$(file >LATEST_BASE_TAG, $(LATEST_BASE_TAG))
$(eval COMPILER_TAG := $(subst alpine,alpine-compiler,$(LATEST_BASE_TAG)))
$(info ************************************************************)
$(info * Compiling service dependencies on the basis of:)
$(info * dddecaf/postgres-base:$(COMPILER_TAG))
$(info ************************************************************)
docker pull dddecaf/postgres-base:$(COMPILER_TAG)
docker run --rm --mount \
"source=$(CURDIR)/requirements,target=/opt/requirements,type=bind" \
dddecaf/postgres-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 * dddecaf/postgres-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 dddecaf/postgres-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 testing database.
databases:
docker-compose up -d postgres
./scripts/wait_for_postgres.sh
docker-compose exec postgres psql -U postgres -c "create database testing;"
docker-compose run --rm web flask db upgrade
docker-compose stop
## Only run 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
## 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=warehouse --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 warehouse.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
################################################################################
# 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')