/
Makefile
141 lines (130 loc) · 5.85 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
# NOTE: call scripts from /scripts instead of writing lengthy targets
SHELL=/bin/bash # this forces usage of bash instead of sh (which is default and doesn't have a lot of features)
DOCKER_REGISTRY=REPLACE_ME
BUILD_ID=$(shell date +%Y%m%d%H%M)
NAMESPACE=$(DEVELOPER_NAMESPACE)
CONTAINER=$(DOCKER_REGISTRY)/$(SERVICE):$(NAMESPACE)-$(BUILD_ID)
ROOT_DIR=$(PWD)
# Enable or disable integration/functional testing using argo rollouts
# true -> run integration/functional tests (slower)
# false -> just deploy without tests (faster)
HAS_INTEGRATION_TESTS?=false
HAS_FUNCTIONAL_TESTS?=false
SVC_DIRS=\
services/core/commander \
services/core/eventer \
services/core/notifier \
services/core/queryhandler \
services/core/registry
SVCS=$(SVC_DIRS:services/core/%=%)
PKG_DIRS=\
pkg/azkeyvault \
pkg/chassis \
pkg/logging \
TOOLS_DIRS=\
tools/hammer
# Setting default values for key vault configuration. export env vars to overwrite.
KEYVAULT?=dev-keyvault
RESOURCEGROUP?=cluster-resources
OVERRIDE_VALUES?=developer-namespace
.PHONY: all
all: $(SVCS)
.PHONY: $(SVCS)
$(SVCS):
# build the service image
VERSION=$$(cat services/$@/VERSION); \
docker build -f ./services/$@/Dockerfile -t $(DOCKER_REGISTRY)/$@:$$VERSION-$(NAMESPACE)-$(BUILD_ID) .; \
docker push $(DOCKER_REGISTRY)/$@:$$VERSION-$(NAMESPACE)-$(BUILD_ID)
# only build integration image if enabled
ifeq ("$(HAS_INTEGRATION_TESTS)", "true")
# read the integration tests for service from values.yaml
$(eval TESTS := $(shell yq eval '.rollout.testing.integration.tests' services/$@/values.yaml | sed 's/^- //'))
@for TEST in $(TESTS); do \
VERSION=$$(cat services/$@/VERSION); \
docker build -f ./test/integration/$${TEST}/Dockerfile -t $(DOCKER_REGISTRY)/$@-integration-$${TEST}:$$VERSION-$(NAMESPACE)-$(BUILD_ID) .; \
docker push $(DOCKER_REGISTRY)/$@-integration-$${TEST}:$$VERSION-$(NAMESPACE)-$(BUILD_ID); \
done
endif # end HAS_INTEGRATION_TESTS
# only build functional image(s) if enabled
ifeq ("$(HAS_FUNCTIONAL_TESTS)", "true")
# read the functional tests for service from values.yaml
$(eval TESTS := $(shell yq eval '.rollout.testing.functional.tests' services/$@/values.yaml | sed 's/^- //'))
@for TEST in $(TESTS); do \
VERSION=$$(cat services/$@/VERSION); \
docker build -f ./test/functional/$${TEST}/Dockerfile -t $(DOCKER_REGISTRY)/$@-functional-$${TEST}:$$VERSION-$(NAMESPACE)-$(BUILD_ID) .; \
docker push $(DOCKER_REGISTRY)/$@-functional-$${TEST}:$$VERSION-$(NAMESPACE)-$(BUILD_ID); \
done
endif # end HAS_FUNCTIONAL_TESTS
# generate and apply helm template
VERSION=$$(cat services/core/$@/VERSION) ; \
helm template -n $@ --namespace $(NAMESPACE) \
-f ./services/$@/values.yaml \
-f ./deployments/values/all.yaml \
-f ./deployments/values/developer-namespace.yaml \
--set host.prefix=$(NAMESPACE) \
--set image.tag=$$VERSION-$(NAMESPACE)-$(BUILD_ID) \
--set namespace=$(NAMESPACE) \
--set configMap.namespace=$(NAMESPACE) \
--set configMap.keyVault=$(KEYVAULT) \
--set configMap.resourceGroup=$(RESOURCEGROUP) \
--set configMap.version=$$VERSION-$(NAMESPACE)-$(BUILD_ID) \
--set rollout.testing.integration.isEnabled=$(HAS_INTEGRATION_TESTS) \
--set rollout.testing.functional.isEnabled=$(HAS_FUNCTIONAL_TESTS) \
./deployments/service/ | kubectl apply -f - -n $(NAMESPACE)
# helm template - render the deployment manifest for a specific service
# $ make template SVC="core/eventer" NAMESPACE="dev" OVERRIDE_VALUES="dev"
.PHONY: template
template:
VERSION=$$(cat services/$(SVC)/VERSION) ; \
helm template -n $(SVC) --namespace $(NAMESPACE) \
-f ./services/$(SVC)/values.yaml \
-f ./deployments/values/all.yaml \
-f ./deployments/values/$(OVERRIDE_VALUES).yaml \
--set host.prefix=$(NAMESPACE) \
--set image.tag=$$VERSION-$(NAMESPACE)-$(BUILD_ID) \
--set namespace=$(NAMESPACE) \
--set configMap.namespace=$(NAMESPACE) \
--set configMap.keyVault=$(KEYVAULT) \
--set configMap.resourceGroup=$(RESOURCEGROUP) \
--set configMap.version=$$VERSION \
--set rollout.testing.integration.isEnabled=$(HAS_INTEGRATION_TESTS) \
--set rollout.testing.functional.isEnabled=$(HAS_FUNCTIONAL_TESTS) \
./deployments/service/
# Uses prebuilt images from the registry with the versions defined in the service directory
# To deploy all services: make remote
# To deploy a specific service: make remote SVCS=eventer
.PHONY: remote
remote:
for service in $(SVCS) ; do \
VERSION=$$(cat services/$$service/VERSION) ; \
helm template -n $$service --namespace $(NAMESPACE) \
-f ./services/$$service/values.yaml \
-f ./deployments/values/all.yaml \
-f ./deployments/values/developer-namespace.yaml \
--set host.prefix=$(NAMESPACE) \
--set image.tag=$$VERSION \
--set image.repository=SOME_URL/$$service \
--set namespace=$(NAMESPACE) \
--set configMap.namespace=$(NAMESPACE) \
--set configMap.keyVault=$(KEYVAULT) \
--set configMap.resourceGroup=$(RESOURCEGROUP) \
--set rollout.testing.integration.isEnabled=$(HAS_INTEGRATION_TESTS) \
--set rollout.testing.functional.isEnabled=$(HAS_FUNCTIONAL_TESTS) \
./deployments/service/ | kubectl apply -f - -n $(NAMESPACE) ; \
done
###################
# BUILD NEW STUFF'S
###################
# create a new consumer service (ASYNC)
# $ make consumer SERVICE=GameOfficiating AGGREGATE=Football COMMAND=PauseGame
consumer:
cd tools/hammer && go run main.go consumer --service_name="$(SERVICE)" --aggregate_name="$(AGGREGATE)" --command_name="$(COMMAND)" --output_path="../../services"
########################
# BLUE/GREEN DEVELOPMENT
########################
shawarma:
docker build -f ./third_party/$@/Dockerfile -t $(DOCKER_REGISTRY)/$@:0.0.1-$(NAMESPACE)-$(BUILD_ID) ./third_party/$@; \
docker push $(DOCKER_REGISTRY)/$@:0.0.1-$(NAMESPACE)-$(BUILD_ID)
shawarma-webhook:
docker build -f ./third_party/$@/Dockerfile -t $(DOCKER_REGISTRY)/$@:0.0.1-$(NAMESPACE)-$(BUILD_ID) ./third_party/$@; \
docker push $(DOCKER_REGISTRY)/$@:0.0.1-$(NAMESPACE)-$(BUILD_ID)