-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
161 lines (130 loc) · 5.92 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
# Project variables
PROJECT_NAME ?= todobackend
ORG_NAME ?= farhansajid2
REPO_NAME ?= todobackend
DOCKER_REGISTRY ?= docker.io
# ?= is used for environment variables and defaults to other name if not defined
# Filenames
DEV_COMPOSE_FILE := docker/dev/docker-compose-v2.yml
REL_COMPOSE_FILE := docker/release/docker-compose-v2.yml
# Docker compose Project Names
REL_PROJECT := $(PROJECT_NAME)$(BUILD_ID) # build id is being used for by jenkins
DEV_PROJECT := $(strip $(REL_PROJECT))dev
APP_SERVICE_NAME := app
# Build tag expression - can be used to evaulate a shell expression at runtime
BUILD_TAG_EXPRESSION ?= date -u +%Y%m%d%H%M%S
# Execute shell expression
BUILD_EXPRESSION := $(shell $(BUILD_TAG_EXPRESSION))
# Build tag - defaults to BUILD_EXPRESSION if not defined
BUILD_TAG ?= $(BUILD_EXPRESSION)
DOCKER_REGISTRY_AUTH ?=
.PHONY: test build release clean tag buildtag publish login logout
# Error check variables
INSPECT := $$(docker-compose -p $$1 $$2 ps -q $$3 | xargs -I args docker inspect -f "{ .State.ExitCode }" args)
CHECK := @bash -c '\
if [[ $(INSPECT) ne 0 ]]; \
then exit $(INSPECT); fi' VALUE
# for the docker-compose file's we will have to use the -f flag to show the exact path to that file
test:
${INFO} "Pulling latest images..."
@ docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) pull
${INFO} "Building images..."
@ docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) build --pull test
${INFO} "Building cache volume..."
@ docker volume create --name cache # create a volume named cache
${INFO} "Ensuring database is ready..."
@ docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) run --rm agent
${INFO} "Running the tests..."
@ docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) up test
${INFO} "Copying reports!"
@ docker cp $$(docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) ps -q test):/reports/. reports
${INFO} "Checking to see the return code!"
# ${CHECK} $(DEV_PROJECT) $(DEV_COMPOSE_FILE) test
${INFO} "Testing Completed!"
build:
${INFO} "Building builder image..."
@ docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) build builder
${INFO} "Building Artifiacts..."
@ docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) up builder # remember we only used the builder
${INFO} "Copying artifacts to target folder..."
@ docker cp $$(docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) ps -q builder):/wheelhouse/. target
${INFO} "Building Artifiacts Completed!"
release:
${INFO} "Beginning Acceptance Tests!.."
@ docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) pull test # just pull todobackend-specs image
${INFO} "Beginning Acceptance Tests!.."
${INFO} "Building cache volume..."
@ docker volume create --name webroot # create a volume named cache
${INFO} "Building images..."
@ docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) build app
@ docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) build --pull nginx
${INFO} "Ensuring the database is ready..."
@ docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) up agent
${INFO} "Setting up environment"
@ docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) run --rm app manage.py migrate --noinput
@ docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) run --rm app manage.py collectstatic --noinput
${INFO} "Running tests..."
@ docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) up test
${INFO} "Success"
clean:
${INFO} "Destroying development environment"
@docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) down -v
docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) down -v
docker images -q -f dangling=true -f label=application=todobackend=$(REPO_NAME) | xargs -I args docker rmi -f args
${INFO} "Complete"
tag:
${INFO} "Tagging release image with tags $(TAG_ARGS)..."
@ $(foreach tag,$(TAG_ARGS), docker tag $(IMAGE_ID) $(DOCKER_REGISTRY)/$(ORG_NAME)/$(REPO_NAME):$(tag);)
${INFO} "Tagging complete"
buildtag:
${INFO} "Tagging release image with suffix $(BUILD_TAG) and build tags $(BUILDTAG_ARGS)..."
@ $(foreach tag,$(BUILDTAG_ARGS), docker tag $(IMAGE_ID) $(DOCKER_REGISTRY)/$(ORG_NAME)/$(REPO_NAME):$(tag).$(BUILD_TAG);)
${INFO} "Tagging complete"
login:
${INFO} "Logging in to Docker registry $$DOCKER_REGISTRY..."
@ docker login -u $$DOCKER_USER -p $$DOCKER_PASSWORD $(DOCKER_REGISTRY_AUTH)
${INFO} "Logged in to Docker registry $$DOCKER_REGISTRY"
logout:
${INFO} "Logging out of Docker registry $$DOCKER_REGISTRY..."
@ docker logout
${INFO} "Logged out of Docker registry $$DOCKER_REGISTRY"
publish:
${INFO} "Publishing release image $(IMAGE_ID) to $(DOCKER_REGISTRY)/$(ORG_NAME)/$(REPO_NAME)..."
@ $(foreach tag,$(shell echo $(REPO_EXPR)), docker push $(tag);)
${INFO} "Publish complete"
# Cosmetics
YELLOW := "\e[31m" # bash value for yellow
NC := "\e[0m" # bash value for no color
# Shell functions
INFO := @bash -c '\
printf $(YELLOW); \
echo "==> $$1"; \
printf $(NC) ' VALUE
# Get container id of application service container
APP_CONTAINER_ID := $$(docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) ps -q $(APP_SERVICE_NAME))
# Get image id of application service
IMAGE_ID := $$(docker inspect -f '{{ .Image }}' $(APP_CONTAINER_ID))
# Repository Filter
ifeq ($(DOCKER_REGISTRY), docker.io)
REPO_FILTER := $(ORG_NAME)/$(REPO_NAME)[^[:space:]|\$$]*
else
REPO_FILTER := $(DOCKER_REGISTRY)/$(ORG_NAME)/$(REPO_NAME)[^[:space:]|\$$]*
endif
# Introspect repository tags
REPO_EXPR := $$(docker inspect -f '{{range .RepoTags}}{{.}} {{end}}' $(IMAGE_ID) | grep -oh "$(REPO_FILTER)" | xargs)
# Extract build tag arguments
ifeq (buildtag,$(firstword $(MAKECMDGOALS)))
BUILDTAG_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
ifeq ($(BUILDTAG_ARGS),)
$(error You must specify a tag)
endif
$(eval $(BUILDTAG_ARGS):;@:)
endif
# Extract tag arguments
ifeq (tag,$(firstword $(MAKECMDGOALS)))
TAG_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
ifeq ($(TAG_ARGS),)
$(error You must specify a tag)
endif
$(eval $(TAG_ARGS):;@:)
endif