quine-linux/Taskfile.yml

156 lines
6.3 KiB
YAML
Raw Normal View History

2026-09-26 01:25:14 -08:00
version: '3'
vars:
IMAGE: quine-linux
INSTALLER_IMAGE: quine-installer
COPR_REPO: philip-peterson/quine-anaconda-webui
2026-09-26 01:25:14 -08:00
OUTPUT_DIR: ./output
2026-09-27 02:41:52 -08:00
# Any docker-CLI-compatible runtime works for plain builds. Prefers podman,
# falls back to docker; override with CONTAINER_RUNTIME=... (env or task var).
CONTAINER_RUNTIME:
sh: echo "${CONTAINER_RUNTIME:-$(command -v podman >/dev/null 2>&1 && echo podman || echo docker)}"
# bootc-image-builder now lives in github.com/osbuild/image-builder and is
# published here; quay.io/centos-bootc/bootc-image-builder is frozen.
BIB_IMAGE: ghcr.io/osbuild/bootc-image-builder:latest
SKOPEO_IMAGE: quay.io/skopeo/stable:latest
# bootc-image-builder reads images from a containers-storage mounted at
# /var/lib/containers/storage. Under podman that's root's real store; docker
# has no such store, so images get copied (via skopeo) into this volume.
DOCKER_STORAGE_VOLUME: quine-containers-storage
STORAGE: '{{if eq .CONTAINER_RUNTIME "podman"}}/var/lib/containers/storage{{else}}{{.DOCKER_STORAGE_VOLUME}}{{end}}'
PULL_FLAG: '{{if eq .CONTAINER_RUNTIME "podman"}}--pull=newer{{else}}--pull=always{{end}}'
2026-09-26 01:25:14 -08:00
tasks:
default:
desc: List available tasks
cmds:
- task --list
silent: true
build-image:
desc: >-
2026-09-27 02:41:52 -08:00
Build the quine-linux bootc container image, as root (under podman
this lands in root's containers-storage, which bootc and
bootc-image-builder read; under docker, the ISO tasks copy it over).
2026-09-26 01:25:14 -08:00
cmds:
2026-09-27 02:41:52 -08:00
- sudo {{.CONTAINER_RUNTIME}} build -t {{.IMAGE}} -f Containerfile .
2026-09-26 01:25:14 -08:00
sources:
- Containerfile
- overlay/**/*
- patches/**/*
build-iso:
desc: >-
Build a bootable install ISO from the local quine-linux image, via
bootc-image-builder. Output lands in {{.OUTPUT_DIR}}/bootiso/install.iso.
deps: [build-image]
cmds:
2026-09-27 02:41:52 -08:00
- task: export-to-storage
vars: { IMAGES: "{{.IMAGE}}" }
2026-09-26 01:25:14 -08:00
- mkdir -p {{.OUTPUT_DIR}}
- >-
2026-09-27 02:41:52 -08:00
sudo {{.CONTAINER_RUNTIME}} run --rm --privileged {{.PULL_FLAG}}
2026-09-26 01:25:14 -08:00
--security-opt label=type:unconfined_t
-v {{.OUTPUT_DIR}}:/output
2026-09-27 02:41:52 -08:00
-v {{.STORAGE}}:/var/lib/containers/storage
{{.BIB_IMAGE}}
--type iso localhost/{{.IMAGE}}
2026-09-26 01:25:14 -08:00
generates:
- "{{.OUTPUT_DIR}}/bootiso/install.iso"
build-installer-image:
desc: >-
Build the patched-Anaconda installer-environment container (see
installer/Containerfile and docs/patched-anaconda-installer.md). This
is separate from the quine-linux OS image itself. Defaults to the
{{.COPR_REPO}} COPR project; override with
`task build-installer-image COPR_REPO=you/other-project`.
cmds:
2026-09-27 02:41:52 -08:00
- sudo {{.CONTAINER_RUNTIME}} build -t {{.INSTALLER_IMAGE}} --build-arg COPR_REPO={{.COPR_REPO}} -f installer/Containerfile installer/
sources:
- installer/Containerfile
build-installer-iso:
desc: >-
Build a bootable install ISO using the patched-Anaconda installer
image to install the quine-linux bootc image, via
bootc-image-builder's `bootc-installer` type. Output lands in
{{.OUTPUT_DIR}}/bootc-installer/install.iso. Uses the same COPR_REPO
default/override as build-installer-image.
deps: [build-image]
cmds:
- task: build-installer-image
vars: { COPR_REPO: "{{.COPR_REPO}}" }
2026-09-27 02:41:52 -08:00
- task: export-to-storage
vars: { IMAGES: "{{.IMAGE}} {{.INSTALLER_IMAGE}}" }
- mkdir -p {{.OUTPUT_DIR}}
- >-
2026-09-27 02:41:52 -08:00
sudo {{.CONTAINER_RUNTIME}} run --rm --privileged {{.PULL_FLAG}}
--security-opt label=type:unconfined_t
-v {{.OUTPUT_DIR}}:/output
2026-09-27 02:41:52 -08:00
-v {{.STORAGE}}:/var/lib/containers/storage
{{.BIB_IMAGE}}
--type bootc-installer
--bootc-installer-payload-ref localhost/{{.IMAGE}}
localhost/{{.INSTALLER_IMAGE}}
generates:
- "{{.OUTPUT_DIR}}/bootc-installer/install.iso"
2026-09-27 02:41:52 -08:00
export-to-storage:
internal: true
desc: >-
Under docker, copy IMAGES (space-separated local tags) from the docker
daemon into the containers-storage volume bootc-image-builder reads.
No-op under podman, which builds straight into containers-storage.
status:
- '[ "{{.CONTAINER_RUNTIME}}" = podman ]'
cmds:
- for: { var: IMAGES }
cmd: >-
sudo {{.CONTAINER_RUNTIME}} run --rm --privileged
-v /var/run/docker.sock:/var/run/docker.sock
-v {{.STORAGE}}:/var/lib/containers/storage
{{.SKOPEO_IMAGE}}
copy docker-daemon:{{.ITEM}}:latest containers-storage:localhost/{{.ITEM}}:latest
2026-09-26 01:25:14 -08:00
status:
desc: Show current bootc deployment status (what's booted, what's staged/rollback).
cmds:
- bootc status
test:stage:
desc: >-
Build the local image and stage it as the next-boot target on THIS
machine (bootc switch, no reboot yet). This is the fast way to test a
change -- especially the CS8409 mic-fix kernel module -- against the
real running system without building an ISO or reinstalling anything.
Reboot separately when ready: `task test:boot`, or `sudo systemctl reboot`.
deps: [build-image]
cmds:
2026-09-27 02:41:52 -08:00
# bootc reads the host's own containers-storage, i.e. podman's (which
# every bootc host ships), so a docker-built image is loaded into it.
- cmd: sudo docker save {{.IMAGE}} | sudo podman load
platforms: [linux]
if: '[ "{{.CONTAINER_RUNTIME}}" != podman ]'
2026-09-26 01:25:14 -08:00
- sudo bootc switch --transport containers-storage localhost/{{.IMAGE}}
- bootc status --booted
- echo "Staged localhost/{{.IMAGE}} for next boot. Run task test:boot when ready to reboot into it."
test:boot:
desc: Stage the local image (if not already) and reboot into it now.
prompt: This will reboot this machine into the locally-built {{.IMAGE}} image. Continue?
deps: [test:stage]
cmds:
- sudo systemctl reboot
revert:
desc: >-
Roll back to the previously-booted deployment and reboot into it --
undoes a `test:boot` switch (or any other deployment change) if
something's wrong. Safe even if nothing was ever switched: bootc/
rpm-ostree always keep the prior deployment around for exactly this.
prompt: This will reboot this machine back into the previous deployment. Continue?
cmds:
- sudo bootc rollback
- sudo systemctl reboot