The fork (quine/quine-anaconda-webui on forge.quinefoundation.com) now builds its RPM with Forgejo Actions and publishes it to the quine org's package registry. The installer image adds that repo with priority=10 so it wins over Fedora's anaconda-webui, verifies Forgejo's signed repo metadata (the RPMs themselves are unsigned), and the Taskfile passes the repo metadata checksum as a build arg so a newly published RPM busts the cached dnf layer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4.7 KiB
Patched Anaconda installer
How to get a forked/patched Anaconda into the install ISO, instead of the stock Fedora one.
Why this needs a second container
task build-iso (the existing task) builds the ISO straight from RPMs via
bootc-image-builder's iso type -- there's no separate place to inject a
custom Anaconda build.
bootc-image-builder's bootc-installer type is different: it takes two
containers -- an "installer environment" container that has Anaconda
installed in it, and (via --bootc-installer-payload-ref) the actual OS to
install. The installer environment is just a container you build with a
Containerfile, so that's the hook: build your own installer image with
your patched Anaconda dnf installed instead of Fedora's, and point
bootc-image-builder at it.
installer/Containerfile in this repo is that installer environment. It's
unrelated to the quine-linux OS image built by the root Containerfile --
Anaconda only exists in this side container, never in the installed system.
Which Anaconda to fork
Fedora's anaconda package resolves to one of two UIs depending on the
image's release-identity package: anaconda-gui (old GTK hub-and-spoke) on
server/basic/IoT identities, anaconda-webui (Cockpit + React/PatternFly)
everywhere else. All current upstream feature work happens on the WebUI, so
that's the one to fork:
- https://github.com/rhinstaller/anaconda-webui, forked to https://github.com/philip-peterson/quine-anaconda-webui
installer/Containerfile depends on anaconda-webui explicitly (not just
the bare anaconda metapackage) so the UI doesn't depend on incidentally
matching a release-identity package.
Workflow
-
Fork
rhinstaller/anaconda-webuitophilip-peterson/quine-anaconda-webuion GitHub, make your panel/control changes there. -
Get it built as an RPM your installer container can
dnf install. The fork's own Forgejo Actions workflow does this, as a self-hosted stand-in for COPR:.forgejo/workflows/rpm.ymlruns.forgejo/build-rpm.shin a freshfedora:rawhidecontainer (upstream'smake srpm, thenrpmbuild) and uploads the RPM to the forge's package registry. Setup, once:- Host the fork on
forge.quinefoundation.com(Forgejo Actions only runs for repos on the forge), under the account the package should be published as -- thequineorg by default (quine/quine-anaconda-webui). - Add a repo secret
RPM_UPLOAD_TOKEN: an access token for that account withwrite:packagescope, from a user allowed to publish packages for that org. - The result is served at
https://forge.quinefoundation.com/api/packages/quine/rpm.repo, already wired in as theRPM_REPO_URLdefault inTaskfile.yml. Publishing under a different owner means overridingRPM_REPO_URL=on thetaskinvocations below.
Versioning: the build fetches upstream's tags so
git describeyields e.g.86.3.gabcdef0(3 commits past upstream 86), and the Release is<run number>.quine, so each build is a new version that sorts above Fedora's own. The installer also gives this repo dnfpriority=10, so it wins even when Fedora ships a newer upstream release. - Host the fork on
-
Build the installer image and ISO:
task build-installer-isoThis builds the quine-linux OS image (if needed), builds
installer/Containerfilewith that repo enabled, and producesoutput/bootc-installer/install.iso.RPM_REPO_URL=(empty) builds with stock Fedoraanaconda-webuiinstead. -
Iterate: push a change to your fork, wait for its RPM workflow, rerun
task build-installer-iso. The Taskfile passes a checksum of the repo's metadata into the build, so a newly published RPM invalidates the cacheddnf installlayer and gets picked up.
Local alternative (no forge)
If you'd rather not publish the fork anywhere: build the RPM locally with
mock targeting the same Fedora release/arch as the installer base,
createrepo_c the output into a directory, and either bind-mount that
directory into installer/Containerfile's build context and add it as a
file:// repo, or drop the built RPMs into a dnf localinstall step. This
avoids any external service but means keeping the mock chroot's Fedora
release in sync with the installer base by hand.
Caveats
anaconda-webui's package/dependency structure moves with each Fedora release; ifdnf install anaconda-webuistarts failing, check whatanaconda.spec.inin your fork currently requires.- The installer environment's Fedora release should stay close to whatever
release the actual
quine-linuximage (and thus the ISO's kernel/dracut) is built against, to avoid mismatches between the boot environment and the installed system.