You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Key-based (cosign --key env://COSIGN_PRIVATE_KEY, cosign.pub in repo)
Keyless (cosign via OIDC — no secrets, no key file)
Multi-arch
x86_64 only
Input wired (disabled: # FIXME: enable when akmods has ARM)
Push strategy
Push each tag via podman
Two-push pattern + skopeo copy server-side tag copies
Runner Podman
Stock Ubuntu 24.04
Upgraded from Ubuntu 25.04 resolute (annotation fix)
Just install
Homebrew on runner
taiki-e/install-action (faster, no brew dep)
PR rechunk
Always rechunks
Skips rechunk; exports OCI dir for local testing
Digest output
None
collect-digests job aggregates per-image digests
Desktop testing
None
E2E via projectbluefin/testsuite (QEMU + AT-SPI)
Renovate
Org-level config (hosted)
Self-hosted via projectbluefin/renovate-config + automerge workflow
Containerfile
Near-identical architecture (ublue: 48 lines, projectbluefin: 47 lines): multi-stage build from common + brew OCI layers → single RUN --mount build step → bootc container lint.
Critical difference: The base image source diverges:
ublue-os: FROM ghcr.io/ublue-os/silverblue-main:42 — depends on ublue's own reprocessed upstream image
projectbluefin: FROM quay.io/fedora-ostree-desktops/silverblue:43@sha256:... — builds directly on Fedora's official image with a digest pin
This eliminates a dependency on the ublue-os/main-images pipeline and gives projectbluefin full control over its supply chain. The digest pin in the Containerfile ARG (managed by Renovate) ensures reproducibility without an intermediate reprocessing layer.
2. Feature Differences
Workflows added in projectbluefin/bluefin
Workflow
Lines
Status
build-image-testing.yml
34
✅ Running, green
post-testing-e2e.yml
52
✅ Running (last run: failed)
weekly-testing-promotion.yml
197
✅ Running
e2e-dispatch.yml
161
✅ Triggered (skips when no matching event)
cherry-pick-to-stable.yml
48
✅ Present on main
renovate-automerge.yml
49
✅ Running, recently fixed (#51)
pr-validation.yml
44
✅ Required for merge queue
Removed vs baseline
Removed
Notes
build-image-beta.yml
Beta stream eliminated
cosign.pub
Keyless = no public key file
ublue-os/silverblue-main dependency
Builds on Fedora direct — eliminates ublue-os/main-images pipeline dependency
Key property: Runs on standard ubuntu-latest GitHub Actions runners. No self-hosted hardware. The OCI image boots in a KVM-accelerated QEMU VM, a GNOME session starts, and behave tests exercise it via AT-SPI accessibility tree and SSH.
Test stack
Layer
Tool
Purpose
BDD runner
behave
Gherkin .feature scenarios
Session bridge
qecore-headless
Wayland/DBus session bootstrap in QEMU
GUI automation
dogtail (AT-SPI)
Accessibility-tree clicks, reads, asserts
Shell bridge
org.gnome.Shell.Eval
GNOME 50+ JS eval for top-bar/overview
VM runtime
QEMU + KVM
Boots OCI image as real VM on GHA runners
Test coverage — 255 scenarios across 12 suites
Suite
Scenarios
Validates
smoke
82
GNOME Shell (AT-SPI tree, top bar, Activities, Quick Settings, lock screen, workspaces), app launches (Firefox, Files, Calculator, Settings, Text Editor), regressions
Both repos use the same just build recipe pattern:
# Local build (identical interface)
just build bluefin latest main
# CI build (identical interface, requires sudo)
sudo just build-ghcr bluefin testing main
projectbluefin/bluefin adds:
just check — validates all .just file syntax
just fix — auto-formats .just files
PR validation runs just check && shellcheck build_files/**/*.sh && pre-commit run --all-files in ~2 minutes (vs 40-minute full build)
Developer workflow difference
Step
ublue-os/bluefin
projectbluefin/bluefin
Pre-push validation
pre-commit run (basic)
just check && pre-commit run --all-files (lint + actionlint + shellcheck)
PR feedback time
~40 min (full image build)
~2 min (pr-validation.yml) + optional full build if image paths changed
PR testing
Build artifact only
OCI dir artifact + /e2e command for desktop testing
reusable-build.yml — projected section replacement (estimated, not yet validated)
Action
Lines removed
Lines added (uses: + inputs)
Net
setup-runner
7
5
−2
dnf-cache
55
11
−44
rechunk
26
7
−19
generate-tags
28
8
−20
push-image
80
8
−72
sign-and-publish
63
6
−57
Total
259
45
−214
After adoption (estimated):reusable-build.yml drops from 422 → ~208 lines (−51%). This is a projection based on replacing identified sections with action calls; not yet implemented or validated in production.
bluefin-lts (CentOS-based)
Component
ublue-os/bluefin-lts
projectbluefin/bluefin-lts (current)
After actions (est.)
Workflows
1,376 (14 files)
1,175 (11 files)
~961
↳ reusable-build-image.yml
573
583
~369
Containerfile
45
47
47
Justfile
412
413
413
CI+Build Total
1,833
1,635
~1,421
Δ vs baseline
—
−198 (−11%)
−412 (−22%)
Cross-repo savings when projectbluefin/actions is consumed (projected)
Metric
Current state
After actions adoption
bluefin workflow SLOC
1,365
~1,151 (−214)
bluefin-lts workflow SLOC
1,175
~961 (−214)
Combined per-repo savings
—
~428 lines removed from workflows
Shared actions (maintained centrally)
0
801 lines
Per-repo workflow surface
1,270 avg
~1,056 avg (−17%)
Note: This reduces per-repo workflow maintenance surface, not total org code. The 801 lines move into a shared repo maintained once rather than duplicated.
If ublue-os/bluefin adopted the same actions
Current
After actions
reusable-build.yml
332
~161 (−171)
Total workflows
729
~558 (−23%)
6. Sustainability & Maintenance
✅ Implemented and operational
Capability
Evidence
Fedora-direct base image
Containerfile: quay.io/fedora-ostree-desktops/silverblue:43@sha256:... — no ublue-os/main-images dependency
Keyless signing
No cosign.pub, no SIGNING_SECRET in workflows
E2E gating
post-testing-e2e.yml → testsuite pin @05445e0
Weekly promotion
weekly-testing-promotion.yml — refuses to promote without passing e2e
Merge queue
Branch protection requires validate status
Path-filtered PR builds
dorny/paths-filter in build-image-testing.yml
Renovate automerge
Operational, patched for mergeraptor (#51)
PR OCI artifacts
podman save --format oci-dir for local bootc switch testing
Duration tracking for build/rechunk/push in step summary
Self-hosted Renovate
projectbluefin/renovate-config — GitHub App auth, no PATs
❌ Defined but NOT consumed (aspirational)
Capability
Status
Projected benefit
projectbluefin/actions (9 actions, 801 lines)
Zero consumers
−214 lines/repo, −428 org-wide
ARM builds
Input wired, commented out
Multi-arch when akmods ready
Operational health (sampled 2026-05-31)
Repo
Status
Notes
ublue-os/bluefin stable builds
❌ Last 5 runs: 4 failed, 1 action_required
May be temporary (upstream dep)
projectbluefin/bluefin testing builds
✅ Last 5 runs: 4 succeeded, 1 cancelled
projectbluefin/bluefin post-testing-e2e
⚠️ Last completed run: FAILED
Test suite stabilizing
projectbluefin's promotion model means a failing e2e blocks untested images from reaching stable. ublue-os lacks an automated desktop E2E gate — failures are caught at build time or by users, depending on failure mode.
projectbluefin — 255-scenario desktop test suite, promotion gate
Developer velocity
projectbluefin — 2-min PR validation vs 40-min full build
Operational resilience
projectbluefin — stable protected from upstream breakage by design
Code economy (today)
ublue-os — 2,671 vs 3,344 CI+build lines (+25% in projectbluefin)
Code economy (after actions)
Closer — 2,671 vs ~3,130 (+17%)
Reusability (actual)
Neither — actions exist but aren't wired
Reusability (potential)
projectbluefin — building blocks ready, −214/repo on adoption
LTS specifically
projectbluefin — already leaner (−11%), −22% after actions
Bottom line
projectbluefin/bluefin trades +25% more CI/build code for:
Eliminated upstream dependency — builds on Fedora direct, not ublue-os/main-images
Automated desktop testing (255 scenarios, no self-hosted hardware)
Promotion gates that prevent untested images from reaching users
1–2 minute PR lint feedback instead of 40-minute full builds for non-image changes
Keyless signing that eliminates secret management
A clear path to −15% overhead once shared actions are wired (today: aspirational)
The additional 636 workflow lines represent distinct operational capabilities — not duplicated boilerplate. The projectbluefin/actions repo (801 lines, 9 actions) would reduce per-repo workflow surface by ~214 lines each, but is not consumed today — its code-saving value is projected, not proven. The primary delivered value is architectural: an independent supply chain building directly on Fedora, a testing-first promotion model, and keyless signing that eliminates secret management entirely.