# Thin control Makefile — one target per ctrl/ script, and the subcommand is an # argument rather than a second target: `make cluster down`, not `make cluster-down`. # # The logic lives in the scripts, never here. Each target maps to exactly one # bash file, and that file holds the variants: # # make cluster up -> ctrl/cluster.sh up # # Config layers, weakest first: ctrl/versions.env (pinned toolchain) < # ctrl/env.d/.env (cluster shape) < ctrl/.env (local, gitignored) < # the environment. So `make cluster up PROFILE=client` beats everything. # # Start with: make setup (then: make cluster up && make docs) # Identity follows the FOLDER NAME, so this directory can be copied elsewhere, # renamed, and run as a separate environment with no edits. ctrl/.env overrides # it when you want a name that differs from the directory. # # Asked once, of ctrl/ports.sh, which resolves it through lib/config.sh: # # CLUSTER KUBECONTEXT HTTP HTTPS TILT REGISTRY MANIFESTS_DIR # # Read positionally, so the order is a contract — ctrl/selftest.sh pins it. # # This used to be sed over ctrl/.env plus a slug computed here, which is a # SECOND derivation of values lib/config.sh already owns — and the two could # disagree about the port after `make ports persist`, or about the name for any # directory whose sanitised form differs from its raw one. One source now; the # Tiltfile reads the same line. FACTS := $(shell bash ctrl/ports.sh active 2>/dev/null) SLUG := $(shell echo '$(notdir $(CURDIR))' | tr '[:upper:]' '[:lower:]' | tr -c 'a-z0-9-' '-' | sed 's/^-*//; s/-*$$//') # The fallback matters: ports.sh sources config.sh, and if a profile or .env is # broken it exits non-zero. Losing the cluster name would send --context to the # wrong place, so fall back to the folder rather than to empty. CLUSTER := $(or $(word 1,$(FACTS)),$(SLUG)) KCTX := --context $(or $(word 2,$(FACTS)),kind-$(SLUG)) TILT_PORT := $(word 5,$(FACTS)) DEPSIMG := $(SLUG)-deps # Words after the target become the script's subcommand. Make would otherwise # treat them as goals of their own, so each gets a no-op rule. ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) ifneq ($(ARGS),) $(eval $(ARGS):;@:) # ...and as PHONY, because some of those words name real directories. `cfg`, # `ctrl`, `docs`, `gen` and `init` all exist at this level, and make considers a # target that is an existing directory already built — so `make build ctrl` ran # the build and then printed "make: 'ctrl' is up to date". The empty rule above # is not enough on its own; only .PHONY stops make consulting the filesystem. .PHONY: $(ARGS) endif .PHONY: help setup check selftest mem deps deps-image pins cluster registry addons ports \ docs tilt \ kind-up kind-down kind-reset tilt-up tilt-down help: ## list targets @grep -hE '^[a-z][a-z-]*:.*?##' $(MAKEFILE_LIST) | sed 's/:.*##/\t/' | expand -t16 # ── setup ────────────────────────────────────────────────────────────────── setup: ## prepare this machine [core] [--cluster] bash ctrl/setup.sh $(ARGS) check: ## is this machine ready? reports, never fixes bash ctrl/check.sh # The counterpart to check: that one asks about the MACHINE and never fails, # this one asks about RIG and exits 1, the way pins does. The checks are written # as the decisions they defend, so a failure names what is being undone. selftest: ## does rig still do what it says? exits 1 if not bash ctrl/selftest.sh mem: ## memory, and any cap holding it [status|backup|restore] bash ctrl/mem.sh $(or $(ARGS),status) deps: ## install the toolchain [core|dev] (default dev) bash ctrl/deps.sh install $(or $(ARGS),dev) pins: ## standalone/rigdeps.sh still installs what rig pins? bash ctrl/pins.sh deps-image: ## build the installer image [full] docker build -f ctrl/Dockerfile.deps \ --target $(if $(filter full,$(ARGS)),deps-full,deps) \ -t $(DEPSIMG):$(if $(filter full,$(ARGS)),full,deps) . # ── cluster ──────────────────────────────────────────────────────────────── cluster: ## this env + the machine [up|down|reset|list|free] bash ctrl/cluster.sh $(or $(ARGS),up) registry: ## registry wiring [up|down|status] (default status) bash ctrl/registry.sh $(or $(ARGS),status) addons: ## profile addons [install|list] (default list) bash ctrl/addons.sh $(or $(ARGS),list) ports: ## this environment's port block [show|persist] bash ctrl/ports.sh $(or $(ARGS),show) # ── docs + dev loop ──────────────────────────────────────────────────────── docs: ## documentation [serve|graphs] (default serve) bash ctrl/docs.sh $(or $(ARGS),serve) # --port is only passed when TILT_PORT resolved. It normally does, since FACTS # above asks ports.sh — but ports.sh can fail on a broken profile, and without # the guard tilt receives a bare `--port` with no value and fails on the flag # rather than on anything real. Tilt's own default is 10350, which is the number # every project on this machine is trying not to collide on, so falling back to # it silently is worse than not passing the flag. # # The Tiltfile asks ports.sh for the rest itself — cluster, registry and where # the manifests are — so nothing needs passing here beyond what tilt's own flags # require. tilt: ## dev loop [up|down] (default up) cd ctrl && tilt $(or $(ARGS),up) $(KCTX) $(if $(filter down,$(ARGS)),,$(if $(TILT_PORT),--port $(TILT_PORT))) # ── the shape every other project uses ───────────────────────────────────── # Aliases, not a second implementation: each one calls the same script the # canonical target does. # # The header above argues for `make cluster down` over `make cluster-down`, and # that still holds *within* this file. But rig is one repo among several on the # same machine, and every other one answers to kind-up / tilt-up. Muscle memory # spanning six projects beats internal tidiness in one, so both spellings work. # # `cluster list` and `cluster free` have no hyphenated twin on purpose — they # are rig's own, with nothing to be consistent with. # # Nothing outside this file reads these names: the script is `ctrl/cluster.sh` # and it takes the verb. So rename them, delete the ones you never type, or add # the spelling your own projects use — an alias is two lines, and adding one # costs nothing but a line in .PHONY above. kind-up: ## alias for `cluster up` bash ctrl/cluster.sh up kind-down: ## alias for `cluster down` bash ctrl/cluster.sh down kind-reset: ## alias for `cluster reset` bash ctrl/cluster.sh reset # These two match the other projects' spelling. rig ships ctrl/Tiltfile, so they # run — it deploys the examples in k8s/base until you replace them. tilt-up: ## alias for `tilt up` cd ctrl && tilt up $(KCTX) $(if $(TILT_PORT),--port $(TILT_PORT)) tilt-down: ## alias for `tilt down` cd ctrl && tilt down $(KCTX)