Commit 89a24f93 authored by unknown's avatar unknown
Browse files

- Improved Do-rpm to perform RPM builds inside of a chrooted build

  environment (using "build" on SUSE Linux)


Build-tools/Do-rpm:
  - added functionality to perform RPM builds inside of a chrooted build
    environment (using "build" on SUSE Linux) - see "--help" for more details
parent 80377495
Loading
Loading
Loading
Loading
+159 −85
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ use Getopt::Long;
Getopt::Long::Configure ("bundling");
use Sys::Hostname;

$opt_nobuild = undef;
$opt_cc= undef;
$opt_cflags= undef;
$opt_clean= undef;
@@ -33,6 +32,9 @@ $opt_help= undef;
$opt_log= undef;
$opt_mail= "";
$opt_verbose= undef;
$opt_susebuild= undef;
$opt_susebuildroot= undef;
$opt_suserpms= undef;

# Set a dummy version until we know the correct one
$VERSION= "x.y.z";
@@ -49,7 +51,9 @@ GetOptions(
	"help|h",
	"log|l:s",
	"mail|m=s",
        "nobuild",
	"susebuild|s",
	"susebuildroot|r=s",
	"suserpms=s",
	"verbose|v",
) || &print_help;

@@ -57,6 +61,20 @@ GetOptions(

defined($SPECFILE=$ARGV[0]) || print_help("Please provide the spec file name!");

&print_help("Please define the location of the RPM repository!") if $opt_susebuild && !($opt_suserpms || $ENV{BUILD_RPMS});

unless ($opt_susebuildroot)
{
	if ($ENV{BUILD_ROOT})
	{
		$opt_susebuildroot= $ENV{BUILD_ROOT};
	}
	else
	{
		$opt_susebuildroot="/var/tmp/build-root";
	}
}

# Include helper functions
$PWD= cwd();
$LOGGER= "$PWD/logger.pm";
@@ -72,7 +90,7 @@ else
$subject= "RPM build for $SPECFILE failed" if $opt_mail;

# Open the spec file and extract the version number
open(SPEC, $SPECFILE) or &abort("Unable to open \"$ARGV[0]\": $!");
open(SPEC, $SPECFILE) or die "Unable to open \"$ARGV[0]\": $!";
@spec= <SPEC>;
close SPEC;

@@ -94,7 +112,7 @@ $HOST= hostname();
$HOST=~ /^([^.-]*)/;
$HOST= $1;
$LOGFILE= "$PWD/Logs/Do-rpm-$HOST-$MAJOR.$MINOR.log";
&logger("Using spec file for version: $VERSION");
&logger("Logging to $LOGFILE");

#
# Override predefined Log file name
@@ -114,6 +132,58 @@ if (defined $opt_log)
	}
}

&logger("Using spec file for version: $VERSION");

if ($opt_susebuild)
{
	&susebuild;
}
else
{	
	&rpmbuild;
}

&logger("SUCCESS: RPM files successfully created.") unless ($opt_dry_run);
exit 0;

#
# Build using SUSE's "build" script
#
sub susebuild
{
	$BUILD= "/usr/bin/build";
	( -x $BUILD) ? &logger("$BUILD found, proceeding.") : &abort("$BUILD could not be found!");
	$command= "sudo $BUILD --clean";
	$command.= " --root=$opt_susebuildroot";
	$command.= " --rpms=$opt_suserpms" if $opt_suserpms;
	$command.= " $SPECFILE";
	&logger("Building RPMs using SUSE build.");
	&run_command($command, "Error while running the SUSE RPM build!"); 

	#
	# Move the resulting RPMs into the pwd - we can use broad globs here
	# as the build root has been cleaned up before so there should not be
	# any residuals from previous build runs
	#
	$command= "cp";
	$command.= " -v " if ($opt_verbose);
	$command.= " $opt_susebuildroot/usr/src/packages/SRPMS/MySQL*.src.rpm $PWD";
	&logger("Copying source RPM to current dir.");
	&run_command($command, "Error moving source RPM!");

	$command= "cp";
	$command.= " -v " if ($opt_verbose);
	$command.= " $opt_susebuildroot/usr/src/packages/RPMS/*/MySQL*.rpm $PWD";
	&logger("Copying binary RPMs to current dir.");
	&run_command($command, "Error moving binary RPMs!");
}

#
# Build using "plain" RPM
#
sub rpmbuild
{

	#
	# Newer RPM versions ship with a separate tool "rpmbuild" to build RPMs
	#
@@ -148,8 +218,6 @@ chomp($SRCRPMDIR= `$RPM --eval "%{_srcrpmdir}" 2> /dev/null`);

	$SOURCEFILE= glob "mysql*-$VERSION.tar.gz";

unless($opt_nobuild) {

	&logger("Starting RPM build of MySQL-$VERSION on $HOST");

	foreach $file ($SOURCEFILE, $SPECFILE)
@@ -191,7 +259,6 @@ unless($opt_nobuild) {
	$command.= basename($SPECFILE);
	&logger("Building RPM.");
	&run_command($command, "Error while building the RPMs!"); 
}

	#
	# Move the resulting RPMs into the pwd
@@ -204,13 +271,10 @@ $command.= " $SRCRPMDIR/MySQL*$VERSION_SRPM*.src.rpm $PWD";

	$command= "mv";
	$command.= " -v " if ($opt_verbose);
# $command.= " $RPMDIR/$RPMARCH/MySQL*$VERSION*.$RPMARCH.rpm $PWD";
	$command.= " $RPMDIR/$RPMARCH/MySQL*$VERSION_SRPM*.$RPMARCH.rpm $PWD";
	&logger("Moving binary RPMs to current dir.");
	&run_command($command, "Error moving binary RPMs!");

&logger("SUCCESS: RPM files successfully created.") unless ($opt_dry_run);
exit 0;
}

sub print_help
{
@@ -218,7 +282,7 @@ sub print_help
	if ($message ne "")
	{
		print "\n";
		print "ERROR: $message\n\n}";
		print "ERROR: $message\n\n";
	}
	print <<EOF;

@@ -241,12 +305,22 @@ Options:
-t, --dry-run                 Dry run without executing
-h, --help                    Print this help
-l, --log[=<filename>]        Write a log file [to <filename>]
                              (default is "$LOGFILE")
-m, --mail=<address>          Mail a failure report to the given address
                              (and include a log file snippet, if logging
                              is enabled)
                              Note that the \@-Sign needs to be quoted!
                              Example: --mail=user\\\@domain.com
-s, --susebuild               Use the SUSE "build" script instead of RPM
                              directly (requires sudo privileges to run the
                              /usr/bin/build command)
-r, --susebuildroot=<root>    Use <root> as the build root directory for the
                              SUSE "build" (default is /var/tmp/build-root
                              or defined by the BUILD_ROOT environment
                              variable)
--suserpms=<path>             Path to the SUSE RPM repository to build up
                              the build root (mandatory option when using
                              --susebuild and the BUILD_RPMS environment
                              variable is not set.)
-v, --verbose                 Verbose execution

Example: