-
Notifications
You must be signed in to change notification settings - Fork 6
/
Makefile
210 lines (180 loc) · 6.63 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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
.PHONY: help
help:
@echo "Usage: make <target>"
@echo ""
@echo "Setup targets:"
@echo " setup to setup the virtualenv and generate files"
@echo " build to build the afsbotcfg Python package"
@echo ""
@echo "Run targets:"
@echo " buildbot to run the playbook to create/update the buildbot server"
@echo " ping to check connectivity to the buildbot server"
@echo " getlog to download the buildbot server log"
@echo ""
@echo "Test targets:"
@echo " lint to run yaml and ansible lint checks"
@echo " test to run molecule test"
@echo " check to run molecule create, converge, verify"
@echo " login to run molecule login"
@echo " destroy to run molecule destroy"
@echo ""
@echo "Cleanup targets:"
@echo " clean to destroy the molecule instance and remove generated files"
@echo " reallyclean to remove all non-project files"
@echo ""
@echo "Environment:"
@echo " AFSBOTCFG_PYTHON python interpreter path (default: python)"
@echo " AFSBOTCFG_MOLECULE_SCENARIO make check/test molecule scenario (default: master-with-vault)"
@echo " AFSBOTCFG_MOLECULE_HOST make login host (default: afsbotcfg-master)"
@echo " AFSBOTCFG_LOGDIR ansible play log directory (default: logs)"
@echo " NO_COLOR disable Makefile color output"
@echo ""
#--------------------------------------------------------------------------------------------------------
# Definitions
#
# Environment
AFSBOTCFG_HOST ?= buildbot.openafs.org
AFSBOTCFG_PYTHON ?= python
AFSBOTCFG_MOLECULE_SCENARIO ?= master-with-vault
AFSBOTCFG_MOLECULE_HOST ?= afsbotcfg-master
AFSBOTCFG_LOGDIR ?= logs
# Generated molecule.yml files.
AFSBOTCFG_MOLECULE_YML = \
molecule/default/molecule.yml \
molecule/master-with-vault/molecule.yml \
molecule/unix-builder/molecule.yml
YAML_FILES=\
*.yml \
inventory/openafs/group_vars/openafs_buildbot_masters/master.yml \
molecule/*/*.yml
LINT_OPTIONS=\
--exclude=inventory/openafs/group_vars/openafs_buildbot_masters/worker_passwords.yml \
--exclude=inventory/openafs/group_vars/openafs_buildbot_masters/admin_passwords.yml
PLAYBOOK=afsbotcfg.yml
INVENTORY=inventory/openafs/hosts.ini
VAULT_KEYFILE=.vault-afsbotcfg
PACKAGES=.packages
ifdef VIRTUAL_ENV
PIP=$(VIRTUAL_ENV)/bin/pip
ACTIVATED=ANSIBLE_COLLECTIONS_PATH=$(CURDIR)/collections
else
VENV=.venv
PIP=$(VENV)/bin/pip
ACTIVATE=$(VENV)/bin/activate
ACTIVATED=. $(ACTIVATE); ANSIBLE_COLLECTIONS_PATH=$(CURDIR)/collections
endif
ifndef NO_COLOR
RED=\033[0;31m
GREEN=\033[0;32m
YELLOW=\033[0;33m
START_COLOR=$(GREEN)
END_COLOR=\033[0m
endif
INFO=@printf "$(START_COLOR)==> %s <==$(END_COLOR)\n"
ifdef AFSBOTCFG_LOGDIR
LOGFILE=$(AFSBOTCFG_LOGDIR)/buildbot-$(shell date "+%Y%m%dT%H%M").log
LOG=ANSIBLE_LOG_PATH="$(LOGFILE)"
LOGINFO=$(INFO) "Wrote $(LOGFILE)"
endif
#--------------------------------------------------------------------------------------------------------
# Setup targets
#
.PHONY: setup
setup: $(PACKAGES) $(AFSBOTCFG_MOLECULE_YML) build
.PHONY: build
build: $(PACKAGES)
$(INFO) "Building afsbotcfg python package"
$(ACTIVATED) $(MAKE) --no-print-directory -C src build
#--------------------------------------------------------------------------------------------------------
# Run targets
#
.PHONY: ping
ping: $(PACKAGES) $(VAULT_KEYFILE)
$(INFO) "Pinging buildbot"
$(ACTIVATED) ansible --inventory=$(INVENTORY) --vault-password-file=$(VAULT_KEYFILE) all -m ping
.PHONY: buildbot
buildbot: $(PACKAGES) $(VAULT_KEYFILE) collections build $(AFSBOTCFG_LOGDIR)
$(INFO) "Running buildbot playbook"
$(ACTIVATED) $(LOG) ansible-playbook --inventory=$(INVENTORY) --vault-password-file=$(VAULT_KEYFILE) $(PLAYBOOK)
$(LOGINFO)
.PHONY: getlog
getlog: $(AFSBOTCFG_LOGDIR)
$(INFO) "Downloading buildbot log"
scp $(AFSBOTCFG_HOST):master/openafs/twistd.log $(AFSBOTCFG_LOGDIR)/twistd-$(shell date "+%Y%m%dT%H%M").log
#--------------------------------------------------------------------------------------------------------
# Test targets
#
.PHONY: lint
lint: $(PACKAGES)
$(INFO) "Running lint checks"
$(ACTIVATED) $(MAKE) -C src lint
$(ACTIVATED) yamllint $(YAML_FILES)
$(ACTIVATED) ansible-lint $(LINT_OPTIONS)
.PHONY: test
test: $(PACKAGES) lint build molecule/$(AFSBOTCFG_MOLECULE_SCENARIO)/molecule.yml
$(INFO) "Running molecule test"
$(ACTIVATED) molecule test -s $(AFSBOTCFG_MOLECULE_SCENARIO)
@rm -f .create # Cleanup in case 'make check' was run before 'make test'.
.PHONY: check
check: $(PACKAGES) .create build
$(INFO) "Running playbook on molecule instance(s)"
$(ACTIVATED) molecule converge -s $(shell cat .create)
$(ACTIVATED) molecule verify -s $(shell cat .create)
.PHONY: login
login: $(PACKAGES) .create
$(INFO) "Logging into molecule instance"
$(ACTIVATED) molecule login -s $(shell cat .create) --host $(AFSBOTCFG_MOLECULE_HOST)
.create: $(PACKAGES) molecule/$(AFSBOTCFG_MOLECULE_SCENARIO)/molecule.yml
$(INFO) "Creating molecule instance(s)"
$(ACTIVATED) molecule create -s $(AFSBOTCFG_MOLECULE_SCENARIO)
@echo $(AFSBOTCFG_MOLECULE_SCENARIO) >.create
.PHONY: destroy
destroy: # empty
$(INFO) "Destroying molecule instance(s)"
if test -f .create; then \
$(ACTIVATED) molecule destroy -s $(shell cat .create); \
$(ACTIVATED) molecule reset -s $(shell cat .create); \
rm -f .create; \
fi
#------------------------------------------------------------------------------
# Cleanup targets
#
.PHONY: clean
clean: destroy
$(INFO) "Cleanup files"
$(MAKE) -C src clean
rm -f $(AFSBOTCFG_MOLECULE_YML) $(PACKAGES)
.PHONY: reallyclean
reallyclean: clean
$(INFO) "Cleanup project directory"
$(MAKE) -C src distclean
rm -rf .config .venv collections .direnv logs
#------------------------------------------------------------------------------
# Dependencies
#
$(AFSBOTCFG_LOGDIR):
mkdir -p $(AFSBOTCFG_LOGDIR)
$(VAULT_KEYFILE):
$(INFO) "Downloading vault key"
scp $(AFSBOTCFG_HOST):$(VAULT_KEYFILE) $(VAULT_KEYFILE)
collections: $(PACKAGES) requirements.yml
$(INFO) "Installing required Ansible collections"
$(ACTIVATED) ansible-galaxy collection install --force -p collections -r requirements.yml
touch collections
$(PACKAGES): $(PIP) requirements.txt
$(INFO) "Installing python packages"
$(PIP) install -U -r requirements.txt
touch $(PACKAGES)
$(PIP): $(VENV)
$(INFO) "Updating pip"
$(PIP) install -U pip wheel
touch $(PIP)
$(VENV):
$(INFO) "Creating python virtualenv"
$(AFSBOTCFG_PYTHON) -m venv .venv
touch $(VENV)
ifeq ($(AFSBOTCFG_MOLECULE_SCENARIO), master-with-vault)
# Conditional to support testing without the vault key.
test: $(VAULT_KEYFILE)
.create: $(VAULT_KEYFILE)
endif