The field installer needs no network at all, which means the packages have to travel with the repository. This adds the resolved pool and pins every package to the exact version the pool carries. Package pool - 1312 .deb files (884 MB), resolved on Ubuntu 26.04 in a container so the closure matches the release the fleet runs: a .deb built against another glibc cannot be installed on the devices. - Tracked through Git LFS (*.deb), so history stays navigable while the working tree keeps the real files the installer reads from disk. - Two RustDesk dependencies (libxdo3, libva-x11-2) were missing: the vendor .deb is installed with dpkg, so nothing else pulls them in and `dpkg -i rustdesk` would have left the package unconfigured on a device. - Every file validated in the same release: 1312/1312 readable, 0 corrupt, 0 foreign architecture, and the pool satisfies all 24 pins (PLAN READY). Pins - All 24 UNPINNED sentinels replaced with the versions read from the packages themselves (dpkg-deb), with requirements.tsv updated in the same change so the contract has no drift. build-index.sh: stop destroying the shipped record - The repository record next to this script is the reviewed contract template (state: UNBUILT, packages: []) that documents the schema. Its default record destination pointed at that same file, so any default-path run overwrote the template with BUILT rows -- which happened twice, once from a hand run and once while this change was being developed. - The record now defaults to <output>/repo-manifest.yaml, and pointing it at the template is refused before any work starts. The template header documents this. Tests - The unpinned-pin and missing-pin cases read the sentinel out of the real manifests, so they became no-ops the moment the contract was filled instead of failing. They now set up the condition explicitly, and the fixture manifests carry the synthetic versions their pool is built from. - check-provisioning-static required packages/.gitkeep; the pool is what keeps that directory in git now, so it asserts a populated pool directory instead.
30 lines
1.8 KiB
Text
30 lines
1.8 KiB
Text
# Blueforce Field OS - offline APT pin manifest: Docker CE
|
|
#
|
|
# Target release : Ubuntu 26.04 LTS, architecture amd64 (LAB confirms both)
|
|
# Format : one exact pin per line -> package=version ("#" starts a comment)
|
|
# Consumed by : scripts/install/blueforce-install.sh --offline, which refuses to
|
|
# run any package module unless every pin here is present in the
|
|
# bundle lock file <repo>/packages.lock.tsv.
|
|
#
|
|
# UNPINNED is a sentinel, not a version. Fill it in LAB:
|
|
# 1. acquire the reviewed .deb for the package into one local pool directory
|
|
# 2. read the exact version: dpkg-deb -f <file>.deb Package Version
|
|
# 3. replace UNPINNED with that version, keeping the line shape:
|
|
# docker-ce=<exact version reported by dpkg-deb>
|
|
# 4. verify with the static plan: ../build-offline-repo.sh --dry-run-plan
|
|
# (it must print PLAN READY before --check or a real build is attempted)
|
|
#
|
|
# Rules enforced by the tooling: lower-case package names, exactly one pin per
|
|
# package across all manifests, no inline comments, no whitespace around "=",
|
|
# no placeholder/replace/todo tokens. Adding or removing a package is a contract
|
|
# change: update manifests/requirements.tsv in the same edit or the plan fails.
|
|
|
|
# These packages are NOT in the Ubuntu archive: they come from the reviewed Docker
|
|
# CE repository snapshot and must be supplied as local .deb files. containerd.io is
|
|
# the runtime bundled with Docker CE, not Ubuntu's "containerd" package.
|
|
# Installer module 10-docker.sh installs exactly this set in --offline mode.
|
|
docker-ce=5:29.8.1-1~ubuntu.26.04~resolute
|
|
docker-ce-cli=5:29.8.1-1~ubuntu.26.04~resolute
|
|
containerd.io=2.3.5-1~ubuntu.26.04~resolute
|
|
docker-buildx-plugin=0.37.1-1~ubuntu.26.04~resolute
|
|
docker-compose-plugin=5.5.1-1~ubuntu.26.04~resolute
|