Files
computer-playbook/docs/contributing/actions/deploy.md
T
kevinveenbirkenbachandClaude Opus 4.7 9a578952c3 feat(env): SPOT env-pipeline + INFINITO_* namespace
Replace 8 bash env modules with a single Python generator
(cli.meta.env) that materialises env/static.env + runtime context
into a gitignored .env. Each variable lives in its own handler
under utils/env/handlers/; defaults carry inline one-line `# ...`
comments.

Rename to the INFINITO_* schema:
- workflow inputs: APPS, SERVICES_DISABLED, CMD, DEBUG, WHITELIST,
  BUNDLES, FULL_CYCLE, VARIANT, RUN_FLAGS, LIMIT_HOST, PARALLEL
- inventory: INVENTORY_DIR / INVENTORY_FILE / HOST_VARS_FILE,
  PW_FILE -> INVENTORY_PASSWORD_FILE
- venv: VENV_BASE / VENV_FALLBACK / VENV_NAME
- new SPOT defaults: COMPILE_SILENCE, CONTAINER_NO_CA,
  WAIT_HEALTH_TIMEOUT_S, PACKAGE_CACHE_FRONTEND_INIT_IMAGE,
  promoted IMAGE_TAG from GHA-only to general passthrough

compose.yml hardening:
- inline \${VAR:-default} removed; strict \${VAR:?...} everywhere
- new integration lint blocks regressions

Tooling:
- scripts/install/all.sh owns the stamp-file install logic
  (Makefile target delegates)
- scripts/meta/env/load.sh is the single shell entry point;
  8 bash modules deleted
- new shell lint: no INFINITO_* defaults outside env/static.env

Tests:
- 93 new unit tests for utils/env/{builder,parser,runtime,writer}
- restructure tests/lint into repository/ (file-content rules) vs
  filesystem/{shell,python,env}/ (filesystem-shape rules)
- drift + smoke integration tests against the generator

Docs:
- variables.md is now a pointer; per-variable docs live next to
  the key in env/static.env / env/ci.env
- compose.yml.md drops the Default column

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 20:40:34 +02:00

5.7 KiB

Local Deploy 🚀

Contributor guidance for running deploys against a local development stack on your workstation. For production deploy guidance see the Deploy Guide. For the agent-driven role iteration loop see role.md. For the matrix-variant mechanism that this page references throughout see variants.md.

Entry Points 🧭

Two layers exist for invoking a local deploy:

Layer When to use
make deploy-* targets in the Makefile Default. Stable, opinionated wrappers tuned for the local-dev / CI-on-laptop flow.
infinito administration deploy development <subcommand> (Python CLI) Direct invocation when you need a flag the make targets do not expose, or when you script multi-step flows yourself.

The make targets ultimately call the same CLI, so any behaviour described here applies to both.

First-Run Baseline 📦

Use deploy-fresh-purged-apps to bring up a clean slate:

make deploy-fresh-purged-apps INFINITO_APPS="<role> <role>" INFINITO_FULL_CYCLE=true
  • INFINITO_FULL_CYCLE=true adds the async update pass (pass 2) and SHOULD stay on for the baseline. The behaviour, per-variant interleaving, and --full-cycle flag mechanics are documented in variants.md.
  • The wrapper runs init, then deploy. Init materialises the inventory under ${INFINITO_INVENTORY_DIR} (resolved by make dotenv via resolve.sh; see variables.md).
  • For roles with a roles/<role>/meta/variants.yml the init step produces one inventory folder per variant; the deploy step iterates them. Folder layout, round semantics, cleanup rules, and the link to the file-format reference live in variants.md.

Edit / Fix / Redeploy Loop 🔁

Default redeploy after a local code change:

make deploy-reuse-kept-apps INFINITO_APPS="<role>"
  • Reuses the existing inventory, keeps app state, runs the deploy only.
  • For multi-variant roles you MUST set INFINITO_VARIANT=<idx> (see Pinning A Single Variant) so the reuse path targets the round's folder. Without INFINITO_VARIANT, the reuse target points at <INFINITO_INVENTORY_DIR> which only exists for single-variant roles.

If the reuse path keeps reproducing the same failure and you want to test whether app entity state is involved:

make deploy-reuse-purged-apps INFINITO_APPS="<role>"

This purges the app's containers + volumes + Ansible-managed state on the host, then re-deploys. Use it once, then return to deploy-reuse-kept-apps. Do NOT loop on deploy-reuse-purged-apps; if the failure survives a single purge it is not a state issue.

Only return to deploy-fresh-purged-apps when you have concrete evidence that the inventory or the host stack itself is broken (for example DNS or network failures during the deploy).

Pinning A Single Variant 🎯

For multi-variant roles you MAY restrict any of the make targets above (and the dev CLI subcommands) to a single matrix round by setting INFINITO_VARIANT=<idx>:

# Variant 1 baseline only (no full matrix):
INFINITO_VARIANT=1 make deploy-fresh-purged-apps INFINITO_APPS="<role>" INFINITO_FULL_CYCLE=true

# Edit-fix-redeploy loop pinned to that variant:
INFINITO_VARIANT=1 make deploy-reuse-kept-apps INFINITO_APPS="<role>"

Pinning is sticky: when iterating with INFINITO_VARIANT=<idx>, you MUST set it on every command in the iteration. Mixing pinned and unpinned commands silently retargets a different folder. The full semantics (single-folder mode, no inter-round cleanup, out-of-range error) live in variants.md.

Direct CLI Invocation ⚙️

When you need a flag the make wrappers do not expose, call the dev CLI directly:

infinito administration deploy development init   --inventory-dir "${INFINITO_INVENTORY_DIR}" --apps "<role>"
infinito administration deploy development deploy --inventory-dir "${INFINITO_INVENTORY_DIR}" --apps "<role>" [--variant <idx>] [--debug]
  • --inventory-dir is always the BASE path. The wrapper appends the -<round> suffix internally for matrix folders.
  • --variant <idx> pins to one round (same semantics as the INFINITO_VARIANT env-var).
  • The CLI prints the planned folder list at init time and the per-round summary at deploy time, so you can confirm the matrix shape before any work happens.

Inspect Live State 🔍

Use make exec to drop into the running container shell. The repo is mounted at /opt/src/infinito, so code changes are visible immediately. Inspect logs and current state BEFORE redeploying so the failing snapshot stays available.

For TLS-enabled local sites, run make trust-ca once after the first deploy and restart the browser; alternatively use curl -k on the command line.

Reference Files 📌

File Purpose
Makefile All deploy-* and make exec / make trust-ca targets.
dev CLI tree Python CLI for init, deploy, up, down, exec, etc.
make dotenv Resolves INFINITO_INVENTORY_DIR, INFINITO_INVENTORY_FILE, and INVENTORY_VARS_FILE into .env for the dev CLI (see variables.md).
local deploy scripts Bash glue behind the make targets (fresh / reuse / purge variants).
variants.md Matrix-variant deep dive.
role.md Role-iteration loop for agents. Recommended reading even for human contributors.