-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
executable file
·179 lines (153 loc) · 6.48 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
#gnu makefile
# This Makefile provides macro control of the microservice core of Whale&Jaguar Platform
# ecosystem. It performs tasks like:
#
# * Verify dependencies are present
# * Pre configuration and project bootstrapping
# * Launching project
#
#
# Exit codes:
#
# All failures should exit with a detailed code that can be used for
# troubleshooting. The current exit codes are:
#
# 0: Success!
# 102: Required dependency is not installed.
#
###############################################################################
### Loaded Configuration
### Load configuration from external files. Configuration variables defined in
### later files have precedent and will overwrite those defined in previous
### files. The -include directive ensures that no error is thrown if a file is
### not found, which is the case if config.local.mk does not exist.
###############################################################################
-include config.mk config.local.mk
###############################################################################
### Common Configuration
###############################################################################
HOOK_DIR=bin
###############################################################################
### Tasks
###############################################################################
all: init-dev
###############################################################################
### Init-Dev-Project
### Initializes a project in development mode.
###############################################################################
define init-dev-template
init-dev-$(1): dependencies network-create prebuild-$(1) build-$(1) start-$(1)
endef
$(foreach p,$(SERVICES),$(eval $(call init-dev-template,$(p))))
.PHONY: init-dev
init-dev: $(foreach p,$(SERVICES),init-dev-$(p))
###############################################################################
### Verify prerequisite software is installed.
###############################################################################
is-not-installed=! (command -v $(1) >/dev/null)
define dependency-template
dependency-$(1):
@if ( $(call is-not-installed,$(1)) ); \
then \
echo "Dependency" $(1) " not found in path." \
&& exit 102; \
else \
echo "Dependency" $(1) "found."; \
fi;
endef
$(foreach pkg,$(REQUIRED_SOFTWARE),$(eval $(call dependency-template,$(pkg))))
.PHONY: dependencies
dependencies: $(foreach pkg,$(REQUIRED_SOFTWARE),dependency-$(pkg))
###############################################################################
### Pre Build Hook
### Invokes the pre-build hook in the child project directory if it exists.
### Invoked before the Docker Compose build.
###############################################################################
define prebuild-template
prebuild-$(1):
@if [ -e "./$(HOOK_DIR)/pre-build" ]; then \
echo "Running pre-build hook script for $(1)." \
&& "./$(HOOK_DIR)/pre-build"; \
else \
echo "No pre-build hook script for $(1). Skipping."; \
fi;
endef
$(foreach p,$(SERVICES),$(eval $(call prebuild-template,$(p))))
.PHONY: prebuild
prebuild: $(foreach p,$(SERVICES),prebuild-$(p))
###############################################################################
### Create Docker Networks
### Create all networks defined in the DOCKER_NETWORKS variable.
### Networks provide a way to loosely couple the projects and allow them to
### communicate with each other. We'll use dependencies on external networks
### rather than dependencies on other projects. Networks are lightweight and
### easy to create.
###############################################################################
define network-create-template
network-create-$(1):
@docker network create "$(1)" || true
endef
$(foreach p,$(DOCKER_NETWORKS),$(eval $(call network-create-template,$(p))))
.PHONY: network-create
network-create: $(foreach p,$(DOCKER_NETWORKS),network-create-$(p))
###############################################################################
### Remove Docker Networks
### Remove all networks defined in the DOCKER_NETWORKS variable.
###############################################################################
define network-remove-template
network-remove-$(1):
@docker network rm "$(1)" || true
endef
$(foreach p,$(DOCKER_NETWORKS),$(eval $(call network-remove-template,$(p))))
.PHONY: network-remove
network-remove: $(foreach p,$(DOCKER_NETWORKS),network-remove-$(p))
###############################################################################
### Docker Build
### Performs `docker-compose build --no-cache --pull`
### This is a very conservative build strategy to avoid cache related build
### issues.
###############################################################################
define build-template
build-$(1): prebuild-$(1)
@docker-compose build --no-cache --pull "$(1)"
endef
$(foreach p,$(SERVICES),$(eval $(call build-template,$(p))))
.PHONY: build
build: $(foreach p,$(SERVICES),build-$(p))
###############################################################################
### Start
### Starts services with `docker-compose up -d`
###############################################################################
define start-template
start-$(1):
@docker-compose pull "$(1)"; docker-compose up -d "$(1)"
endef
$(foreach p,$(SERVICES),$(eval $(call start-template,$(p))))
.PHONY: start
start: $(foreach p,$(SERVICES),start-$(p))
###############################################################################
### Stop
### Stops services with `docker-compose stop`
###############################################################################
define stop-template
stop-$(1):
@docker-compose stop "$(1)"
endef
$(foreach p,$(SERVICES),$(eval $(call stop-template,$(p))))
.PHONY: stop
stop: $(foreach p,$(SERVICES),stop-$(p))
###############################################################################
### Clean
### Clean services with `docker-compose rm`
### Removes all containers, volumes and local networks.
###############################################################################
.PHONY: clean
clean:
@docker-compose down -v --rmi local --remove-orphans
###############################################################################
### Dynamically list all targets.
### See: https://stackoverflow.com/a/26339924
###############################################################################
.PHONY: list
list:
@$(MAKE) -pRrq -f $(MAKEFILE_LIST) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$' | xargs -n 1