Skip to content

sneak preview: uv, Click, Rich, tui; flavors; Secure Boot?#62

Draft
rpardini wants to merge 77 commits intotinkerbell:mainfrom
rpardini:pr/sneak-preview-uv-Click-Rich-tui-flavors-Secure-Boot
Draft

sneak preview: uv, Click, Rich, tui; flavors; Secure Boot?#62
rpardini wants to merge 77 commits intotinkerbell:mainfrom
rpardini:pr/sneak-preview-uv-Click-Rich-tui-flavors-Secure-Boot

Conversation

@rpardini
Copy link
Copy Markdown
Member

@rpardini rpardini commented Apr 8, 2026

sneak preview: uv, Click, Rich, tui; flavors; Secure Boot?

  • 🍀 docker/mkosi: let /work be a regular directory, and mount specific files and dirs instead
    • this avoids remote-fs errors in mkosi when running against remote Docker daemon (eg: colima, Docker Desktop)
    • no, one can't simply mount tmpfs to /work/mkosi.tools -- mkosi wants to be able to delete it
    • ideally, mkosi.output (a misnomer?) would also be shared across invocations using a Volume (not yet though)
  • 🌱 uv: pyproject.toml: add missing version field
    • so one can use uv run build.py without worrying about deps
  • 🌿 docker/mkosi: add /cache/packages Docker Volume for download caching
    • this way we don't overwhelm Debian apt mirrors during development
  • 🐸 python: use standard logging and Rich
    • drop all custom logging infra, standardize on logging
    • introduce Rich for logging & exception handling
    • replace custom progressbar with Rich's
  • 🌵 python: switch to uv everywhere
    • switch from system-breaking pip to fully-contained uv
    • let uv install Python, don't use Debian's -- we get a single Python version for free
    • also: use Docker buildx explicitly; use plain output
    • build/docs: switch from plain Python+pip to uv; mention 3.13 instead of 3.10
    • consolidate usage of pyproject.toml; drop old requirements-dev.txt and requirements.txt
    • docker: run in interactive mode (tty) if isatty(), pass TERM/COLUMNS env
    • docker: prime uv's caches during Dockerfile build
  • 🌳 gha: better all around GHA logging with colors and wide output
    • gha/docker: force Rich colored 160-wide console under GHA
      • pass down GITHUB_ACTIONS env so children can know
    • gha: reduce apt verbosity drastically with Dpkg::Use-Pty=0
  • 🌴 gha: bump to cache restore/save v5 and download/upload-artifact v6
    • so gha stops complaining about Node.js 20
  • 🍃 README.md: show uv install instructions and fix log.py and init.py
  • 🍀 captain: fix .isEnabledFor(logging.DEBUG) calls
  • 🌱 captain: force type console in init.py
  • 🌿 captain: catch required arg and loosen type (WiP: other way around.)
  • 🐸 captain: util: Rich rule's separating run() output
  • 🌵 captain: better logging; in-docker: prefix
  • 🌳 captain: add .editorconfig matching ruff
    • .editorconfig for shell scripts and shell templates
  • 🌴 docker/mkosi: mount a Docker Volume at /work, so mkosi can cache the tools tree across invocations
  • 🍃 util: use a Panel to log the full subprocess command line
  • 🍀 captain: introduce Config build_kernel boolean
    • this will allow using a generic/distro kernel instead of building one
  • 🌱 WiP: use linux-image-generic distro kernel
    • hack until it uses the mkosi-supplied kernel for everything
    • artifacts: look for mkosi-supplied vmlinuz first
  • 🌿 gha: skip all kernel stuff
    • self-built kernel from source will come back at a later stage, as a .deb package
  • 🐸 gha: single matrix except for combined amd64/arm64 image at the end
    • just do everything at once
  • 🌵 mkosi.conf: just use tiny-initramfs instead of blocking the others (dracut/initramfs-tools)
  • 🌳 mkosi.finalize: export DTBs for arches that have them
    • also: show info about modules and full rootfs
  • 🌴 artifacts: collect dtb mkosi.output folder into out/
  • 🍃 publish: publish DTBs in OCI image as a directory
  • 🍀 kernel: drop all kernel-build related code
    • later to be reborn as standard apt package
  • 🌱 mkosi.finalize: drop kernel sound/media/net-wireless modules
    • mkosi.finalize: clean up logging a bit
    • mkosi.postinst: debugs
  • 🌿 gha: introduce FLAVOR_ID (nee KERNEL_VERSION) gha: fix
  • 🐸 release: include cfg.kernel_version as suffix to all tags
  • 🌵 gha: bump external actions so GHA stops complaining about Node 24
  • 🌳 gha: pass DEFAULT_FLAVOR_ID as KERNEL_VERSION for publish-combined gha: pass DEFAULT_FLAVOR_ID as KERNEL_VERSION for publish-combined - retry
  • 🌴 captain/gha: KERNEL_VERSION (et al) is now FLAVOR_ID
    • --flavor-id
  • 🍃 captain: cleanups / doc updates WiP (drop kernel build-related)
  • 🍀 captain: DEFAULT_FLAVOR_ID = "trixie-full"
  • 🌱 flavors: introduce flavors but logging sucks and no dataclass better, logging still sucks for Full -> Common much better in-package this sucks less cosmetics some static and template rendering and hardcoded cleanup kinda-works kinda works
  • 🌿 gha: add trixie-rockchip64 flavor
  • 🐸 stages: show what tools_mode is running
  • 🌵 gha: pass --arch to build.py build
  • 🌳 common_debian: add 01nopty with Dpkg::Use-Pty "0"; to mkosi sandbox tree
  • 🌴 captain: add support for mkosi skeleton tree
    • gha: still trying to fix dpkg/apt output in gha
    • this went nowhere, but hindsight is 20/20
  • 🍃 common_debian: common bash header with logging, sprinkle some dust on postinst and finalize
  • 🍀 mkosi.conf: output a JSON manifest
  • 🌱 mkosi.conf: force tools tree to be Debian Trixie
    • mkosi defaults to 'testing'
  • 🌿 mkosi.conf: use sandbox tree also for tools tree
  • 🐸 flavor: ensure flavor supports requested architecture
  • 🌵 flavors: cleanup a bit
  • 🌳 flavors/gha: introduce meson64 flavor
  • 🌴 docker: never interactive, never a terminal
  • 🍃 cli/flavor: pass Flavor down to build and initramfs cmds; introduce BaseFlavor::has_iso()
    • so only the fully UEFI/ACPI flavor gets ISOs by default
    • they don't make sense for DeviceTree flavors
  • 🍀 gha/docker: set and pass down FORCE_COLOR=1
  • 🌱 captain: don't shorten out logging record name
  • 🌿 buildah: take env BUILDAH_INSECURE=1 for --tls-verify=false
    • so one can use an HTTP local registry:2 for testing pushes
  • 🐸 release: pass flavor down to release, avoid releasing iso for !has_iso
  • 🌵 cli: new cli under click_cli
    • add to pyproject.toml, thus uv run captain ...
  • 🌳 click: add tools command
    • using captain.cli._stages
  • 🌴 click: some sugar, list available flavors via reflection
  • 🍃 docker: build_builder(): more info
  • 🍀 click: kill old tools cli (keep stage) click: kill old cli completely
  • 🌱 click: add iso command back
    • as it is called internally via docker
  • 🌿 gha: switch to click cli
  • 🐸 gha: release-publish
  • 🌵 captain: rework obtain_builder
  • 🌳 gha: separate build-dockerfile arch-based matrix job
  • 🌴 captain: adapt to options moved to common
  • 🍃 captain: simplify Rich logging and trace handler captain: simplify Rich logging and trace handler; let's not have two click packages
  • 🍀 gha: force tools to run native
  • 🌱 docker/Dockerfile: consolidate single Dockerfile; split and balance layers to optimize for parallel pulls
  • 🌿 docker: rework re-launching inside docker & docker envs
  • 🐸 docker/mkosi: get rid of tools tree; back to Debian's trixie system Python + pip for mkosi
    • mkosi re-launches itself and ignores uv's env without a tools tree
    • uv instead does use the system Python if it matches constraints
    • build in /work in Dockerfile, allows to reuse .venv
    • don't mount a volume in /work, instead use the one provided by the Dockerfile
  • 🌵 captain: honor FORCE_COLOR=1 for internal logging
  • 🌳 flavors: tighten semantics, refactor
    • refactor add_static_dir() into BaseFlavor
    • make has_iso() abstractmethod at BaseFlavor level
    • make kernel_packages() abstractmethod at common-debian level
  • 🌴 flavors: introduce common-acpi, move acpi/impi stuff there
    • so it's common-debian > common-acpi > trixie-full
    • in the future: common-debian > common-acpi > trixie-mainline
    • common-acpi implements has_iso() as True
  • 🍃 click: introduce CliContext and reuse common options via @click.Group
    • CliContext is a Config factory, taking both common and specific options
    • actually implement --verbose, thus new default logging level is INFO
  • 🍀 captain: make Rich richer
    • show Locals
    • show all frames in traces
    • use Highlights for FORCE_COLOR=1
  • 🌱 captain: introduce Trogon(/Textual) to auto-create a TUI from Click
  • 🌿 gha: use envvars, not --options
    • reduce suffering while I juggle Click
  • 🐸 captain: even Richer Rich
    • uv: split Config::verbose_uv from --verbose/Logging.DEBUG; use --quiet otherwise
    • use shutil.get_terminal_size to obtain and pass-down-Docker COLUMNS
    • nicer logging format, use a whale emoji for in-Docker logs
    • show Rich Table with Docker environment vars if --verbose
    • show Rich Panel and Rich Syntax for util.run() if --verbose
  • 🌵 gha: don't upload .iso as part of initramfs artifact
    • we've a separate artifact for .iso

