mirror of
https://github.com/xcat2/xcat-core.git
synced 2026-09-25 01:04:05 +00:00
fix(xcat-core): the Genesis image is published into releases it cannot boot
builddebs.pl publishes every Architecture:all deb into every release, because every other xcat-core deb is the same file for all of them. The Genesis image is not: it carries the kernel of the root that built it. All three images therefore landed in all three suites, and apt serves the newest, which belongs to another release. deb_belongs_to_dist reads the codename back from the version and keeps an image out of any other suite. A deb with no codename in its version is unaffected. The jammy build also stopped on /usr/share/terminfo/l/linux and v/vt100: ncurses-base installs terminfo under /lib, and the module asks for the /usr/share copies, which come from ncurses-term. noble happened to have it. Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
This commit is contained in:
@@ -37,7 +37,7 @@ our @EXPORT_OK = qw(
|
||||
buildinfo_text
|
||||
targetarch_from_target
|
||||
genesis_chroot_name genesis_target_arch genesis_build_plan
|
||||
genesis_log_errors genesis_log_deny_rules
|
||||
genesis_log_errors genesis_log_deny_rules deb_belongs_to_dist
|
||||
);
|
||||
|
||||
# Both builders echo the commands they run under --verbose. Set once, after
|
||||
@@ -572,6 +572,20 @@ my @GENESIS_LOG_DENY = (
|
||||
|
||||
sub genesis_log_deny_rules { return @GENESIS_LOG_DENY; }
|
||||
|
||||
# deb_belongs_to_dist: whether a built .deb may be published into one release.
|
||||
#
|
||||
# Almost every xcat-core deb is Architecture:all and the same file serves every release, so the
|
||||
# answer is yes. The Genesis image is not: it is built per codename and carries that codename in
|
||||
# its version (2.19.0-snap...~noble). Publishing all three into every suite lets apt serve the
|
||||
# newest, which is the image of another release.
|
||||
sub deb_belongs_to_dist {
|
||||
my ($deb, $dist) = @_;
|
||||
return 1 unless defined $deb && defined $dist && $dist ne '';
|
||||
my $base = basename($deb);
|
||||
return 1 unless $base =~ /_[^_]*~([A-Za-z0-9.]+)_[^_]*\.deb\z/;
|
||||
return $1 eq $dist ? 1 : 0;
|
||||
}
|
||||
|
||||
sub genesis_log_errors {
|
||||
my ($text) = @_;
|
||||
return () unless defined $text && length $text;
|
||||
|
||||
+4
-1
@@ -41,7 +41,7 @@ use XCAT::BuildUtils qw(
|
||||
reprepro_distributions reprepro_options
|
||||
lock_id_for take_build_lock sh_quote
|
||||
sh sh_or_die usage rewrite_file write_script read_line buildinfo_text
|
||||
genesis_build_plan genesis_log_errors
|
||||
genesis_build_plan genesis_log_errors deb_belongs_to_dist
|
||||
);
|
||||
|
||||
# The xcat-core packages that ship as debs. xCAT-openbmc-py, xCAT-rmc and xCAT-release
|
||||
@@ -441,6 +441,9 @@ sub assemble_repo {
|
||||
for my $deb (@debs) {
|
||||
# A release that predates an architecture must not be handed its packages.
|
||||
next if basename($deb) =~ /_(\w+)\.deb\z/ && $1 ne 'all' && !$ok{$1};
|
||||
# Nor an image built for another release: the Genesis deb carries the codename it
|
||||
# was built on, because it carries that release's kernel.
|
||||
next unless deb_belongs_to_dist($deb, $dist);
|
||||
sh_or_die("cd " . sh_quote($repodir) . " && reprepro -b ./ includedeb "
|
||||
. sh_quote($dist) . ' ' . sh_quote($deb),
|
||||
"FATAL: reprepro could not add $deb to $dist\n");
|
||||
|
||||
@@ -81,7 +81,7 @@ REQUIRED_PACKAGES="
|
||||
dosfstools e2fsprogs lvm2 mdadm net-tools
|
||||
bc psmisc rsync wget cpio
|
||||
isc-dhcp-client ifenslave
|
||||
systemd-sysv hwdata btrfs-progs netcat-openbsd iputils-ping fdisk
|
||||
systemd-sysv hwdata btrfs-progs netcat-openbsd iputils-ping fdisk ncurses-term
|
||||
dpkg-dev debhelper fakeroot devscripts vim-tiny
|
||||
"
|
||||
if [ "$BUILDARCH" = "amd64" ]; then
|
||||
|
||||
@@ -61,6 +61,22 @@ ok(!eval { XCAT::BuildUtils::genesis_build_plan([], 'amd64'); 1 },
|
||||
ok(!eval { XCAT::BuildUtils::genesis_target_arch('riscv64'); 1 },
|
||||
'an architecture with no Genesis image directory is an error');
|
||||
|
||||
# --- a per-codename image reaches only its own suite --------------------------------------
|
||||
ok(XCAT::BuildUtils->can('deb_belongs_to_dist'),
|
||||
'XCAT::BuildUtils decides which suite a deb belongs to');
|
||||
if (XCAT::BuildUtils->can('deb_belongs_to_dist')) {
|
||||
my $noble = 'xcat-genesis-base-amd64_2.19.0-snap202609121200~noble_all.deb';
|
||||
ok(XCAT::BuildUtils::deb_belongs_to_dist($noble, 'noble'),
|
||||
'the noble image is published into noble');
|
||||
ok(!XCAT::BuildUtils::deb_belongs_to_dist($noble, 'jammy'),
|
||||
'the noble image is not published into jammy');
|
||||
# Everything else in xcat-core is the same file for every release.
|
||||
ok(XCAT::BuildUtils::deb_belongs_to_dist('perl-xcat_2.19.0-snap1_all.deb', 'jammy'),
|
||||
'a deb with no codename in its version reaches every suite');
|
||||
ok(XCAT::BuildUtils::deb_belongs_to_dist('xcat_2.19.0-snap1_amd64.deb', 'resolute'),
|
||||
'an architecture deb reaches every suite');
|
||||
}
|
||||
|
||||
# --- the log guard ---------------------------------------------------------------------
|
||||
#
|
||||
# dracut prints FAILED: for a command it cannot install and exits 0. This is the log of the
|
||||
|
||||
Reference in New Issue
Block a user