forked from SchoolOfFreelancing/wire-server
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
208 lines (173 loc) · 7.17 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
SHELL := /usr/bin/env bash
LANG := en_US.UTF-8
DOCKER_USER ?= quay.io/wire
DOCKER_TAG ?= local
default: fast
init:
mkdir -p dist
# Build all Haskell services and executables, run unit tests
.PHONY: install
install: init
stack install --pedantic --test --bench --no-run-benchmarks --local-bin-path=dist
# Build all Haskell services and executables with -O0, run unit tests
.PHONY: fast
fast: init
stack install --pedantic --test --bench --no-run-benchmarks --local-bin-path=dist --fast $(WIRE_STACK_OPTIONS)
# Build everything (Haskell services and nginz)
.PHONY: services
services: init install
$(MAKE) -C services/nginz
# Build haddocks
.PHONY: haddock
haddock:
WIRE_STACK_OPTIONS="--haddock --haddock-internal" make fast
# Build haddocks only for wire-server
.PHONY: haddock-shallow
haddock-shallow:
WIRE_STACK_OPTIONS="--haddock --haddock-internal --no-haddock-deps" make fast
# formats all Haskell files (which don't contain CPP)
.PHONY: format
format:
./tools/ormolu.sh
# formats all Haskell files even if local changes are not committed to git
.PHONY: formatf
formatf:
./tools/ormolu.sh -f
# checks that all Haskell files are formatted; fail if a `make format` run is needed.
.PHONY: formatc
formatc:
./tools/ormolu.sh -c
# For any Haskell or Rust file, update or add a license header if necessary.
# Headers should be added according to Ormolu's formatting rules, but please check just in case.
.PHONY: add-license
add-license:
# Check headroom is installed. If not, please run 'stack install headroom'
command -v headroom
headroom run
@echo ""
@echo "you might want to run 'make formatf' now to make sure ormolu is happy"
# Clean
.PHONY: clean
clean:
stack clean
$(MAKE) -C services/nginz clean
-rm -rf dist
-rm -f .metadata
#################################
## running integration tests
# Build services with --fast and run tests
.PHONY: integration
integration: fast i
# Run tests without building services
.PHONY: i
i:
$(MAKE) -C services/cargohold i
$(MAKE) -C services/galley i
$(MAKE) -C services/brig i
$(MAKE) -C services/gundeck i
$(MAKE) -C services/spar i
# Build services and run tests using AWS
.PHONY: integration-aws
integration-aws: fast i-aws
# Run tests using AWS
.PHONY: i-aws
i-aws:
$(MAKE) -C services/cargohold i-aws
$(MAKE) -C services/galley i-aws
$(MAKE) -C services/brig i-aws
$(MAKE) -C services/gundeck i-aws
$(MAKE) -C services/spar i-aws
# Build services and run tests of one service using AWS
.PHONY: integration-aws-%
integration-aws-%: fast
$(MAKE) "i-aws-$*"
# Run tests of one service using AWS
.PHONY: i-aws-%
i-aws-%:
$(MAKE) -C "services/$*" i-aws
# Build services and run tests of one service
.PHONY: integration-%
integration-%: fast
$(MAKE) "i-$*"
# Run tests of one service
.PHONY: i-%
i-%:
$(MAKE) -C "services/$*" i
#################################
## docker targets
.PHONY: docker-prebuilder
docker-prebuilder:
# `docker-prebuilder` needs to be built or pulled only once (unless native dependencies change)
$(MAKE) -C build/alpine prebuilder
.PHONY: docker-deps
docker-deps:
# `docker-deps` needs to be built or pulled only once (unless native dependencies change)
$(MAKE) -C build/alpine deps
.PHONY: docker-builder
docker-builder:
# `docker-builder` needs to be built or pulled only once (unless native dependencies change)
$(MAKE) -C build/alpine builder
.PHONY: docker-intermediate
docker-intermediate:
# `docker-intermediate` needs to be built whenever code changes - this essentially runs `stack clean && stack install` on the whole repo
docker build -t $(DOCKER_USER)/alpine-intermediate:$(DOCKER_TAG) -f build/alpine/Dockerfile.intermediate --build-arg builder=$(DOCKER_USER)/alpine-builder:develop --build-arg deps=$(DOCKER_USER)/alpine-deps:develop .;
docker tag $(DOCKER_USER)/alpine-intermediate:$(DOCKER_TAG) $(DOCKER_USER)/alpine-intermediate:latest;
if test -n "$$DOCKER_PUSH"; then docker login -u $(DOCKER_USERNAME) -p $(DOCKER_PASSWORD); docker push $(DOCKER_USER)/alpine-intermediate:$(DOCKER_TAG); docker push $(DOCKER_USER)/alpine-intermediate:latest; fi;
.PHONY: docker-exe-%
docker-exe-%:
docker image ls | grep $(DOCKER_USER)/alpine-deps > /dev/null || (echo "'make docker-deps' required.", exit 1)
docker image ls | grep $(DOCKER_USER)/alpine-intermediate > /dev/null || (echo "'make docker-intermediate' required."; exit 1)
docker build -t $(DOCKER_USER)/"$*":$(DOCKER_TAG) -f build/alpine/Dockerfile.executable --build-arg executable="$*" --build-arg intermediate=$(DOCKER_USER)/alpine-intermediate --build-arg deps=$(DOCKER_USER)/alpine-deps .
docker tag $(DOCKER_USER)/"$*":$(DOCKER_TAG) $(DOCKER_USER)/"$*":latest
if test -n "$$DOCKER_PUSH"; then docker login -u $(DOCKER_USERNAME) -p $(DOCKER_PASSWORD); docker push $(DOCKER_USER)/"$*":$(DOCKER_TAG); docker push $(DOCKER_USER)/"$*":latest; fi;
.PHONY: docker-services
docker-services:
# make docker-services doesn't compile, only makes small images out of the `docker-intermediate` image
# to recompile, run `docker-intermediate` first.
docker image ls | grep $(DOCKER_USER)/alpine-deps > /dev/null || (echo "'make docker-deps' required.", exit 1)
docker image ls | grep $(DOCKER_USER)/alpine-intermediate > /dev/null || (echo "'make docker-intermediate' required."; exit 1)
# `make -C services/brig docker` == `make docker-exe-brig docker-exe-brig-integration docker-exe-brig-schema docker-exe-brig-index`
$(MAKE) -C services/brig docker
$(MAKE) -C services/gundeck docker
$(MAKE) -C services/galley docker
$(MAKE) -C services/cannon docker
$(MAKE) -C services/proxy docker
$(MAKE) -C services/spar docker
$(MAKE) -C tools/stern docker
$(MAKE) docker-exe-zauth
$(MAKE) -C services/nginz docker
DOCKER_DEV_NETWORK := --net=host
DOCKER_DEV_VOLUMES := -v `pwd`:/wire-server
DOCKER_DEV_IMAGE := quay.io/wire/alpine-builder:$(DOCKER_TAG)
.PHONY: run-docker-builder
run-docker-builder:
@echo "if this does not work, consider 'docker pull', 'docker tag', or 'make -C build-alpine builder'."
docker run --workdir /wire-server -it $(DOCKER_DEV_NETWORK) $(DOCKER_DEV_VOLUMES) --rm $(DOCKER_DEV_IMAGE) /bin/bash
CASSANDRA_CONTAINER := $(shell docker ps | grep '/cassandra:' | perl -ne '/^(\S+)\s/ && print $$1')
.PHONY: git-add-cassandra-schema
git-add-cassandra-schema: db-reset
( echo '-- automatically generated with `make git-add-cassandra-schema`' ; docker exec -i $(CASSANDRA_CONTAINER) /usr/bin/cqlsh -e "DESCRIBE schema;" ) > ./docs/reference/cassandra-schema.cql
git add ./docs/reference/cassandra-schema.cql
.PHONY: cqlsh
cqlsh:
@echo "make sure you have ./deploy/dockerephemeral/run.sh running in another window!"
docker exec -it $(CASSANDRA_CONTAINER) /usr/bin/cqlsh
.PHONY: db-reset
db-reset:
@echo "make sure you have ./deploy/dockerephemeral/run.sh running in another window!"
make -C services/brig db-reset
make -C services/galley db-reset
make -C services/gundeck db-reset
make -C services/spar db-reset
#################################
## dependencies
libzauth:
$(MAKE) -C libs/libzauth install
# Useful when using Haskell IDE Engine
# https://github.com/haskell/haskell-ide-engine
# requires 'yq' executable on your path.
#
# Run this again after changes to libraries or dependencies.
.PHONY: hie.yaml
hie.yaml:
./tools/gen-hie-yaml.sh > hie.yaml