mirror of
https://github.com/xcat2/xcat-core.git
synced 2026-09-05 20:47:55 +00:00
b8510e1be3
build-ubunturepo was 710 lines of shell doing the Debian half of what
buildrpms.pl does for rpms, with no code in common and a different CLI. It also
carried paths that are dead: GSA uploads, the PROMOTE/PREGA release flows, and a
-d mode that built an xcat-dep repository from a different project's packages.
builddebs.pl replaces it and mirrors buildrpms.pl -- Getopt::Long options, one
package list, build then index then sign -- so the two builders read the same way
and share BuildUtils.pm.
The design rests on one fact: xcat-core debs are Perl. They are byte-identical
for every Ubuntu release, so they are built ONCE and the same files are published
into every codename. Only xCAT, xCATsn and xCAT-genesis-scripts carry an
architecture, and there the difference is packaging metadata, not compiled
output. That is why this needs no sbuild and no per-codename chroot -- unlike
xcat-dep, whose packages are compiled and genuinely differ per release.
BuildUtils.pm holds what both builders need and what was worth making testable:
the Version-Release derivation from the commit time, the xCAT-probe helper
staging, the deb arch and dist tables, the debian/control version pinning, the
changelog rewrite, the reprepro conf generation, and the build lock. Every
function is pure or takes its side effect as an argument, so build_utils.t (45
assertions) drives each one rather than grepping a builder for evidence that it
is called. Verified by mutation: shrinking the arch table reddens 1, dropping
the /g from the control pin reddens 2.
The env-var CLI maps to options: BUILDALL=1 -> --force, GPGSIGN=1 -> --gpg-sign,
GPG_HOME -> --gpg-home, DEST -> --dest, DISTS -> --dist (repeatable). UP=0 has no
equivalent because uploading is gone -- the CD pipeline's deploy step publishes.
Callers updated: github_action_xcat_test.pl and travis.pl. The comment in
github_action_xcat_test.pl explaining why CI copies the tree before building is
corrected -- build-ubunturepo rm -rf'd $curdir/../../xcat-core, which under
GitHub's work/<repo>/<repo> layout is the checkout's own parent; builddebs.pl
writes under dist/debs inside the checkout and restores every file it edits, so
the copy is now only isolating the tests from build residue.
Two tests moved with it. build_ubunturepo_lock.t extracted the lock out of the
shell with a regex and ran that; the lock is now a function, so builddebs_lock.t
calls it -- and asserts what actually matters, that two builds of one checkout
fail fast while two builds of different checkouts run concurrently.
ubuntu_2604_pkglist.t asserted that resolute appeared in a shell fragment of
build-ubunturepo's source; it now asks BuildUtils for the release list and checks
a resolute stanza reaches conf/distributions. That assertion would have passed on
any file containing the fragment and broken on a reflow that changed nothing.
Verified: prove -r xCAT-test/unit fails on 6 files here against 7 on
upstream/master, the difference being apache_config_sources.t, fixed by the
preceding commit. The remaining 6 are missing DB modules on the machine that ran
it and are identical on both.
NOT done here, and required before this can merge: the Ubuntu core CD pipelines
still invoke ./build-ubunturepo (ci/ubuntu/Jenkinsfile.core-ubuntu-{devel,stable}
in VersatusHPC/xcat-core-ci-cd, and the inline script in each live Jenkins job).
Those must be switched to builddebs.pl in the same change window.
Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
55 lines
2.2 KiB
Perl
55 lines
2.2 KiB
Perl
#!/usr/bin/env perl
|
|
# The deb build lock (VersatusHPC/xcat-core#52).
|
|
#
|
|
# builddebs.pl builds in-place in its own checkout -- it rewrites debian/changelog and
|
|
# debian/control and runs dpkg-buildpackage inside the package directories -- so two
|
|
# builds of the SAME checkout would corrupt each other and must fail fast, while two
|
|
# builds of DIFFERENT checkouts share nothing and must run concurrently. The historic
|
|
# host-global lock got that backwards and made the devel and stable CD lanes collide.
|
|
#
|
|
# This drives the real lock. The predecessor extracted a marked region out of
|
|
# build-ubunturepo with a regex and ran that; now the lock is a function, so it is
|
|
# called directly.
|
|
use strict;
|
|
use warnings;
|
|
|
|
use File::Temp qw(tempdir);
|
|
use FindBin;
|
|
use lib "$FindBin::Bin/../lib";
|
|
use lib "$FindBin::Bin/../..";
|
|
use Test::More;
|
|
|
|
use BuildUtils qw(lock_id_for take_build_lock);
|
|
|
|
my $lockdir = tempdir(CLEANUP => 1);
|
|
|
|
is( lock_id_for('/opt/builds/devel/xcat-core'),
|
|
lock_id_for('/opt/builds/devel/xcat-core'),
|
|
'one checkout always maps to one lock id' );
|
|
isnt( lock_id_for('/opt/builds/devel/xcat-core'),
|
|
lock_id_for('/opt/builds/stable/xcat-core'),
|
|
'two checkouts map to different lock ids' );
|
|
like( lock_id_for('/any/path'), qr/\A[0-9a-f]{12}\z/,
|
|
'the id is filesystem-safe, so it can name a file' );
|
|
is( length lock_id_for(''), 12, 'an empty path still yields an id rather than dying' );
|
|
|
|
# Same checkout: the second build must be refused.
|
|
my $devel = '/opt/builds/devel/xcat-core';
|
|
my $first = take_build_lock($devel, $lockdir);
|
|
ok( $first, 'the first build of a checkout takes the lock' );
|
|
|
|
my $second = eval { take_build_lock($devel, $lockdir) };
|
|
ok( !$second, 'a second build of the SAME checkout is refused' );
|
|
like( $@, qr/already holds/, 'and says which checkout is already building' );
|
|
|
|
# Different checkout: must not be blocked by the first.
|
|
my $stable = eval { take_build_lock('/opt/builds/stable/xcat-core', $lockdir) };
|
|
ok( $stable, 'a build of a DIFFERENT checkout runs concurrently' );
|
|
|
|
# Releasing lets the next build in.
|
|
close $first;
|
|
my $again = eval { take_build_lock($devel, $lockdir) };
|
|
ok( $again, 'the lock is released when the handle is closed' );
|
|
|
|
done_testing();
|