Skip to content

feat(appliance): ADR-119 config-delivery model + OVA bootstrap-seed publishing#531

Merged
aaronsb merged 3 commits into
mainfrom
feat/appliance-ova-publishing
Jun 16, 2026
Merged

feat(appliance): ADR-119 config-delivery model + OVA bootstrap-seed publishing#531
aaronsb merged 3 commits into
mainfrom
feat/appliance-ova-publishing

Conversation

@aaronsb

@aaronsb aaronsb commented Jun 16, 2026

Copy link
Copy Markdown
Owner

What

Two linked pieces toward deploying the appliance the way a normal person would — download an OVA, import it, run it.

ADR-119 — appliance configuration delivery & first-boot orchestration (Draft)

Settles the design we'd been circling:

  • Presence-driven first boot (the autoinstall/kickstart convention): a config artifact's presence decides headless-apply vs. a zero-config first-run — no countdown, no mode flag at the image level.
  • Rich config moves post-boot to the always-reachable console (DCUI) + operator warm path (set-hostname/set-tls/set-dns-creds, follow-on). This is the pfSense/TrueNAS shape.
  • Carrier = stock cloud-init NoCloud vfat cidata volume — cloud-init is the reader; no bespoke discovery, no signature file. KG_PROVISION_SCHEMA covers forward-compat.
  • Deliberately minimizes novelty — every primitive is load-bearing in shipping appliances (Ubuntu autoinstall, OVF vApp properties, GRUB-style consoles). The "minimize novelty" lens deleted a whole custom layer (reader + signature + tty1 gymnastics + countdown).
  • Corrects ADR-104's appliance interactivity row; cross-refs ADR-103 (convergence) + ADR-104 (claim).

publish.sh appliance — OVA as a bootstrap-seed release asset

Automates the previously-manual "attach the OVA to a Release by hand" step (per the appliance README): build OVA → xz the qcow2 → SHA256SUMSgh release upload --clobber.

Convergence contract (ADR-103): the OVA is a thin bootstrap seed — download once, run, then operator.sh upgrade keeps it current via GHCR images. The container images are the per-release artifacts; the OVA is republished only occasionally to move the baseline. So the command is decoupled from release by design. Adds make publish-appliance.

Test

  • bash -n scripts/publish.sh ✓; ./publish.sh appliance --dry-run exercises the build/checksum/guard path.
  • docs/scripts/adr lint → 0 errors / 0 warnings; INDEX regenerated.

Note

This is design + the publishing tooling. The first-boot orchestration changes (no-config → real first-run) and the operator set-* warm-reconfig verbs are follow-on implementation tracked by ADR-119.

aaronsb added 3 commits June 16, 2026 11:15
Presence-driven first boot (autoinstall/kickstart convention): a config
artifact's presence decides headless-apply vs zero-config first-run; rich
config (hostname/TLS/DNS creds) moves post-boot to the DCUI + operator warm
path. Carrier is a stock cloud-init NoCloud vfat 'cidata' volume — no bespoke
reader, no countdown, no signature file. Deliberately minimizes novelty to
match familiar appliance shapes (pfSense/TrueNAS/OVF). Cross-refs ADR-104
(claim) and ADR-103 (convergence: OVA is a bootstrap seed, currency via
operator upgrade). Corrects ADR-104's appliance interactivity row.
… asset

Automates the previously-manual 'attach the OVA to a Release by hand' flow:
builds the OVA, xz-compresses the qcow2, writes SHA256SUMS, and uploads to the
matching GitHub release (gh release upload --clobber). Decoupled from 'release'
on purpose — the OVA is a thin bootstrap seed (ADR-103/ADR-119), republished
occasionally to move the baseline, while per-release currency flows through GHCR
images + operator upgrade. Adds 'make publish-appliance' and refreshes the
appliance README to document the convergence contract.
…dry-run

- Always recompress the qcow2 (drop the stale-.xz guard that would re-publish
  old bytes under a fresh checksum on a same-VERSION rebuild) [H1/H2]
- Dry-run reports intent only; no xz, no SHA256SUMS write [L3]
- Only publish a .xz when a source qcow2 exists this run (OVA-only --skip-build
  ships just the OVA) [H2]
- Upload SHA256SUMS last as the commit marker; add a verify hint [M3]
- Comment the release-minting decoupling [M2]
- ADR-119: soften the OVF empty-slot claim to future tense + follow-on note [M1]
@aaronsb aaronsb merged commit c98ff32 into main Jun 16, 2026
6 checks passed
@aaronsb aaronsb deleted the feat/appliance-ova-publishing branch June 16, 2026 16:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant