build
Type
External
Status
Published
Created
Jun 13, 2026
Updated
Jun 13, 2026
Source
View

Build#

Contents#

Prereqs#

ToolCheckInstall / note
justwhich justIf missing: mkdir -p ~/.local/bin && wget -qO- "https://github.com/casey/just/releases/download/1.34.0/just-1.34.0-x86_64-unknown-linux-musl.tar.gz" | tar --no-same-owner -C ~/.local/bin -xz just && export PATH="$HOME/.local/bin:$PATH"
podmanwhich podmanrequired for image + VM builds
gitwhich gitrequired

Fast validation#

just check && just lint
  • Run before every commit.
  • just check validates Just syntax (<30s).
  • just lint runs shellcheck (<10s).

Core builds#

GoalCommandTypical time
Regularjust build bluefin lts 0 0 045-90 min
GDXjust build bluefin lts 0 1 045-90 min
HWEjust build bluefin lts 0 0 145-90 min

The gnome_version parameter defaults to "50". Override only if testing a future GNOME version.

HWE and GDX kernel tracking: For HWE and GDX builds, the Fedora CoreOS stable version is resolved dynamically at build time via skopeo inspect docker://quay.io/fedora/fedora-coreos:stable. This version is used to select the matching coreos-stable-<version> akmods image tag and is passed as FEDORA_AKMODS_VERSION (controls negativo17 Fedora repo for NVIDIA drivers). Override with COREOS_STABLE_VERSION env var if you need to pin:

COREOS_STABLE_VERSION=44 just build bluefin lts 0 1 0 # GDX, force Fedora 44 akmods
COREOS_STABLE_VERSION=44 just build bluefin lts 0 0 1 # HWE, force Fedora 44 akmods

Regular builds continue to use centos-10 akmods and the fedora_akmods_version parameter (default "43") has no effect on HWE/GDX.

Never cancel builds. Use 120+ minute timeouts.

Variant map#

VariantWhat changes
Regularbase LTS image
GDXGPU / AI tooling (NVIDIA)
HWEnewer hardware enablement

VM / disk artifacts#

CommandPurposeTime
just build-qcow2QCOW2 disk from existing local image45-90 min
just rebuild-qcow2Build image then QCOW290-180 min
just build-rawRaw disk image from existing local image45-90 min
just rebuild-rawBuild image then raw disk90-180 min
just build-isoInstaller ISO (delegates to projectbluefin/iso); LTS ISO is disabled for release/promote45-90 min
just run-vm-qcow2Boot QCOW2; web console on http://localhost:8006runtime
just run-vm-rawBoot raw disk imageruntime
just run-vm-isoBoot ISOruntime
just create-test-vm [name] [tag] [ssh-key]Create Lima VM with SSH for debuggingruntime
just run-test-vm [name] [tag]Create and start Lima VM immediatelyruntime

Never run VMs in CI; KVM/graphics are required.

Repo layout for build work#

PathUse
build_scripts/package install + build logic
system_files/base system config
system_files_overrides/variant / arch overrides
Containerfilemain image definition
image.toml, iso.tomlBIB configs

Workflow guardrails key off these exact names. When copying from bluefin, replace build_files/ with build_scripts/ and image-versions.yml with image-versions.yaml.

Services from common — must be explicitly enabled#

Services shipped from projectbluefin/common via systemd presets are not auto-applied during the Containerfile build. Preset files (e.g. 00-rechunker-group-fix.preset) are inert at build time — they only take effect when systemctl preset-all is called, which never happens in the LTS build.

Rule: Every service that common ships and LTS needs must have a matching systemctl enable <service> line in build_scripts/40-services.sh.

Known required enables from common:

ServicePurposeConsequence if missing
rechunker-group-fix.serviceSyncs groups to gshadow before systemd-sysusers for users from legacy-rechunked imagesBlack screen / system will not boot

When adding new services from common, always check whether they arrive via a preset and add the explicit enable. Do not assume the preset file is sufficient.

Debugging checklist#

SymptomCheck
build fails earlyjust check && just lint
missing commandwhich just podman git
package pulls failrepo/network timeout; retry after failure completes naturally
storage errorsrun just clean, verify free disk
permission issuessome build paths require sudo/root; gen-sbom runs as root — sbom_out/ is chowned back to runner after write
NVIDIA driver version mismatch in GDXSet COREOS_STABLE_VERSION=NN to pin; or let it auto-resolve from CoreOS stable

Recovery loop:

just clean
just check && just lint
just build bluefin lts