Left after validating the 2026-09-26 layer: a failed build was published, and the declarative boot has no path of its own #2
Labels
No labels
accessibility
bug
documentation
duplicate
enhancement
good first issue
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Keel-Linux/keel-nodebb#2
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found while validating the nodebb layer of 2026-09-26 (sha256
40e3f4da,parent nodejs-nginx
f791777f) in a second container,forum2, on thebuild host. Recorded in docs/forum-build-2026-09-26.md. Pull request #1
fixes the two that belong to this recipe; everything below is what is left.
1. The published layer is the output of a failed build, and must be replaced
conf.d/mainmet a dpkg conffile prompt on/etc/confconsole/services.txtand
root.patchedfailed withmake: *** Error 100. The recipe half isfixed in #1. Two consequences survive in the artifact that is on the build
host right now and mirrored nowhere yet:
install ok unpacked, not configured.root.patchednever finished, so fab never removed the build overlays:the layer carries
/usr/local/bin/systemctland/usr/local/bin/service,the systemd-chroot shims.
core.rootfsandnodejs-nginx.rootfsdo nothave them. At the first boot
10regen-sshkeyscalled the shim and loopedforever.
The layer has to be rebuilt with the recipe of #1 and the old file replaced
everywhere it has been copied. Until then nothing should be assembled from
it without removing the two shims by hand.
2. bt-layer publishes a build that failed
This is the reason #1 above was not caught at build time.
bt-layerline155:
The
|| truediscards the status, and the script goes on to copyroot.patched, pack the tarball, write the manifest and export the layer.A build that fails is indistinguishable from one that succeeds unless
somebody reads the log. It should stop on a non-zero make, and the exit
status has to be taken from
PIPESTATUSbecause of thetee.This is a change in the buildtasks fork, not in this repository, but it is
recorded here because this is where it did its damage.
3. 00declarative and the keel package disagree on where the spec lives
00declarativereads$INITHOOKS_DECL, whose packaged default in/etc/default/inithooksis/etc/inithooks.yaml. The keel package, theexample in
keel/instance.example.yamlandkeel spec applyall use/etc/keel/instance.yaml. An image with a spec in the documented placetherefore boots with
00declarativedoing nothing, silently, and fallsthrough to
29preseedgenerating a random password instead.forum2was booted withINITHOOKS_DECLpointed at the keel path, which isthe only reason the declarative boot could be demonstrated at all. One of
the two packages should move: either inithooks defaults to
/etc/keel/instance.yaml, or the keel package ships the symlink or thedefault file entry. Brief section 11 reserves the final spec path for the
maintainer, so this needs a decision before either package changes.
4. A Keel container has no inithooks unit that runs at boot
build-tag proxmoxwrites/var/lib/turnkey-info/inithooks.service/lxc,and the headless patch's
inithooks.servicecarriesConditionPathExists=!/var/lib/turnkey-info/inithooks.service/lxc. Noinithooks-lxc.serviceexists in this image, so nothing runs the first booton
lxc-start:forum2neededlxc-attach -- /usr/lib/inithooks/run, andthe earlier
forumneeded the same pluskeel spec apply.For an appliance whose whole point is that a spec file boots it, that is the
missing piece. Either the Keel container patch ships an
inithooks-lxc.servicethat runs the chain headless, or it stops writingthe marker and relies on the headless unit.
5. 29preseed always exits 1
Its first line is
[[ -n "$_TURNKEY_INIT" ]] && exit 0underbash -e. A&&list whose own status is non-zero ends the script, so the hook exits 1whenever
_TURNKEY_INITis unset, which is every non-interactive boot. Itis a harmless no-op (it would have exited 0 a line later anyway), but every
boot log carries
ERR: [29preseed] failed - exit code 1, which trains thereader to ignore errors in that log. Upstream file, shipped by the
buildtasks headless patch.
6. The confconsole Instance menu does not exist
ls /usr/lib/confconsole/plugins.d/Instanceexits 2. The plugins are thefive upstream ones;
keelcliis not in the image either. The changelog ofconfconsole 2.2.3+keel1is the IPv6 networking work and the tests, andmentions no Instance plugin.
Brief section 6 asks for Instance: view, edit, apply spec, show drift,
export spec, each with a headless equivalent. The library calls it would sit
on (
keel spec apply,keel diff,keel inspect) all exist and work in theimage. This is not a regression, it is unwritten work, but the build report
assumed it was in the layer, so it is worth having on the list.
Not in this issue
The four drifts
keel diffreports (network.ipv6.method,tls.acmedeclared while disabled,
security.updatesskip against force,instance.fqdnunknown) reproduced exactly onforum2and are alreadyrecorded in the coordinator's section of docs/forum-build-2026-09-26.md.
They belong to the keel repository.
7. The appliance check cannot run on a public repository
Found while merging #1.
tests / build-and-boottargets[self-hosted, keel-lxc]. The runnerkeel-lxc-1is online, idle and carries that label, but the organization's Default runner group hasallows_public_repositories: falseand every repository in the organization is public, so the job is never offered to it. It stays queued and GitHub cancels it after 24 hours. That is the state today: no appliance test has ever run in CI, and a pull request that waits for that check waits forever.GitHub refuses this combination on purpose: a self-hosted runner on a public repository will execute whatever a fork's pull request contains. Turning the flag on is a security decision, not a configuration detail, so it is left to the maintainer. The options, in the order they cost:
pull_request_targetavoided everywhere and no workflow that runs fork code before approval.Independently of the flag, the job would still fail: the runner has no fab and no buildtasks, so
bt-layeris not there (docs/releases-host.md section 7 already records thattest-appliance.ymlhas to fetch layers frommirror.keellinux.orginstead of building them).