Workflow configuration and updates

.github/automation.yml is the source for native runner labels, Python, uv, Syft, and actionlint versions. scripts/workflow_config.py validates it and supplies native architecture runners to the build planner. Literal workflow YAML is rendered from .github/workflow-templates/*.yml.j2.

After changing configuration or a template, run:

uv run --frozen --python 3.14 python -m scripts.container_engine generate-workflow
uv run --frozen --python 3.14 python -m scripts.container_engine generate-workflow --check

CI checks every generated workflow, Python regression tests, and actionlint. Required CI remains the branch-protection check. Treat a runner upgrade as an infrastructure change: both native architecture builds and runtime contracts must pass before merging. Ubuntu 26.04 labels are listed in GitHub's runner inventory. The actionlint compatibility allowlist covers only those two labels until the linter's built-in inventory catches up; successful scheduling and builds are verified by GitHub CI.

Renovate updates canonical tool/runner values and the corresponding literals in generated workflow YAML in the same dependency update. Its custom template manager tracks action tags and commit digests together, alongside the native manager's generated-workflow references. There are no privileged post-upgrade commands. A missed source or generated update fails the generation check rather than silently changing workflow behavior. Manually regenerate on the Renovate branch if an update cannot be represented by its configured managers.

Build and publication boundaries

Each image's reusable publication workflow waits for that image's native builds. A failed image does not block unrelated images. Up to four image workflows run at once, each with at most two architecture builds; PR builds run eight at once. Dependency stages still enforce order. A selected dependency without a valid same-run result causes its dependent build to fail.

build.payload optionally references a private payload manifest. Payload builds are deduplicated by manifest and architecture, with one OCI archive shared by rootful/rootless consumers in the same workflow run. The importer verifies source revision, manifest hash, architecture, and archive hash before importing into local build storage. There is no registry fallback or public release for these payloads. A changed payload must be declared in each consumer's inputs.

Archive transport artifacts last one day; they are intermediate workflow data, not a long-term release record. Public image digests and release evidence are produced by the normal publication and finalization jobs.

Modules

The operations guide maps the current planning, payload, runtime, vulnerability, publication, and maintenance modules to their responsibilities.

  • scripts/container_engine.py: CLI, planning, and workflow orchestration.
  • scripts/workflow_config.py: canonical automation settings.
  • scripts/build_payloads.py: private payload validation and evidence-bound transfer.
  • scripts/promotion.py: publication identity and freshness ordering.

Rollback uses an expected-current-digest guard. Registry tag updates are not an atomic compare-and-swap operation: coordinate manual publishers and queued runs when performing an incident rollback.

View source ↗ Read as Markdown Source updated