Files
bookstore/Makefile
T
twooeyandClaude Sonnet 5 5d8533f290 Add automated tests for the 25% pricing formula and $25/$15 shipping thresholds
Launch gate (design doc §5/§8) requires automated tests for both; the repo
had zero test infra until now. PHPUnit + Brain Monkey, run via `make test`
against the existing wordpress dev container.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MqhgnCRjjVLFnZ3Jpn93Vg
2026-08-28 10:58:29 -04:00

62 lines
2.8 KiB
Makefile

ENV ?= dev
export ENVIRONMENT = $(ENV)
# DB_PASSWORD/DB_ROOT_PASSWORD are stripped from what Compose loads — they
# only flow through secrets/ now, and Compose warns "variable not set" on
# any $-shaped value in --env-file even when nothing consumes it. Rewritten
# fresh on every `make` invocation, so it can't drift from .env.$(ENV).
# chmod 600 (not the 644 elsewhere in deploy/ — those get read by containers
# under a different UID; this one is only ever read by the `docker compose`
# CLI on the host, as $(ENV) invokes it, so there's no reason it needs to be
# world-readable) — and every target below removes it on the way out via a
# shell EXIT trap (same idiom deploy.sh/backup.sh already use for their own
# temp files), not a `; rm -f ...` tacked onto the end of the command. A
# real Ctrl+C on a long-running target (`logs -f`, an interactive `shell`)
# sends SIGINT to the recipe's whole foreground process group, which
# terminates a plain `cmd; rm -f ...` chain before the `;` ever runs — the
# EXIT trap fires regardless of *how* the shell exits (falls through, errors,
# or is killed by a signal), and doesn't touch $? either, so the underlying
# command's real exit code still propagates to `make`.
COMPOSE_ENV_FILE := .env.$(ENV).compose
$(shell grep -Ev '^(DB_PASSWORD|DB_ROOT_PASSWORD)=' .env.$(ENV) > $(COMPOSE_ENV_FILE) 2>/dev/null; chmod 600 $(COMPOSE_ENV_FILE) 2>/dev/null)
COMPOSE = docker compose -p bookstore-$(ENV) -f docker-compose.yml -f docker-compose.$(ENV).yml --env-file $(COMPOSE_ENV_FILE)
CLEANUP = trap 'rm -f $(COMPOSE_ENV_FILE)' EXIT;
.PHONY: up down ps logs shell wp test deploy backup
up:
$(CLEANUP) $(COMPOSE) up -d --build
down:
$(CLEANUP) $(COMPOSE) down
ps:
$(CLEANUP) $(COMPOSE) ps
logs:
$(CLEANUP) $(COMPOSE) logs -f
# add -u root yourself for one-off root debugging (installing a package, etc.)
shell:
$(CLEANUP) $(COMPOSE) exec -u www-data wordpress bash
# make wp ENV=staging ARGS="plugin list"
wp:
$(CLEANUP) $(COMPOSE) exec -u www-data wordpress wp $(ARGS)
# bookstore-core's PHPUnit suite; composer install is idempotent so this
# stays a single target rather than a separate "test-install" step. The
# plugin dir is bind-mounted from the host at the host user's uid, which
# www-data (uid 33 in the container) can't write into — install as root
# (same "-u root yourself for one-off root debugging" pattern as `shell`
# above), then chown vendor/composer.lock back to the host uid/gid so
# they stay normal host-owned files afterward, not root-owned.
test:
$(CLEANUP) $(COMPOSE) exec -u root wordpress bash -c \
"cd wp-content/plugins/bookstore-core && composer install --no-cache && chown -R $(shell id -u):$(shell id -g) vendor composer.lock && vendor/bin/phpunit"
deploy:
$(CLEANUP) ./deploy/deploy.sh $(ENV)
backup:
$(CLEANUP) ./deploy/backup.sh $(ENV)