1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
sbo-testbuild image builder
===========================
Builds the docker images that .extras/test-build consumes:
docker.noland.dnx:5000/sbo-testbuild:current
docker.noland.dnx:5000/sbo-testbuild:15.0
Three scripts, chained (see .extras/docs/specs/2026-07-13-image-builder-design.md):
bootstrap.sh sbo-base:{ver} FROM scratch, base pkgs from NAS
build-full-image.sh sbo-full:{ver} FROM base, all series
build-sbo-testbuild.sh sbo-testbuild:{ver} FROM full, + sbopkg + tools
All settings live in ./config.
VM setup (docker.noland.dnx, Slackware x86_64, 4 vCPU / 4 GB / 80 GB)
--------------------------------------------------------------------
1. Install docker; enable the daemon.
2. NFS-mount the two NAS trees read-only, named to match:
/mnt/nas/slackware64-current -> -current mirror tree
/mnt/nas/slackware64-15.0 -> 15.0 mirror tree
Each is a full mirror (PACKAGES.TXT, ChangeLog.txt, slackware64/, patches/,
extra/). Root must be able to read them (bootstrap runs installpkg as root).
3. Run a LAN registry:
docker run -d --restart=always -p 5000:5000 \
-v /opt/registry/data:/var/lib/registry --name registry registry:2
4. Mark the registry insecure (plain HTTP) on the VM AND every pulling client
(this dev box, the buildsystem VM). In /etc/docker/daemon.json:
{ "insecure-registries": ["docker.noland.dnx:5000"] }
then restart docker.
5. Drop the two prebuilt packages (built once, re-drop on upstream bumps):
/opt/sbo-testbuild/pkgs/sbopkg-*.txz
/opt/sbo-testbuild/pkgs/sbo-maintainer-tools-*.txz
6. Install the nightly cron (root). The NAS repos sync at 04:00 and 05:00, so
the chain runs after. No --force: each script self-gates (bootstrap on the
ChangeLog hash, full-image on the base-image digest, build-sbo-testbuild on
the full-image digest + tools .txz hash), so an unchanged night is a cheap
no-op. -current moves daily and rebuilds most nights; 15.0 is frozen stable
and rebuilds only on a real repo update. Deployed schedule on docker.noland.dnx:
# -current
0 6 * * * /path/to/.extras/image-builder/bootstrap.sh --version current >> /var/log/sbo-testbuild.log 2>&1
20 6 * * * /path/to/.extras/image-builder/build-full-image.sh --version current >> /var/log/sbo-testbuild.log 2>&1
0 8 * * * /path/to/.extras/image-builder/build-sbo-testbuild.sh --version current >> /var/log/sbo-testbuild.log 2>&1
# 15.0
0 9 * * * /path/to/.extras/image-builder/bootstrap.sh --version 15.0 >> /var/log/sbo-testbuild.log 2>&1
20 9 * * * /path/to/.extras/image-builder/build-full-image.sh --version 15.0 >> /var/log/sbo-testbuild.log 2>&1
0 11 * * * /path/to/.extras/image-builder/build-sbo-testbuild.sh --version 15.0 >> /var/log/sbo-testbuild.log 2>&1
7. Ensure docker.noland.dnx resolves on the LAN (static IP or DNS).
Manual first run
----------------
./bootstrap.sh --version current --force
./build-full-image.sh --version current --force
./build-sbo-testbuild.sh --version current --force
Then confirm:
docker pull docker.noland.dnx:5000/sbo-testbuild:current
docker run --rm docker.noland.dnx:5000/sbo-testbuild:current sbopkg -V
Flags: --force (rebuild unconditionally), --version <current|15.0> (one variant).
Tests
-----
bash test-image-builder.sh # pure-logic self-check, no docker
|