Files
computer-playbook/docs/contributing/environment/variables.md
kevinveenbirkenbachandClaude Opus 5.5 1079f48feb fix(env): derive the image and container names from the distro under test
A compose deploy job labelled centos or arch built its stack image from
pkgmgr-debian and ran it as infinito_nexus_debian (#794). distros.sh
exports INFINITO_DISTRO per iteration and sources load.sh again, but the
loader returned early because INFINITO_ENV_LOADED and the .env mtime were
unchanged. A full reload would not have helped either: the debian values
were already exported, so the restore step kept them as caller intent.

load.sh now records the distro it loaded for. Another INFINITO_DISTRO
defeats the early return and drops INFINITO_CONTAINER,
INFINITO_PARENT_IMAGE and INFINITO_IMAGE, the three keys the env handlers
derive from the distro. When the requested distro also differs from the
one .env was generated for, the loader sources a set that
`python -m cli.meta.env --output` generates for it in a private temp
directory and leaves .env untouched, so a local multi-distro run does not
switch the checkout's distro. A caller value set for the loaded distro
still wins.

Verified: tests/unit/python/scripts/meta/env/test_load.py and the new
distros.sh case pass. Against main's loader both fail with the symptom of
the issue: INFINITO_DISTRO=centos next to infinito_nexus_debian and
pkgmgr-debian:stable, and distros.sh handing debian, arch and centos the
same debian parent. shellcheck is clean.

Consequence: CI jobs labelled arch, ubuntu, fedora or centos now build
and deploy that distro, so a failure that shows up there was masked
before.

feature/store-i18n carries 3f973eb137, which resolves the parent image
for scripts/image/push.sh on its own, and 05e4dbafcb, which inserts the
INFINITO_INSTANCE slot check into the block this commit restructures. The
merge keeps the slot check ahead of the distro check.

Closes #794

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 21:30:48 +02:00

3.4 KiB

Environment Variables

The project's environment is owned by a single generator, not scattered across shell modules. Every variable is documented INLINE next to its definition with a one-line # ... comment above the key. This page is just a map of where to look.

Where the defaults live

  • default.env holds the committed defaults for every static key (network defaults like DNS, subnet, gateway, domain included), each preceded by a one-line comment. Edit this file to change a default or to read the per-variable documentation.
  • .env (gitignored) is generated by make dotenv, which delegates to python -m cli.meta.env. It combines default.env with runtime-resolved values (selected distro, GHA/Act flags, df/meminfo-derived cache sizes, sha256 secrets, repository owner, ...). Each line in .env is preceded by its own comment, so the file is self-describing. Open it after make dotenv to inspect the effective value-set together with its documentation.

Regenerating

make dotenv

Override individual values by exporting them before make dotenv. Already-set env vars take precedence over default.env defaults.

Pipeline

  • env/ (under utils/) holds the parser, runtime helpers, writer, and one handler module per dynamically-computed variable under handlers/.
  • env/ (under cli/meta/) provides the CLI entry point invoked as python -m cli.meta.env.
  • load.sh is the shell loader; it sources .env and auto-generates it on a cold clone. When the exported INFINITO_DISTRO differs from the one .env was generated for, it loads a set generated for that distro through python -m cli.meta.env --output <file> and leaves .env as it is.

Variables NOT in default.env

A handful of variables are documented next to their consumer because they cannot have a static default:

  • Driver-injected by make compose-up and the dev CLI (cache override paths like INFINITO_CACHE_REGISTRY_PROXY_CONF, the package-cache config paths, the frontend CA file). See common.py and compose.yml.md.
  • Computed at container start for INFINITO_PATH, set by entry.sh.
  • Persisted on the deploy target for INFINITO_VERSION, written by the sys-version role.
  • Compose literals with no env-side knob, namely GIT_SSL_NO_VERIFY and PYTHONHTTPSVERIFY, documented in compose.yml.md.
  • Fork identity for the operator's CI-redeploy shortcuts: INFINITO_FORK_ACCOUNT (defaults to the local OS username) and INFINITO_FORK_REPOSITORY_URL (composed as https://github.com/$INFINITO_FORK_ACCOUNT/$INFINITO_FORK_REPOSITORY_NAME), both set by handlers under utils/env/handlers/infinito/ (fork_account.py, fork_repository_url.py). The fork repository name itself lives in default.env as INFINITO_FORK_REPOSITORY_NAME.

Role-scoped variables

App-specific container variables live next to the role that owns them, typically in roles/<role>/templates/env.j2, roles/<role>/templates/bootstrap.env.j2, or roles/<role>/templates/playwright.env.j2. They are intentionally NOT centralised here so the app documentation and its generated env file stay in sync.