rpardini added 30 commits April 8, 2026 23:56
…les and dirs instead

- this avoids remote-fs errors in mkosi when running against remote Docker daemon (eg: colima, Docker Desktop)
- no, one can't simply mount tmpfs to `/work/mkosi.tools` -- mkosi wants to be able to delete it
- ideally, `mkosi.output` (a misnomer?) would also be shared across invocations using a Volume (not yet though)

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- so one can use `uv run build.py` without worrying about deps

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- this way we don't overwhelm Debian apt mirrors during development

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- drop all custom logging infra, standardize on logging
- introduce Rich for logging & exception handling
- replace custom progressbar with Rich's

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- switch from system-breaking `pip` to fully-contained `uv`
- let `uv` install Python, don't use Debian's -- we get a single Python version for free
- also: use Docker buildx explicitly; use plain output
- build/docs: switch from plain Python+pip to uv; mention 3.13 instead of 3.10
- consolidate usage of pyproject.toml; drop old requirements-dev.txt and requirements.txt
- docker: run in interactive mode (tty) if isatty(), pass TERM/COLUMNS env
- docker: prime `uv`'s caches during Dockerfile build

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- gha/docker: force Rich colored 160-wide console under GHA
  - pass down GITHUB_ACTIONS env so children can know
- gha: reduce apt verbosity drastically with `Dpkg::Use-Pty=0`

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- so gha stops complaining about Node.js 20

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- .editorconfig for shell scripts and shell templates

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
…tools tree across invocations

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- this will allow using a generic/distro kernel instead of building one

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- hack until it uses the mkosi-supplied kernel for everything
- artifacts: look for mkosi-supplied vmlinuz first

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- self-built kernel from source will come back at a later stage, as a .deb package

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- just do everything at once

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
…racut/initramfs-tools)

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- also: show info about modules and full rootfs

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- later to be reborn as standard apt package

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- mkosi.finalize: clean up logging a bit
- mkosi.postinst: debugs

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
gha: fix
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
gha: pass DEFAULT_FLAVOR_ID as KERNEL_VERSION for publish-combined - retry
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
rpardini added 29 commits April 8, 2026 23:56
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- so one can use an HTTP local `registry:2` for testing pushes

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- add to pyproject.toml, thus `uv run captain ...`

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- using captain.cli._stages

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
click: kill old cli completely
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- as it is called internally via docker

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
captain: simplify Rich logging and trace handler; let's not have two `click` packages
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
…ayers to optimize for parallel pulls

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
…ython + pip for mkosi

