3.8 KiB
Makefile
Shape and config layers
Thin control Makefile: few targets, and the subcommand is an argument rather than a second target: make cluster down, not make cluster-down.
make check is this machine ready? (never changes anything)
make deps install the toolchain
make cluster up cluster + registry + addons (ports derive by themselves)
make tilt / docs work on it, read about it
The logic lives in the scripts, never here: make cluster up -> ctrl/cluster.sh up.
Config layers, weakest first: built-in defaults < ctrl/versions.env (pinned toolchain) < ctrl/env.d/.env (optional) < ctrl/.env (local, gitignored) < the environment. So make cluster up PROFILE=<name> beats them all. See config.md.
Start with: make check && make deps && make cluster up
FACTS
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 in the Makefile, which is a SECOND derivation of values lib/config.sh already owns, and the two could disagree about the port after ports.sh 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.
CLUSTER / KCTX fallback
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.
ARGS as .PHONY
Words after the target become the script's subcommand; each gets a no-op rule so make does not treat them as goals. They are also marked 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 is not enough on its own; only .PHONY stops make consulting the filesystem.
tilt: --port guard
--port is only passed when TILT_PORT resolved. It normally does, since FACTS 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.
Aliases (kind-up, tilt-up, ...)
Aliases, not a second implementation: each one calls the same script the canonical target does.
The header argues for make cluster down over make cluster-down, and that still holds within the Makefile. 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 the Makefile 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.