mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-08 03:38:23 +00:00
Thread a single `variant` selector (CSV) end-to-end so CI can split a
role's matrix deploy across runners.
- variant_select.py (SPOT, shared by init + deploy): one --variant taking
a CSV (2 pins one round, 0,1,2 is a runner bundle, empty = full matrix);
replaces the old separate --variant/--variants.
- planner.filter_plan_to_variants filters the plan to a round subset.
- CI discovery (utils/github/variant_bundles.py) splits roles with more
than INFINITO_VARIANT_BUNDLE_SIZE (default 3) variants into bundles of
consecutive indices, one matrix runner each (5 -> 0,1,2 + 3,4), threaded
via the variant env. test-deploy-{local,universal,workstation,server}.yml
switch to matrix.include with a comma-free variant_slug for artifact/job
names (GitHub expressions have no replace()).
- runtime_budget honours INFINITO_VARIANT_TIME_OVERFLOW (cut|fail) when a
runner cannot finish its slice within INFINITO_MAX_RUNTIME.
Unit tests + docs (variants.md, deploy.md) included.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
57 lines
2.4 KiB
Python
57 lines
2.4 KiB
Python
"""SPOT for development inventory creation.
|
|
|
|
Anything that wants to materialise the development inventory MUST go
|
|
through :func:`build_dev_inventory` (single folder) or
|
|
:func:`build_dev_inventory_matrix` (one folder per matrix-deploy round).
|
|
Both flow through :class:`DevInventorySpec` and own:
|
|
|
|
* the SPOT vars-file (``DEV_INVENTORY_VARS_FILE``),
|
|
* per-app variant baking (each role's ``meta/variants.yml`` is resolved
|
|
at build time and emitted as ``applications.<app>`` overrides into
|
|
the inventory's ``host_vars``, with variant 0 as the fallback for
|
|
every role that is not a primary in the current matrix round),
|
|
* the vault password file.
|
|
|
|
The deploy wrapper consumes :func:`plan_dev_inventory_matrix` to know
|
|
which folder to deploy against in each round; the planner is a pure
|
|
function so wrapper and init step compute the same plan independently.
|
|
|
|
Internal layout (one module per responsibility):
|
|
|
|
* :mod:`.spec` — :class:`DevInventorySpec` + ``PlanEntry`` type
|
|
* :mod:`.payload` — variant payload pick + ``--vars`` bake
|
|
* :mod:`.legacy_resolver` — ``CombinedResolver``-driven include resolution
|
|
* :mod:`.planner` — :func:`plan_dev_inventory_matrix`
|
|
* :mod:`.builder` — :func:`build_dev_inventory` + matrix orchestrator
|
|
|
|
The private helpers (``_resolve_round_include`` and friends) are
|
|
re-exported below because unit tests historically patch them under this
|
|
package path. New tests SHOULD patch the submodule path directly
|
|
(e.g. ``inventory.legacy_resolver._resolve_round_include``).
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from .builder import build_dev_inventory, build_dev_inventory_matrix
|
|
from .legacy_resolver import _build_services_overrides_for_round, _resolve_round_include
|
|
from .payload import _bake_overrides, _resolve_variant_payloads
|
|
from .planner import filter_plan_to_variants, plan_dev_inventory_matrix
|
|
from .spec import DevInventorySpec, PlanEntry
|
|
|
|
# Private helper names appear in `__all__` to silence ruff's F401
|
|
# "unused import" — they are re-exported here so tests that historically
|
|
# import them from the package root keep working. New tests SHOULD patch
|
|
# the submodule path directly rather than the re-export.
|
|
__all__ = [
|
|
"DevInventorySpec",
|
|
"PlanEntry",
|
|
"_bake_overrides",
|
|
"_build_services_overrides_for_round",
|
|
"_resolve_round_include",
|
|
"_resolve_variant_payloads",
|
|
"build_dev_inventory",
|
|
"build_dev_inventory_matrix",
|
|
"filter_plan_to_variants",
|
|
"plan_dev_inventory_matrix",
|
|
]
|