-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile.v1_moved
148 lines (119 loc) · 5.58 KB
/
Makefile.v1_moved
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
# Project variables
PROJECT_NAME ?= todobackend
ORG_NAME ?= jmenga3
REPO_NAME ?= todobackend
# Filenames
DEV_COMPOSE_FILE := docker/dev/docker-compose.yml
REL_COMPOSE_FILE := docker/release/docker-compose.yml
# Docker Compose Project Names
REL_PROJECT := $(PROJECT_NAME)$(BUILD_ID)
DEV_PROJECT := $(REL_PROJECT)dev
# Application Service Name - must match Docker Compose release specification application service name
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)
# Check and Inspect Logic
INSPECT := $$(docker-compose -p $$1 -f $$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
# Use these settings to specify a custom Docker registry
DOCKER_REGISTRY ?= docker.io
# WARNING: Set DOCKER_REGISTRY_AUTH to empty for Docker Hub
# Set DOCKER_REGISTRY_AUTH to auth endpoint for private Docker registry
DOCKER_REGISTRY_AUTH ?=
.PHONY: test build release clean tag buildtag login logout publish
test:
docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) pull
docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) build --pull test
docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) build cache
docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) run --rm agent
docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) up test
docker cp $$(docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) ps -q test):/reports/. reports
${CHECK} $(DEV_PROJECT) $(DEV_COMPOSE_FILE) test
build:
docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) build builder
docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) up builder
${CHECK} $(DEV_PROJECT) $(DEV_COMPOSE_FILE) builder
docker cp $$(docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) ps -q builder):/wheelhouse/. target
release:
docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) pull test
docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) build app
docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) build webroot
docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) build --pull nginx
docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) run --rm agent
docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) run --rm app manage.py collectstatic --noinput
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) up test
docker cp $$(docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) ps -q test):/reports/. reports
${CHECK} $(REL_PROJECT) $(REL_COMPOSE_FILE) test
clean:
${INFO} "Destroying development environment..."
docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) kill
docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) rm -f -v
docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) kill
docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) rm -f -v
docker images -q -f dangling=true -f label=application=$(REPO_NAME) | xargs -I ARGS docker rmi -f ARGS
${INFO} "Clean 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 -e $$DOCKER_EMAIL $(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"
# docker rmi $(docker images -f dangling=true -q)
# docker volume rm $(docker volume ls -f dangling=true -q)
# Cosmetics
YELLOW := "\e[0;33m"
NC := "\e[0m"
# Shell Functions
INFO := @bash -c '\
printf $(YELLOW); \
echo "=> $$1"; \
printf $(NC)' SOME_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