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
62 lines
2.8 KiB
Makefile
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)
|