-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMakefile
More file actions
144 lines (130 loc) · 6.04 KB
/
Copy pathMakefile
File metadata and controls
144 lines (130 loc) · 6.04 KB
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
.PHONY:clean venv test coverage lint format deploy
all:clean test coverage lint
MIN_TEST_COVERAGE=96
INITIAL_PYTHON?=python3
VENV_DIR?=.venv
LIBRARY=devopsdriver
VENV_PYTHON?=$(VENV_DIR)/bin/python
VENV_PIP?=$(VENV_DIR)/bin/pip
SET_ENV?=. $(VENV_DIR)/bin/activate
SOURCES=$(shell find $(LIBRARY) -type f -iname "*.py")
TESTS=$(shell find tests -type f -iname "test_*.py")
FORMAT_FILE=$(VENV_DIR)/format.txt
LINT_FILE=$(VENV_DIR)/lint.txt
COVERAGE_FILE=.coverage
DEPLOY_FILE=$(VENV_DIR)/deploy.txt
PROJECT_FILE=pyproject.toml
SLEEP_TIME_IN_SECONDS=1
TEST_SERVER_TEST_DIR=test_published
PROD_SERVER_TEST_DIR=prod_published
BUILD_LOG=$(VENV_DIR)/build_log.txt
PIP_INSTALL=$(VENV_PIP) install --quiet --upgrade
PIP_INSTALL_TEST=pip install --no-cache-dir --quiet
SETTINGS_TOOL=devopsdriver.manage_settings
VERSION=$(shell $(SET_ENV); python -c "print(__import__('devopsdriver').__version__)")
$(VENV_DIR)/touchfile: $(PROJECT_FILE)
@test -d $(VENV_DIR) || $(INITIAL_PYTHON) -m venv $(VENV_DIR)
@echo Ensuring pip is latest version
@$(SET_ENV); $(PIP_INSTALL) pip
@echo Fetching requirements
@$(SET_ENV); $(PIP_INSTALL) .
@touch $@
venv: $(VENV_DIR)/touchfile
$(COVERAGE_FILE): $(VENV_DIR)/touchfile $(SOURCES) $(TESTS)
@$(SET_ENV); $(PIP_INSTALL) ".[test]"
@$(SET_ENV); $(VENV_PYTHON) -m coverage run --source $(LIBRARY) -m pytest
test: $(COVERAGE_FILE)
coverage: $(COVERAGE_FILE)
@$(SET_ENV); $(VENV_PYTHON) -m coverage report -m --sort=cover --skip-covered --fail-under=$(MIN_TEST_COVERAGE)
@if grep --quiet "test+coverage&message=$(MIN_TEST_COVERAGE)%" README.md; then true; else echo "Update README.md test coverage" && false; fi
$(FORMAT_FILE): $(VENV_DIR)/touchfile $(SOURCES)
@$(SET_ENV); $(PIP_INSTALL) ".[dev]"
@$(SET_ENV); $(VENV_PYTHON) -m black $(LIBRARY) &> $@
format: $(FORMAT_FILE)
@cat $^
@perl -i -pe's/test\+coverage\&message=..%/test\+coverage\&message=$(MIN_TEST_COVERAGE)%/g' README.md
@perl -i -pe's@released&message=v\d+.\d+.\d+&@released&message=v$(VERSION)&@g' README.md
@perl -i -pe's@devopsdriver/\d+.\d+.\d+/@devopsdriver/$(VERSION)/@g' README.md
$(LINT_FILE): $(VENV_DIR)/touchfile $(SOURCES)
@$(SET_ENV); $(PIP_INSTALL) ".[dev]"
-@$(SET_ENV); $(VENV_PYTHON) -m pylint --disable cyclic-import $(LIBRARY) --output $@
-@$(SET_ENV); $(VENV_PYTHON) -m black $(LIBRARY) --check >> $@ 2>&1
lint: $(LINT_FILE)
@cat $^
@if grep --quiet "would be reformatted" $^; then echo "black failure!" && false; else true; fi
@if grep --quiet "rated at 10.00/10" $^; then true; else echo "pylint failure!" && false; fi
$(DEPLOY_FILE):$(LINT_FILE) $(COVERAGE_FILE) $(PROJECT_FILE) $(SOURCES) lint coverage
@echo "Preparation cleanup"
@rm -Rf dist build *.egg-info $(VENV_DIR)/$(TEST_SERVER_TEST_DIR) $(VENV_DIR)/$(PROD_SERVER_TEST_DIR)
@echo "Validating version strings are correct"
@if grep --quiet "released&message=v$(VERSION)&" README.md; then true; else echo "Update README.md badge version" && false; fi
@if grep --quiet "devopsdriver/$(VERSION)/" README.md; then true; else echo "Update README.md PyPI version" && false; fi
@echo "Putting tests in staging test dir: $(VENV_DIR)/$(TEST_SERVER_TEST_DIR)"
@mkdir -p $(VENV_DIR)/$(TEST_SERVER_TEST_DIR)
@cp -R tests $(VENV_DIR)/$(TEST_SERVER_TEST_DIR)/
@echo "Putting tests in prod test dir: $(VENV_DIR)/$(PROD_SERVER_TEST_DIR)"
@mkdir -p $(VENV_DIR)/$(PROD_SERVER_TEST_DIR)
@cp -R tests $(VENV_DIR)/$(PROD_SERVER_TEST_DIR)/
@echo "Installing tools"
@$(SET_ENV); $(PIP_INSTALL) build twine
@echo "Building package"
@$(SET_ENV); $(VENV_PYTHON) -m build > $(BUILD_LOG)
@echo "Uploading package to test server"
@$(SET_ENV); \
REPO=`$(VENV_PYTHON) -m $(SETTINGS_TOOL) pypi_test.repo`; \
USERNAME=`$(VENV_PYTHON) -m $(SETTINGS_TOOL) pypi_test.username`; \
PASSWORD=`$(VENV_PYTHON) -m $(SETTINGS_TOOL) pypi_test.password`; \
$(VENV_PYTHON) -m twine upload --repository $$REPO dist/* --username $$USERNAME --password $$PASSWORD
@echo "Waiting for uploaded package to be avilable before testing"
@sleep $(SLEEP_TIME_IN_SECONDS)
@echo "First attempt at testing staging package"
-@$(SET_ENV); \
TESTURL=`$(VENV_PYTHON) -m $(SETTINGS_TOOL) pypi_test.url`; \
URL=`$(VENV_PYTHON) -m $(SETTINGS_TOOL) pypi_prod.url`; \
cd $(VENV_DIR)/$(TEST_SERVER_TEST_DIR); \
$(INITIAL_PYTHON) -m venv .venv; \
$(SET_ENV); \
$(PIP_INSTALL_TEST) --log $@ -i $$TESTURL pytest $(LIBRARY)==$(VERSION) --extra-index-url $$URL;
@echo "Second attempt at testing staging package"
@$(SET_ENV); \
TESTURL=`$(VENV_PYTHON) -m $(SETTINGS_TOOL) pypi_test.url`; \
URL=`$(VENV_PYTHON) -m $(SETTINGS_TOOL) pypi_prod.url`; \
cd $(VENV_DIR)/$(TEST_SERVER_TEST_DIR); \
$(INITIAL_PYTHON) -m venv .venv; \
$(SET_ENV); \
$(PIP_INSTALL_TEST) --log $@ -i $$TESTURL pytest $(LIBRARY)==$(VERSION) --extra-index-url $$URL; \
$(VENV_PYTHON) -m pytest
@echo "Uploading package to production server"
@$(SET_ENV); \
REPO=`$(VENV_PYTHON) -m $(SETTINGS_TOOL) pypi_prod.repo`; \
USERNAME=`$(VENV_PYTHON) -m $(SETTINGS_TOOL) pypi_prod.username`; \
PASSWORD=`$(VENV_PYTHON) -m $(SETTINGS_TOOL) pypi_prod.password`; \
$(VENV_PYTHON) -m twine upload --repository $$REPO dist/* --username $$USERNAME --password $$PASSWORD
@echo Waiting for uploaded package to be avilable before testing
@sleep $(SLEEP_TIME_IN_SECONDS)
@echo "First attempt at testing production package"
-@$(SET_ENV); \
URL=`$(VENV_PYTHON) -m $(SETTINGS_TOOL) pypi_prod.url`; \
cd $(VENV_DIR)/$(PROD_SERVER_TEST_DIR); \
$(INITIAL_PYTHON) -m venv .venv; \
$(SET_ENV); \
$(PIP_INSTALL_TEST) --log $@ -i $$URL pytest $(LIBRARY)==$(VERSION);
@echo "Second attempt at testing production package"
@$(SET_ENV); \
URL=`$(VENV_PYTHON) -m $(SETTINGS_TOOL) pypi_prod.url`; \
cd $(VENV_DIR)/$(PROD_SERVER_TEST_DIR); \
$(INITIAL_PYTHON) -m venv .venv; \
$(SET_ENV); \
$(PIP_INSTALL_TEST) --log $@ -i $$URL pytest $(LIBRARY)==$(VERSION); \
$(VENV_PYTHON) -m pytest
@touch $@
deploy: $(DEPLOY_FILE)
clean:
@rm -Rf $(VENV_DIR)
@rm -f $(strip $(COVERAGE_FILE))*
@rm -Rf `find . -type d -name __pycache__`
@rm -Rf .pytest_cache
@rm -Rf dist
@rm -Rf build
@rm -Rf *.egg-info
@find . -iname "*.pyc" -delete