2
0
mirror of https://github.com/xcat2/xcat-dep.git synced 2026-09-14 10:13:49 +00:00
Files
xcat-dep/debs-manifest.conf
T
Daniel Hilst aac092304c fix(xcat-dep): pin the FULL deb version, and collect only real build output
The manifest pinned only the UPSTREAM version: deb_version() and
resolve_present_names() both reduced the version with deb_upstream_version()
before comparing, dropping the epoch and the debian_revision. A package can
carry the right upstream version and still be the wrong package:

  * the debian_revision is the PACKAGING revision -- elilo-xcat 3.14-5 and
    3.14-6 are different builds of the same upstream 3.14;
  * the epoch overrides version comparison outright -- an un-epoched 2.19.0
    sorts BELOW 2:2.18.0.

That matters here because xCAT's own debian/control declares versioned
dependencies on these packages -- goconserver (>= 0.3.3-snap...), ipmitool-xcat
(>= 1.8.17-1), grub2-xcat (>= 2.02-...) in xCAT, xCATsn and xCAT-server -- so an
upstream-only pin can accept a deb that the gate calls good and that
`apt install xCAT` then refuses.

The pin is now matched against the FULL [epoch:]upstream[-revision], exactly as
it appears in the built .deb and in the published Packages index. No new
operator was needed: the existing exact/glob/'*' grammar simply applies to the
whole version, which is stricter than a >= floor because it also rejects an
epoch the pin does not name. Six pins become fully exact; two stay globbed
because their revision is not owned by the checkout:

  * goconserver=0.3.3-snap*  -- upstream exact; the revision is the CD stamp
    snap<SOURCE_DATE_EPOCH>, which changes every run. The glob still REQUIRES a
    snap-stamped revision, so an unstamped deb is rejected.
  * xcat-genesis-base=2.*    -- its version is not owned by xcat-dep; it walks
    with whatever xcat-core the genesis was built from (XCAT_CORE_REF), and the
    two arches legitimately differ since each is converted from its own rpm.
    The gate still enforces exactly one genesis FOR THIS ARCH.

