mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-08 19:56:53 +00:00
An inventory group web-app-cst-<name> with applications.<id>.custom: true and
a pinned source {url, version, path} is pulled into roles/ before the play,
read raw (Jinja, Ansible tags and credential URLs refused), placed through a
staging directory under an exclusive lock, and owned by a marker that names
its own directory, so a pull or roles-clean never replaces or removes a
directory it did not place and a failed pull leaves roles/ as it was.
Directory inventories, host lists and non-UTF-8 files behave as Ansible
reads them; generated test deploys pass --skip-pull. make roles-pull,
roles-clean and roles list, INFINITO_EXTRA_MOUNTS for local sources, the
web-app-cst category, the reserved prefix lint and a central
repository_files() that also yields the gitignored custom roles let every
lint scan them like in-tree roles. Supersedes the uncommitted 045 External
Roles draft and reuses its fetch, sync and mount design.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
60 lines
2.1 KiB
Python
60 lines
2.1 KiB
Python
from __future__ import annotations
|
|
|
|
import os
|
|
|
|
from utils.distros import distro_names
|
|
|
|
VALID_DISTROS: tuple[str, ...] = distro_names()
|
|
|
|
|
|
def compose_file_args() -> list[str]:
|
|
"""Compose `-f` flags shared by up and down flows.
|
|
|
|
Each override is gated on the resource it needs being present, not on the
|
|
instance slot: an override whose `:?` guard is unsatisfied would abort the
|
|
stack outright, so a checkout that was never handed a shared git dir or
|
|
cache network simply does not layer that file in.
|
|
"""
|
|
from .extra_mounts import parse_mounts, write_mounts_override
|
|
from .profile import Profile
|
|
|
|
profile = Profile()
|
|
out = ["-f", "compose.yml"]
|
|
if profile.shared_git_dir():
|
|
out += ["-f", "compose/worktree.override.yml"]
|
|
if profile.cache_stack_enabled():
|
|
out += ["-f", "compose/cache.override.yml"]
|
|
if profile.shared_cache_network():
|
|
out += ["-f", "compose/cache.shared.override.yml"]
|
|
if (os.environ.get("INFINITO_PUBLISH_PORTS") or "").strip().lower() == "false":
|
|
out += ["-f", "compose/noports.override.yml"]
|
|
if profile.image_mirror_enabled():
|
|
from utils.cache.files import PROJECT_ROOT
|
|
|
|
from .runner_mirror import write_override
|
|
|
|
out += ["-f", write_override(PROJECT_ROOT, out[1::2])]
|
|
mounts = parse_mounts(os.environ.get("INFINITO_EXTRA_MOUNTS") or "")
|
|
if mounts:
|
|
from utils.cache.files import PROJECT_ROOT
|
|
|
|
out += ["-f", write_mounts_override(PROJECT_ROOT, mounts)]
|
|
return out
|
|
|
|
|
|
def resolve_distro() -> str:
|
|
"""Return INFINITO_DISTRO; raise SystemExit if missing or invalid."""
|
|
distro = os.environ["INFINITO_DISTRO"].strip()
|
|
if not distro:
|
|
raise SystemExit(
|
|
"INFINITO_DISTRO is not set. Run 'make dotenv' (or source scripts/meta/env/load.sh) "
|
|
f"or export INFINITO_DISTRO=<{'|'.join(VALID_DISTROS)}> "
|
|
"before invoking cli.administration.deploy.development."
|
|
)
|
|
if distro not in VALID_DISTROS:
|
|
raise SystemExit(
|
|
f"INFINITO_DISTRO={distro!r} is not a valid distro. "
|
|
f"Valid: {', '.join(VALID_DISTROS)}."
|
|
)
|
|
return distro
|