-
Notifications
You must be signed in to change notification settings - Fork 2
/
Makefile
150 lines (134 loc) · 5.07 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
#
# AppView - Integration Test Runner
#
# See ./README.md for details.
#
COMPOSE ?= $(shell which docker-compose 2>/dev/null)
ifeq (, $(COMPOSE))
$(error Missing docker-compose)
endif
DOCKER ?= $(shell which docker 2>/dev/null)
ifeq (, $(DOCKER))
$(error Missing docker)
endif
ARCH ?= $(shell uname -m)
COMPOSE := $(COMPOSE) -f docker-compose.yml -f docker-compose.$(ARCH).yml
TESTS := $(shell TAG=$(ARCH) $(COMPOSE) config --services | sort -V)
help:
@echo "AppView Integration Test Runner"
@echo " \`make help\` - show this info"
@echo " \`make all\` - run all tests, stop of first failure"
@echo " \`make build\` - build all test images"
@echo " \`make push\` - push all test images"
@echo " \`make (test)\` - run a single test"
@echo " \`make (test)-build\` - build the test's image"
@echo " \`make (test)-shell\` - run a shell in the test's container"
@echo " \`make (test)-exec\` - run a shell in the existing test's container"
@echo "Tests: $(TESTS)"
tests:
@TAG=$(ARCH) $(COMPOSE) config --services | sort -V
all:
@STARTED=; RAN=0; SKIP=0; PASS=0; FAIL=0; TOTAL=$(words $(TESTS)); OK=; ERR=; \
for TEST in $(TESTS); do \
if [ -n "$(START)" -a -z "$$STARTED" ]; then \
if [ "$(START)" = "$$TEST" ]; then \
STARTED=1; \
else \
SKIP=$$((SKIP+1)); \
continue; \
fi; \
fi; \
if $(MAKE) -s $${TEST}; then \
RAN=$$((RAN+1)); \
PASS=$$((PASS+1)); \
OK="$${OK}$${TEST} "; \
else \
RAN=$$((RAN+1)); \
FAIL=$$((FAIL+1)); \
ERR="$${ERR}$${TEST} "; \
if [ -z "$(CONTINUE)" ]; then \
echo >&2 "error: aborting \`make all\` on test failure"; \
echo >&2 " ran $${RAN}/$${TOTAL} tests, skipped $${SKIP}"; \
echo >&2 " $${PASS} passed, $${OK}"; \
echo >&2 " $${FAIL} failed, $${ERR}"; \
exit 1; \
fi; \
fi; \
done; \
if [ $$PASS -gt 0 ]; then \
echo "info: ran $${RAN}/$${TOTAL} tests, skipped $${SKIP}"; \
echo " $${PASS} passed, $${OK}"; \
echo " $${FAIL} failed, $${ERR}"; \
else \
echo >&2 "error: ran $${RAN}/$${TOTAL} tests, skipped $${SKIP}"; \
echo >&2 " $${PASS} passed, $${OK}"; \
echo >&2 " $${FAIL} failed, $${ERR}"; \
exit 1; \
fi
$(TESTS):
@[ -n "$(NOBUILD)" ] || $(MAKE) -s $(@)-build
@echo
@echo "==================================================================="
@echo " $(shell date)"
@echo " Running \"$@\" Test"
@echo "==================================================================="
@TAG=$(ARCH) $(COMPOSE) run --rm $(if $(CI),,--name appview-test-$(@)) $@ || \
{ echo >&2 "error: $(@) test failed."; exit 1; }
build: $(addsuffix -build, $(TESTS))
# --
# Check if an image already exists locally with the tag before pulling it again
# so we can build a newer version with newer configs and not have to rebuilt it
# every time. That's what ID is for. Should have no effect in CI as the local
# images list should be empty.
# --
%-build: IMAGE=ghcr.io/appview-team/appview-test-$(@:%-build=%):$(ARCH)
%-build: ID=$(shell $(DOCKER) images -q --filter=reference=$(IMAGE))
%-build:
@[ -n "$(filter $(@:%-build=%),$(TESTS))" ] || \
{ echo >&2 "error: $(@:%-build=%) isn't a test."; exit 1; }
@echo
@echo "==================================================================="
@echo " $(shell date)"
@echo " Building Image for \"$(@:%-build=%)\" Test"
@echo "==================================================================="
-@[ -n "$(ID)" -o -n "$(NOPULL)" ] || $(DOCKER) pull $(IMAGE)
@TAG=$(ARCH) $(COMPOSE) build \
$(@:%-build=%)
push: $(addsuffix -push, $(TESTS))
%-push: IMAGE=ghcr.io/appview-team/appview-test-$(@:%-push=%):$(ARCH)
%-push:
@[ -n "$(filter $(@:%-push=%),$(TESTS))" ] || \
{ echo >&2 "error: $(@:%-push=%) isn't a test."; exit 1; }
@[ -n "$(NOBUILD)" ] || $(MAKE) -s $(@:%-push=%)-build
@echo
@echo "==================================================================="
@echo " $(shell date)"
@echo " Pushing Image for \"$(@:%-push=%)\" Test"
@echo "==================================================================="
@time $(DOCKER) push $(IMAGE)
%-shell: CMD?=/bin/bash
%-shell:
@[ -n "$(filter $(@:%-shell=%),$(TESTS))" ] || \
{ echo >&2 "error: $(@:%-shell=%) isn't a test."; exit 1; }
@[ -n "$(NOBUILD)" ] || $(MAKE) -s $(@:%-shell=%)-build
@echo
@echo "==================================================================="
@echo " $(shell date)"
@echo " Shell in Container for \"$(@:%-shell=%)\" Test"
@echo "==================================================================="
@TAG=$(ARCH) $(COMPOSE) run --rm \
--service-ports \
--name appview-test-$(@:%-shell=%) \
$(@:%-shell=%) $(CMD)
%-exec: CMD?=/bin/bash
%-exec:
@[ -n "$(filter $(@:%-exec=%),$(TESTS))" ] || \
{ echo >&2 "error: $(@:%-exec=%) isn't a test."; exit 1; }
@echo
@echo "==================================================================="
@echo " $(shell date)"
@echo " Exec'ing into Container for \"$(@:%-exec=%)\" Test"
@echo "==================================================================="
@TAG=$(ARCH) $(DOCKER) exec -it appview-test-$(@:%-exec=%) $(CMD)
.PHONY: help all build push $(TESTS) %-build %-push %-shell
# vim: sw=4 ts=4 noet :