- mkosi re-launches itself and ignores uv's env without a tools tree
- uv instead does use the system Python if it matches constraints
- build in /work in Dockerfile, allows to reuse .venv
- don't mount a volume in /work, instead use the one provided by the Dockerfile

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- refactor add_static_dir() into BaseFlavor
- make has_iso() abstractmethod at BaseFlavor level
- make kernel_packages() abstractmethod at common-debian level

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- so it's `common-debian > common-acpi > trixie-full`
- in the future: `common-debian > common-acpi > trixie-mainline`
- common-acpi implements `has_iso()` as True

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- CliContext is a Config factory, taking both common and specific options
- actually implement --verbose, thus new default logging level is INFO

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- show Locals
- show all frames in traces
- use Highlights for FORCE_COLOR=1

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- See https://github.com/Textualize/trogon and https://github.com/Textualize/textual
- this cashes out on the Click / Rich investment

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- reduce suffering while I juggle Click

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- uv: split `Config::verbose_uv` from --verbose/Logging.DEBUG; use --quiet otherwise
- use `shutil.get_terminal_size` to obtain and pass-down-Docker COLUMNS
- nicer logging format, use a whale emoji for in-Docker logs
- show Rich Table with Docker environment vars if --verbose
- show Rich Panel and Rich Syntax for `util.run()` if --verbose

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
- we've a separate artifact for .iso

Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
@rpardini rpardini force-pushed the pr/sneak-preview-uv-Click-Rich-tui-flavors-Secure-Boot branch from 42973f5 to ebf51be Compare April 8, 2026 21:56
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