novolis-os / release.md
Release
Minimal Debian runtime images
dotnetlinuxdebianruntimenovolis
Versioning
Images are versioned by git tag + a manual GitHub Actions release — not NuGet, and not on every merge.
| Artifact | Produced by | When |
|---|---|---|
novolis-os-rootfs.tar.zst | Release workflow | Manual workflow_dispatch only |
novolis-os.qcow2 | same | same |
novolis-os.iso / novolis-os-uefi.img | same (BUILD_ISO=1) | same |
novolis-os-uefi.vhdx | Run-HyperV.ps1 (local convert) | Hyper-V Gen2 on a workstation |
Tag format: vYYYY.M.D or v0.1.0.
CI policy
| Workflow | Trigger | What it does |
|---|---|---|
pull-request.yml | PR → main | Package budget only |
merge.yml | push → main | Package budget only |
release.yml | manual workflow_dispatch | Build rootfs + appliance + UEFI ISO, create GitHub Release + assets |
No automatic rootfs/appliance/ISO/Podman image builds on merge.
Cut a release
- Actions → Release → Run workflow
- Enter tag (e.g.
v0.2.0); optional prerelease - Download assets from the GitHub Release page
# Local equivalent (no GitHub Release):
pwsh -File d:\novolis\novolis-os\scripts\Build-Appliance.ps1No NuGet publish
This repository has kind: os-image and publishes zero packages. Do not add dotnet-merge-publish workflows.
Appliance first boot
- systemd starts.
- Install or copy a Novolis app onto the image (cloud-init / 9p / second disk — operator choice).
- Run under cage, e.g.
cage -- /usr/bin/dotnet /opt/app/App.dll.
Default image does not embed product apps.
Smoke checklist
-
Verify-PackageBudget.ps1exit 0 - Rootfs extracts;
dotnet --inforeports 10.x runtime - Headless
dotnetconsole app runs - Avalonia smoke (optional CI): window opens under cage or nested Wayland
- Raylib smoke (optional): GL context creates
- Podman:
Build-PodmanImage.ps1thenRun-Podman.ps1printsapp=HelloNovolisOs/status=running - QEMU GUI:
Build-Appliance.ps1thenRun-Qemu.ps1shows Avalonia HelloNovolisOsGui - UEFI ISO:
Run-Iso.ps1(OVMF) reaches GRUB → cage → app; USB flash boots with Secure Boot off - Hyper-V:
Run-HyperV.ps1(elevated) Gen2 Secure Boot off → GRUB → cage