-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
234 lines (196 loc) · 8.81 KB
/
Copy pathMakefile
File metadata and controls
234 lines (196 loc) · 8.81 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
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
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
# Makefile for Blog Kit Bundle
# Simplifies Docker commands for development.
# All dev targets use the root docker-compose.yml (single file).
COMPOSE_FILE := docker-compose.yml
# Prefer Compose V2; absolute docker path avoids shadowing by local docker/ when PATH has "." (REQ-MAKE-010).
DOCKER_BIN := $(shell command -v docker 2>/dev/null)
ifeq ($(DOCKER_BIN),)
COMPOSE_BIN := docker-compose
else
COMPOSE_BIN := $(shell $(DOCKER_BIN) compose version >/dev/null 2>&1 && echo "$(DOCKER_BIN) compose" || echo "docker-compose")
endif
COMPOSE := $(COMPOSE_BIN) -f $(COMPOSE_FILE)
SERVICE_PHP := php
.PHONY: help up down down-dev build shell install test test-coverage test-coverage-100 test-ts coverage-php-percent cs-check cs-fix rector rector-dry phpstan qa release-check release-check-demos composer-sync clean update validate validate-translations assets setup-hooks check-no-cursor-coauthor check-open-prs strip-cursor-coauthor-from-history demo-smoke check-twig-extra check-no-raw-html-form
# Default target
help:
@echo "Blog Kit Bundle - Development Commands"
@echo ""
@echo "Usage: make <target>"
@echo ""
@echo "Targets:"
@echo " up Start Docker container"
@echo " down Stop Docker container"
@echo " down-dev Stop root container (alias of down; non-destructive)"
@echo " build Rebuild Docker image (no cache)"
@echo " shell Open shell in container"
@echo " install Install Composer dependencies (starts container if needed)"
@echo " test Run PHPUnit tests"
@echo " test-coverage Run tests with code coverage"
@echo " test-coverage-100 Run tests and enforce 100% coverage"
@echo " cs-check Check code style"
@echo " cs-fix Fix code style"
@echo " rector Apply Rector refactoring"
@echo " rector-dry Run Rector in dry-run mode"
@echo " phpstan Run PHPStan static analysis"
@echo " qa Run all QA checks (cs-check + test)"
@echo " release-check Pre-release: cs-fix, cs-check, rector-dry, phpstan, test-coverage, demo healthchecks"
@echo " demo-smoke Boot demo/symfony8 and assert HTTP 200 (REQ-TEST-011)"
@echo " check-open-prs Fail if unresolved open GitHub PRs remain (REQ-REL-003)"
@echo " composer-sync Validate composer.json and align composer.lock (no install)"
@echo " clean Remove vendor and cache"
@echo " update Update composer.lock (composer update)"
@echo " update-deps Update bundle and demo dependencies (REQ-MAKE-008)"
@echo " validate Run composer validate --strict"
@echo " validate-translations Check translation YAML key parity (REQ-MAKE-004)"
@echo " assets Build Vite/TS assets (pnpm)"
@echo " test-ts Run Vitest with coverage"
@echo " setup-hooks Install git pre-commit hooks"
@echo ""
@echo "Demos: use make -C demo or make -C demo/<demo-name>"
@echo ""
# Rebuild Docker image (no cache)
build:
$(COMPOSE) build --no-cache
# Build and start container
up:
$(COMPOSE) build
$(COMPOSE) up -d
@echo "Waiting for container to be ready..."
@sleep 2
@echo "Installing dependencies..."
$(COMPOSE) exec -T $(SERVICE_PHP) composer install --no-interaction
@echo "✅ Container ready!"
# Stop container
down:
$(COMPOSE) down
# REQ-MAKE-007: alias of down (non-destructive stop for root/dev container)
down-dev: down
# Open shell in container
shell: ensure-up
$(COMPOSE) exec $(SERVICE_PHP) sh
# Ensure container is running (start if not). Used by install, test, cs-check, cs-fix, qa, rector, phpstan.
ensure-up:
@if ! $(COMPOSE) exec -T $(SERVICE_PHP) true 2>/dev/null; then \
echo "Starting container..."; \
$(COMPOSE) up -d; \
sleep 3; \
$(COMPOSE) exec -T $(SERVICE_PHP) composer install --no-interaction; \
fi
# Install dependencies
install: ensure-up
$(COMPOSE) exec -T $(SERVICE_PHP) composer install
# Run tests (no -T so PHPUnit shows colors in console)
test: ensure-up
$(COMPOSE) exec $(SERVICE_PHP) composer test
# Run tests with coverage (no -T so coverage is shown in console with colors)
test-coverage: ensure-up
$(COMPOSE) exec $(SERVICE_PHP) composer test-coverage | tee coverage-php.txt
./.scripts/php-coverage-percent.sh coverage-php.txt
test-coverage-100: ensure-up
$(COMPOSE) exec $(SERVICE_PHP) composer test-coverage
$(COMPOSE) exec $(SERVICE_PHP) php .scripts/coverage-check-100.php
# Check code style
cs-check: ensure-up
$(COMPOSE) exec -T $(SERVICE_PHP) composer cs-check
# Fix code style
cs-fix: ensure-up
$(COMPOSE) exec -T $(SERVICE_PHP) composer cs-fix
# Rector
rector: ensure-up
$(COMPOSE) exec -T $(SERVICE_PHP) composer rector
# Rector dry-run
rector-dry: ensure-up
$(COMPOSE) exec -T $(SERVICE_PHP) composer rector-dry
# PHPStan
phpstan: ensure-up
$(COMPOSE) exec -T $(SERVICE_PHP) composer phpstan
# Run all QA
qa: ensure-up
$(COMPOSE) exec -T $(SERVICE_PHP) composer qa
# REQ-MAKE-004 — translation key parity against en catalogue
validate-translations: ensure-up
$(COMPOSE) exec -T $(SERVICE_PHP) php .scripts/validate-translations.php
# Pre-release checks (REQ-MAKE-002 / REQ-REL-003)
check-twig-extra:
@chmod +x .scripts/check-twig-extra.sh
@./.scripts/check-twig-extra.sh
check-no-raw-html-form:
@chmod +x .scripts/check-no-raw-html-form.sh
@./.scripts/check-no-raw-html-form.sh
release-check: ensure-up check-no-cursor-coauthor check-open-prs check-twig-extra check-no-raw-html-form composer-sync cs-fix cs-check rector-dry phpstan validate-translations assets test-ts test-coverage release-check-demos
# REQ-TEST-011 — boot demo stack and assert one HTTP 200
# classic mode keeps FrankenPHP up before vendor/ is installed on fresh CI checkouts
demo-smoke:
@FRANKENPHP_MODE=classic $(MAKE) -C demo/symfony8 up
@PORT=$$(grep "^PORT=" demo/symfony8/.env 2>/dev/null | cut -d= -f2 | tr -d '\r'); \
[ -z "$$PORT" ] && PORT=$$(grep "^PORT=" demo/symfony8/.env.example 2>/dev/null | cut -d= -f2 | tr -d '\r'); \
[ -z "$$PORT" ] && PORT=8105; \
echo "Smoke GET http://localhost:$$PORT/ (fallback: in-container curl)"; \
code=000; \
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do \
code=$$(curl -fsS -o /dev/null -w "%{http_code}" "http://127.0.0.1:$$PORT/" 2>/dev/null || true); \
if [ "$$code" != "200" ]; then \
code=$$(cd demo/symfony8 && docker compose exec -T php curl -fsS -o /dev/null -w "%{http_code}" "http://127.0.0.1/" 2>/dev/null || true); \
fi; \
[ "$$code" = "200" ] && break; \
sleep 5; \
done; \
if [ "$$code" != "200" ]; then echo "demo-smoke failed: HTTP $$code"; (cd demo/symfony8 && docker compose logs --tail 80 php) || true; exit 1; fi; \
echo "demo-smoke OK (HTTP 200)"
release-check-demos:
@if [ -f demo/Makefile ]; then $(MAKE) -C demo release-check; fi
# Validate composer and sync lock (no install)
composer-sync: ensure-up
$(COMPOSE) exec -T $(SERVICE_PHP) composer validate --strict
$(COMPOSE) exec -T $(SERVICE_PHP) composer update --lock --no-install
# Clean vendor and cache
clean:
rm -rf vendor
rm -rf .phpunit.cache
rm -rf coverage
rm -rf coverage-ts
rm -rf node_modules
rm -f coverage.xml
rm -f coverage-ts.txt
rm -f .php-cs-fixer.cache
# Update composer.lock
update: ensure-up
$(COMPOSE) exec -T $(SERVICE_PHP) composer update
# Validate composer.json
validate: ensure-up
$(COMPOSE) exec -T $(SERVICE_PHP) composer validate --strict
assets: ensure-up
@$(COMPOSE) exec -T -e CI=true $(SERVICE_PHP) pnpm install --frozen-lockfile
@$(COMPOSE) exec -T -e CI=true $(SERVICE_PHP) pnpm run build
@echo "Assets: src/Resources/public/blog-kit.js"
test-ts: ensure-up
@$(COMPOSE) exec -T -e CI=true $(SERVICE_PHP) pnpm install --frozen-lockfile
@$(COMPOSE) exec -T $(SERVICE_PHP) pnpm run test:coverage | tee coverage-ts.txt
@chmod +x .scripts/ts-coverage-percent.sh
@./.scripts/ts-coverage-percent.sh coverage-ts.txt
# Setup git hooks for pre-commit checks
check-no-cursor-coauthor:
@chmod +x .scripts/check-no-cursor-coauthor.sh
@./.scripts/check-no-cursor-coauthor.sh HEAD
# Fail when open GitHub PRs are unresolved (REQ-REL-003)
check-open-prs:
@chmod +x .scripts/check-open-prs.sh
@bash .scripts/check-open-prs.sh
setup-hooks:
@chmod +x .githooks/pre-commit 2>/dev/null || true
@chmod +x .githooks/commit-msg 2>/dev/null || true
@git config core.hooksPath .githooks
@echo "✅ Git hooks installed (.githooks — includes commit-msg for REQ-GIT-001)."
# REQ-MAKE-008: update-deps (bundle root + all demos).
# Optional include: monorepo path exists locally; absent on GitHub Actions checkout.
BUNDLE_ROOT := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
-include $(BUNDLE_ROOT)/../.scripts/Makefile.update-deps.mk
update-deps:
@$(MAKE) update
@$(MAKE) update-deps-demos
strip-cursor-coauthor-from-history:
@chmod +x .scripts/strip-cursor-coauthor-from-history.sh
@./.scripts/strip-cursor-coauthor-from-history.sh main
twig-lint: ensure-up
@$(COMPOSE) exec -T $(SERVICE_PHP) composer twig:lint || $(COMPOSE) exec -T $(SERVICE_PHP) ./vendor/bin/twig-cs-fixer lint --config=.twig-cs-fixer.php