Tag: Forgejo

  • Horcrux dev log 3: back after nine months, 92 failed CI runs

    Horcrux dev log 3: back after nine months, 92 failed CI runs

    Part 3 in the Horcrux dev log series.

    Backdated, written in November 2026 from git and CI records. Part 2 stopped at an unfinished ISO on December 31, 2025.

    I came back on September 24, 2026 with two goals: get CI to really run, and build Horcrux the Gentoo way.

    The Gentoo goal came from a mistake. At some point the Dockerfile had turned into standard Rust boilerplate: FROM rust, cargo build, FROM debian-slim. It had drifted into boilerplate that ignored what the project is for. I fixed it on September 24 and wrote a rule into the repo notes so it can’t come back. The rule in the repo notes reads:

    A Dockerfile doing FROM rust:* -> cargo build -> FROM debian:*-slim
    is wrong. It is a regression. Fixed once already on 2026-09-24.

    Now the Dockerfile builds through real Portage against the project’s own ebuild, and the ebuild is the canonical install path.

    The numbers

    Pulled from the Forgejo API, September 24 to 30:

    workflow runs: 121
      success 12
      failure 92
      cancelled 11
      skipped 6
    ci.yml: 8 success, 71 failure
    docs.yml: 4 success, 19 failure

    88 commits that week, a lot of them fixes for whatever the last run complained about.

    What kept breaking

    The ebuild first. It depended on virtual/rust, which doesn’t exist (the package is dev-lang/rust), so emerge said “there are no ebuilds to satisfy”. dev-util/trunk doesn’t exist either, so the UI bundler gets installed with cargo during the build. qemu’s REQUIRED_USE says vte? ( gtk ) and I’d enabled vte alone. The Xen tools ebuild in that Gentoo snapshot died in src_prepare on an unset version variable; Horcrux only does KVM, so I dropped the Xen flag instead of fighting it. A pile of qemu and spice USE flags dead-ended in a masked libglvnd, and a headless VM host has no use for audio or GL anyway.

    Then the runners. Actions that weren’t mirrored on the registry my Forgejo uses. upload-artifact v4 not supported (“GHESNotSupportedError”). A runner with a full disk. A clippy step killed by the runner. A 30 minute ephemeral timeout that killed legitimate Gentoo builds. A full emerge that hit a 3 hour limit until I gave the CI image light USE flags. Several commit messages just say “retrigger” because the last failure was the infrastructure and not the code.

    Fake stuff that came out

    Real tests started finding placeholders. The login form wasn’t wired to the auth API. Disk usage in the metrics was a hardcoded 65%; it now reads statvfs. The Kubernetes join code accepted a made-up CA cert hash and now refuses it. HA fencing for IPMI, iLO, iDRAC and SNMP PDUs, parallel volume restore and live-migration pre-flight checks were stubs and got real code on the 30th. I don’t know yet how any of that behaves on actual hardware. release.yml only built x86_64 although the README claimed three architectures, so it now cross-compiles aarch64 and riscv64.

    On the 25th and 26th the API integration suite reached 22 of 22. It’s the first green test run I can find in the history.

    State

    The Gentoo build works in CI with trimmed USE flags, the tests run, and about one run in ten was green. The README still overpromised, and I rewrote its status line on October 21 (part 5).

    Design decisions

    Gentoo first. My reason is freedom to choose. USE flags are the main part: they let an installer choose which virtualization backends, container runtimes and NAS protocols get compiled in, and the repo notes call that the main advantage over Proxmox. Compiling for specific hardware is the secondary reason. For background, I was a Debian developer from 1999 to 2006 and I’ve used Gentoo since. I’m blunt about it in the repo notes: generic Debian or Ubuntu conventions are the wrong default here.

    Dropping Xen. The commit says Horcrux is a headless KVM-only VM host and has no need for Xen guest support. The same reasoning removed audio and GL from qemu: no local display on a headless host.

    Architectures: amd64, arm64 and riscv64. The README dropped ppc64le the same day as out of scope. That’s my call, and I don’t have the reason written down. The riscv64 notes do say it needs real hardware for validation.

    Light USE flags in CI: the full emerge hit a 3 hour limit, so the CI smoke-test image builds with fewer flags. A speed trade, and it means CI doesn’t build the full-feature package.

    Other parts: Part 1, Part 2, Part 4, Part 5, Part 6. The series continues with the latest Horcrux dev log post.

  • Horcrux dev log 2: my own Forgejo, a Gentoo ISO builder, and an ISO that never quite booted

    Horcrux dev log 2: my own Forgejo, a Gentoo ISO builder, and an ISO that never quite booted

    Part 2 in the Horcrux dev log series.

    Backdated, written in November 2026 from the repo history. Part 1 was the first week in October.

    Nothing happened in the repo for two months after the October burst. Then on December 12 there were three commits: “Major platform enhancements and infrastructure cleanup”, “storage, ha, and clustering improvements” and “added forgejo workflows”. The last one matters because I’d decided to host the code on my own Forgejo and run CI on my own runners.

    It didn’t work. Between December 12 and 31 Forgejo recorded nine workflow runs for Horcrux, all of them skipped. The workflows were copied from GitHub Actions and asked for ubuntu-latest, which none of my runners had. A job with no matching runner is skipped, not failed, so nothing showed up red. I’ll come back to that in part 3.

    The big commit

    On the 19th: “Refactor Web UI into modular pages and add Gentoo build system”, 129 files, 47,358 insertions. The UI had been a few enormous page files. Now it’s modules for audit, auth, backup, dashboard, HA, Kubernetes, metrics, monitoring, storage and system. The same commit added a Gentoo/Catalyst ISO build system.

    On the 29th there was a batch of NAS features (SMB and NFS among them) and a CLI output cleanup.

    The ISO commits

    The last commits of the year are all about booting. Five of them:

    c01076e4 Fix ISO build to include kernel and bootloader
      "The ISO builder was creating incomplete ISOs missing critical boot components."
    b5531304 Improve ISO build with initramfs library support and robustness
    385e3e3b Add serial console support to ISO boot configuration
      "Enables boot output visibility when testing in QEMU"
    (Dec 31) Fix ISO boot with kernel modules and proper init system
    (Dec 31) Fix library copying for horcrux binaries in ISO

    So the first version of the builder made ISOs with no kernel and no bootloader. Each commit fixes whatever the last one exposed: kernel and GRUB, then initramfs libraries, then a serial console so I could watch QEMU, then modules and an init system, then the shared libraries for the Horcrux binaries. I can’t find a commit where it reaches a login prompt.

    State

    The codebase got bigger. As far as I can tell, the ISO script still didn’t produce a bootable image, and none of the nine CI runs executed. After December 31 the repo is silent until September 24, 2026.

    Design decisions

    The installer is a Gentoo ISO because Horcrux is Gentoo first. For me that comes down to freedom to choose: USE flags are the main reason, and compiling for specific hardware is the second. I’ve used Gentoo since 2006. The image is built with Gentoo’s Catalyst.

    The other change in December was hosting. The code and CI moved from GitHub to my own Forgejo, which is now the primary. GitHub likes to block things, so I’d rather not depend on it. The repos are still mirrored there. The copied workflows asked for a runner label that mine didn’t have, which is why every run was skipped.

    Other parts: Part 1. The series continues with the latest Horcrux dev log post.