deb_version() gained an optional $arch for that logical name: both arch-suffixed
genesis debs are staged on the amd64 host (the cross-arch ppc one for #7610) and
carry different revisions, so without it the pair would look like a version
conflict. This mirrors resolve_present_names, which already refuses to borrow
another arch's genesis.

Comparing full versions also exposed a pre-existing defect it had been masking:
the collector treated PREBUILT .deb files checked into the source tree as build
output. elilo/ ships elilo-xcat_3.14-5_all.deb, elilo-xcat_3.14-6_all.deb and
gnu-efi_3.0v-5_amd64.deb; the first and third were being published into the apt
repo under this run's name, and the stale 3.14-5 collided with the freshly built
3.14-6 once revisions were compared. The build now snapshots the .debs present
before the build and subtracts them afterwards -- a file the build overwrites
changes size/mtime and still counts as output. Verified in the noble chroot: only
elilo-xcat_3.14-6_all.deb is collected; gnu-efi and 3.14-5 are reported and left
behind.

deb_upstream_version() has no remaining callers and is removed.

Tests: version_matches over whole versions (stale revision rejected, unnamed
epoch rejected, both globs still enforcing what they should); deb_version
returning the full version, dying on two revisions of one upstream version (the
elilo case), and selecting the per-arch genesis; resolve_present_names handing
the full version to the comparator; and two end-to-end cases in t/verify-repo.t
asserting the gate now fails a stale packaging revision and an unnamed epoch.

Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
2026-08-21 23:06:30 -03:00

139 lines
6.0 KiB
Plaintext

# Per-target required xcat-dep .deb manifest (the Debian/apt analogue of packages-manifest.conf).
#
# One [section] per sbuild-all.pl target, named "<codename>-<arch>" (matches --target). Each entry is
# <binary-package>=<version-pin>
# where <binary-package> is the produced .deb's binary name (or the logical 'xcat-genesis-base',
# which matches the arch-suffixed xcat-genesis-base-amd64 / xcat-genesis-base-ppc64el) and
# <version-pin> is one of:
# - an exact version (e.g. 1.8.18-4) -- the build must produce exactly it;
# - a shell-style glob (e.g. 2.*) -- the built version must match it (* and ?);
# - '*' -- any version accepted.
#
# The pin is matched against the FULL Debian version -- [epoch:]upstream[-revision] -- exactly as it
# appears in the built .deb and in the published Packages index. That is deliberate: a package can
# carry the right upstream version and still be wrong for xCAT, because
# * the debian_revision is the PACKAGING revision (elilo-xcat 3.14-5 vs 3.14-6 are different builds
# of the same upstream 3.14), and
# * the epoch overrides version comparison outright (2:2.18.0 outranks any un-epoched 2.19.0).
# xCAT's own debian/control declares versioned dependencies on these packages -- goconserver
# (>= 0.3.3-snap...), ipmitool-xcat (>= 1.8.17-1), grub2-xcat (>= 2.02-...) -- so an upstream-only pin
# would accept a deb the gate calls good and `apt install xCAT` then refuses. Bump the pin here when
# the in-tree debian/changelog is bumped (the revision is part of the pin now, so a changelog bump
# that only moves the revision must be reflected here too).
#
# Two pins are deliberately NOT fully exact, because their revision is not owned by the checkout:
# * goconserver=0.3.3-snap* -- upstream is pinned exactly; the revision is the CD stamp
# snap<SOURCE_DATE_EPOCH>, which changes every run. The glob still REQUIRES a snap-stamped
# revision, so an unstamped or hand-built deb is rejected.
# * xcat-genesis-base=2.* -- its version is not owned by xcat-dep at all (see the note below);
# and the two arches legitimately differ, since each is converted from its own genesis rpm.
#
# PER-ARCH SETS (review concern #3 -- the arch matrix must be valid):
# * Compiled, arch-specific deps that genuinely build on BOTH arches are listed for amd64 AND
# ppc64el: ipmitool-xcat, conserver-xcat, goconserver (debian/control Architecture: any / *-ppc64el).
# * The noarch boot components (syslinux-xcat, grub2-xcat, elilo-xcat, xnba-undi) are
# Architecture:all: their SOURCE is x86-only (syslinux compiles with nasm/gcc-multilib; elilo/xnba
# are x86/EFI loaders; grub2-xcat is config/scripts), so they are BUILT ONCE on amd64 -- SINGLE
# PRODUCER, concern #3b -- and, being arch:all, assembled into EVERY arch's Packages index. They
# ARE listed for ppc64el too, as REQUIRED-PRESENT: a ppc MN needs them for netboot, so the gate
# must verify the ppc repo carries them (matching the EL manifest and the historical 2.16 ppc dep
# repo, minus the obsolete yaboot-xcat). sbuild-all.pl's build phase SKIPS an Architecture:all
# package on any non-amd64 arch (it is not rebuilt there -- a syslinux build on ppc fails), so
# listing them for ppc64el drives VERIFICATION, not a second build.
# * xcat-genesis-base is arch:all but arch-SPECIFIC content (the netboot image for that arch), so
# each arch produces its own (xcat-genesis-base-<arch>); the finalize step cross-populates both
# into every codename pool for cross-arch netboot (issue #7610). Pinned 2.* -- its Version walks
# with the paired xcat-core (not owned by xcat-dep), exactly as on the EL side. The gate still
# enforces that EXACTLY ONE genesis is present FOR THIS ARCH: the name resolves to
# xcat-genesis-base-<arch> and never borrows the other arch's, and two distinct versions of it in
# one staging dir is a hard error.
#
# sbuild-all.pl reads this file and, per target, builds ONLY the listed packages and then validates
# that EVERY listed package was produced at the pinned version -- any missing or mismatched package
# fails the whole run (zero tolerance; concern #4). The four supported codenames (focal jammy noble
# resolute) each get an amd64 and a ppc64el section.
# ============================ focal (ubuntu20.04) ============================
[focal-amd64]
ipmitool-xcat=1.8.18-4
conserver-xcat=8.2.1-1
goconserver=0.3.3-snap*
syslinux-xcat=3.86-2
grub2-xcat=2.12-1
elilo-xcat=3.14-6
xnba-undi=1.21.1-1
xcat-genesis-base=2.*
[focal-ppc64el]
ipmitool-xcat=1.8.18-4
conserver-xcat=8.2.1-1
goconserver=0.3.3-snap*
syslinux-xcat=3.86-2
grub2-xcat=2.12-1
elilo-xcat=3.14-6
xnba-undi=1.21.1-1
xcat-genesis-base=2.*
# ============================ jammy (ubuntu22.04) ============================
[jammy-amd64]
ipmitool-xcat=1.8.18-4
conserver-xcat=8.2.1-1
goconserver=0.3.3-snap*
syslinux-xcat=3.86-2
grub2-xcat=2.12-1
elilo-xcat=3.14-6
xnba-undi=1.21.1-1
xcat-genesis-base=2.*
[jammy-ppc64el]
ipmitool-xcat=1.8.18-4
conserver-xcat=8.2.1-1
goconserver=0.3.3-snap*
syslinux-xcat=3.86-2
grub2-xcat=2.12-1
elilo-xcat=3.14-6
xnba-undi=1.21.1-1
xcat-genesis-base=2.*
# ============================ noble (ubuntu24.04) ============================
[noble-amd64]
ipmitool-xcat=1.8.18-4
conserver-xcat=8.2.1-1
goconserver=0.3.3-snap*
syslinux-xcat=3.86-2
grub2-xcat=2.12-1
elilo-xcat=3.14-6
xnba-undi=1.21.1-1
xcat-genesis-base=2.*
[noble-ppc64el]
ipmitool-xcat=1.8.18-4
conserver-xcat=8.2.1-1
goconserver=0.3.3-snap*
syslinux-xcat=3.86-2
grub2-xcat=2.12-1
elilo-xcat=3.14-6
xnba-undi=1.21.1-1
xcat-genesis-base=2.*
# ============================ resolute (ubuntu26.04) =========================
[resolute-amd64]
ipmitool-xcat=1.8.18-4
conserver-xcat=8.2.1-1
goconserver=0.3.3-snap*
syslinux-xcat=3.86-2
grub2-xcat=2.12-1
elilo-xcat=3.14-6
xnba-undi=1.21.1-1
xcat-genesis-base=2.*
[resolute-ppc64el]
ipmitool-xcat=1.8.18-4
conserver-xcat=8.2.1-1
goconserver=0.3.3-snap*
syslinux-xcat=3.86-2
grub2-xcat=2.12-1
elilo-xcat=3.14-6
xnba-undi=1.21.1-1
xcat-genesis-base=2.*