mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-13 22:26:49 +00:00
A debian:bookworm workspace job died on `apt-get update`: the mounted sources list carried the Ubuntu entry too, Nexus had auto-blocked archive.ubuntu.com, and apt fails the whole update on one bad source. Three holes, three plugs: - One sources list per INFINITO_DISTRO under compose/package-cache/apt/, selected by the compose overrides. A Debian runner no longer fetches an Ubuntu suite it has no use for. The non-apt distros get an empty file so the bind mount has a source to point at. - autoBlock off. While a remote is auto-blocked Nexus answers `404 Remote Auto Blocked` to every client instead of falling back to the copy it already has cached. - Mirror failover in the frontend. Every apt suite gets a second proxy repo on an independent upstream; a 5xx from the primary re-runs the request against it. Nexus has no group repository type for apt, so the retry lives in nginx. Measured on a live Nexus 3.91.1: dead remote without a cached copy answers 502, with a cached copy 200 regardless of metadataMaxAge. The frontend serves 149 kB of real bookworm `Release` from the mirror repo when the primary is dead, and the new regex locations produce upstream request lines byte-identical to the `rewrite … break` form they replace, including `%3a` epochs in pool paths. INFINITO_CACHE_PACKAGE_APT_LIST is gone; the mount interpolates INFINITO_DISTRO directly. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
utils/env 📐
This directory hosts the Python implementation behind make dotenv.
For the general rules that govern READMEs in code directories see documentation.md.
For the per-variable defaults that this code consumes see default.env.
Purpose 🎯
The package converts the committed default.env plus a small runtime context into the gitignored .env at the repo root.
Every module here belongs to one of four roles: parse, resolve, orchestrate, write.
Structure 🗂️
| File | Role |
|---|---|
parser.py |
Read default.env into (values, comments) tuples. |
runtime.py |
Resolve host-context lookups (disk, RAM, hostname, GHA/Act flags, /proc/version, helper-script invocation). |
builder.py |
Thin orchestrator that defines EnvBuilder, BuildContext, and build_env(). Walks the handler registry. |
writer.py |
Serialise an EnvBuilder into a docker-compose-compatible .env on disk. |
handlers/ |
One module per dynamically-computed variable. See handlers README. |
The CLI entry point lives at __main__.py under cli/meta/env/.
Shell consumers source load.sh under scripts/meta/env/.
File Naming 🏷️
- Module names MUST stay lowercase snake_case.
- Pure passthrough or simple parser/writer helpers MUST live directly under
utils/env/. - Per-variable computation MUST live under
handlers/(see handlers README for the naming convention used there). - Test files live in tests/unit/utils/env/ and mirror the module name with a
test_prefix.
Import Rules 🔗
parser.py,runtime.py, andwriter.pyMUST NOT import frombuilder.pyorhandlers/.builder.pyMUST NOT import individual handler modules; it MUST go through theORDERED_HANDLERSlist exposed byhandlers/__init__.py.- Handler modules MUST NOT import each other (see handlers README).