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