source: ProjectBuilder/devel/pb/bin/pb@ 132

Last change on this file since 132 was 132, checked in by Bruno Cornec, 17 years ago

Lots of small fixes for vm management.
pb is able now to lauch correctly script on the VM and build packages.
Still working on result backup.

  • Property svn:executable set to *
File size: 21.3 KB
RevLine 
[5]1#!/usr/bin/perl -w
2#
3# Project Builder main application
4#
5# $Id$
6#
7# Copyright B. Cornec 2007
8# Provided under the GPL v2
9
[22]10# Syntax: see at end
[9]11
[18]12use strict 'vars';
[5]13use Getopt::Std;
[9]14use Data::Dumper;
15use English;
[16]16use AppConfig qw(:argcount :expand);
17use File::Basename;
[26]18use File::Copy;
[13]19use Time::localtime qw(localtime);
20use POSIX qw(strftime);
[5]21
[73]22# Global variables
[17]23use lib qw (lib);
[74]24use ProjectBuilder::Distribution qw (pb_distro_init);
25use ProjectBuilder::Changelog qw (pb_changelog);
26use ProjectBuilder::Version qw (pb_version_init);
[106]27use ProjectBuilder::Base qw (pb_conf_read pb_conf_get pb_cms_init pb_mkdir_p pb_system pb_rm_rf pb_get_filters pb_filter_file pb_filter_file_pb pb_cms_export pb_cms_log);
[5]28
29my %opts; # CLI Options
[9]30my $action; # action to realize
31my $test = "FALSE";
32my $option = "";
33my @pkgs;
[95]34my $pbtag; # Global Tag variable
35my $pbver; # Global Version variable
[77]36my %pbver; # per package
37my %pbtag; # per package
[53]38my $pbrev; # Global REVISION variable
[16]39my @date=(localtime->sec(), localtime->min(), localtime->hour(), localtime->mday(), localtime->mon(), localtime->year(), localtime->wday(), localtime->yday(), localtime->isdst());
40my $pbdate = strftime("%Y-%m-%d", @date);
[112]41my $pbdatecvs = strftime("%Y-%m-%d %H:%M:%S", @date);
[108]42my $debug = 0;
43my $LOG = \*STDOUT;
[5]44
[91]45getopts('hl:m:p:qr:tv',\%opts);
[5]46
[75]47my ($projectbuilderver,$projectbuilderrev) = pb_version_init();
[21]48if (defined $opts{'h'}) {
[74]49 pb_syntax();
[21]50 exit(0);
51}
52if (defined $opts{'v'}) {
53 $debug++;
54}
55if (defined $opts{'q'}) {
56 $debug=-1;
57}
[22]58if (defined $opts{'l'}) {
59 open(LOG,"> $opts{'l'}") || die "Unable to log to $opts{'l'}: $!";
60 $LOG = *LOG;
61 $debug = 0 if ($debug == -1);
62 }
[9]63# Handles test option
64if (defined $opts{'t'}) {
65 $test = "TRUE";
66 # Works only for SVN
67 $option = "-r BASE";
68}
[5]69
[67]70# Handle root of the project if defined
71if (defined $opts{'r'}) {
72 $ENV{'PBROOT'} = $opts{'r'};
73}
[91]74# Handle virtual machines if any
75if (defined $opts{'m'}) {
76 $ENV{'PBVM'} = $opts{'m'};
77}
[108]78
79# Get Action
80$action = shift @ARGV;
81die pb_syntax() if (not defined $action);
82
83my ($pbrc, $filteredfiles, $defpkgdir, $extpkgdir);
84
[59]85# Handles project name if any
[108]86# And get global params
[59]87if (defined $opts{'p'}) {
[107]88 ($ENV{'PBPROJ'},$debug,$LOG, $pbrc, $filteredfiles, $defpkgdir, $extpkgdir)
89 = pb_env_init($opts{'p'});
[59]90} else {
[107]91 ($ENV{'PBPROJ'},$debug,$LOG, $pbrc, $filteredfiles, $defpkgdir, $extpkgdir)
92 = pb_env_init();
[59]93}
94
[108]95print $LOG "Project: $ENV{'PBPROJ'}\n" if ($debug >= 0);
[22]96print $LOG "Action: $action\n" if ($debug >= 0);
[9]97
[91]98# Keep those project values to store them at the end each time
[83]99my $pbprojtag = $ENV{'PBTAG'};
100my $pbprojver = $ENV{'PBVER'};
101
[9]102# Act depending on action
103if ($action =~ /^cms2build$/) {
[77]104 pb_cms2build();
105} elsif ($action =~ /^build2pkg$/) {
106 pb_build2pkg();
107} elsif ($action =~ /^cms2pkg$/) {
108 pb_cms2build();
109 pb_build2pkg();
[88]110} elsif ($action =~ /^build2ssh$/) {
111 pb_build2ssh();
112} elsif ($action =~ /^pkg2ssh$/) {
113 pb_pkg2ssh();
[91]114} elsif ($action =~ /^build2vm$/) {
115 pb_build2vm();
116} elsif ($action =~ /^cms2vm$/) {
117 pb_cms2build();
118 pb_build2vm();
[105]119} elsif ($action =~ /^cms2ssh$/) {
120 pb_cms2build();
121 pb_build2vm();
122 pb_build2ssh();
123 pb_pkg2ssh();
[106]124} elsif ($action =~ /^clean$/) {
[77]125} else {
126 print $LOG "'$action' is not available\n";
127 pb_syntax();
128}
129
130sub pb_cms2build {
131
[112]132 my $ptr = pb_get_pkg($defpkgdir,$extpkgdir);
[22]133 @pkgs = @$ptr;
[112]134 my $cms=pb_cms_init($ENV{'PBPROJ'});
[9]135
[98]136 my ($pkgv, $pkgt) = pb_conf_read("$ENV{'PBCONF'}/$ENV{'PBPROJ'}.pb","pkgver","pkgtag");
[27]137 foreach my $pbpkg (@pkgs) {
[115]138 $ENV{'PBPKG'} = $pbpkg;
[98]139 if ((defined $pkgv) && (defined $pkgv->{$pbpkg})) {
140 $pbver = $pkgv->{$pbpkg};
[115]141 $ENV{'PBVER'} = $pbver;
[9]142 } else {
[16]143 $pbver = $ENV{'PBVER'};
[9]144 }
[98]145 if ((defined $pkgt) && (defined $pkgt->{$pbpkg})) {
146 $pbtag = $pkgt->{$pbpkg};
[115]147 $ENV{'PBTAG'} = $pbtag;
[9]148 } else {
[16]149 $pbtag = $ENV{'PBTAG'};
[9]150 }
[95]151
[16]152 $pbrev = $ENV{'PBREVISION'};
[112]153 print $LOG "\n";
154 print $LOG "Management of $pbpkg $pbver-$pbtag (rev $pbrev)\n";
[9]155 die "Unable to get env var PBDESTDIR" if (not defined $ENV{'PBDESTDIR'});
[16]156 # Clean up dest if necessary. The export will recreate it
[27]157 my $dest = "$ENV{'PBDESTDIR'}/$pbpkg-$pbver";
[74]158 pb_rm_rf($dest) if (-d $dest);
[9]159
160 # Export CMS tree for the concerned package to dest
161 # And generate some additional files
162 $OUTPUT_AUTOFLUSH=1;
[29]163
[9]164 # computes in which dir we have to work
[113]165 my $dir = $defpkgdir->{$pbpkg};
166 $dir = $extpkgdir->{$pbpkg} if (not defined $dir);
[114]167 print "def:".Dumper($defpkgdir)." ext: ".Dumper($extpkgdir)." \n" if ($debug >= 1);
[112]168 pb_cms_export($cms,$pbdatecvs,"$ENV{'PBROOT'}/$dir",$dest);
[9]169
170 # Extract cms log history and store it
[106]171 pb_cms_log($cms,"$ENV{'PBROOT'}/$dir","$dest/$ENV{'PBCMSLOGFILE'}");
[29]172
[21]173 my %build;
[91]174
175 my ($ptr) = pb_conf_get("vmlist");
176 foreach my $d (split(/,/,$ptr->{$ENV{'PBPROJ'}})) {
177 my ($name,$ver) = split(/_/,$d);
[11]178 chomp($ver);
[99]179 my ($ddir, $dver, $dfam, $dtype, $pbsuf) = pb_distro_init($name,$ver);
180 print $LOG "DEBUG: distro tuple: ".Dumper($ddir, $dver, $dfam, $dtype, $pbsuf)."\n" if ($debug >= 1);
[22]181 print $LOG "DEBUG Filtering PBDATE => $pbdate, PBTAG => $pbtag, PBVER => $pbver\n" if ($debug >= 1);
[13]182
[16]183 # Filter build files from the less precise up to the most with overloading
[13]184 # Filter all files found, keeping the name, and generating in dest
[16]185
186 # Find all build files first relatively to PBROOT
187 my %bfiles;
[27]188 print $LOG "DEBUG dir: $ENV{'PBCONF'}/$pbpkg\n" if ($debug >= 1);
[21]189 $build{"$ddir-$dver"} = "yes";
[27]190 if (-d "$ENV{'PBCONF'}/$pbpkg/$dtype") {
191 opendir(BDIR,"$ENV{'PBCONF'}/$pbpkg/$dtype") || die "Unable to open dir $ENV{'PBCONF'}/$pbpkg/$dtype: $!";
[16]192 foreach my $f (readdir(BDIR)) {
193 next if ($f =~ /^\./);
[27]194 $bfiles{$f} = "$ENV{'PBCONF'}/$pbpkg/$dtype/$f";
[16]195 $bfiles{$f} =~ s~$ENV{'PBROOT'}~~;
196 }
[13]197 closedir(BDIR);
[27]198 } elsif (-d "$ENV{'PBCONF'}/$pbpkg/$dfam") {
199 opendir(BDIR,"$ENV{'PBCONF'}/$pbpkg/$dfam") || die "Unable to open dir $ENV{'PBCONF'}/$pbpkg/$dfam: $!";
[16]200 foreach my $f (readdir(BDIR)) {
201 next if ($f =~ /^\./);
[27]202 $bfiles{$f} = "$ENV{'PBCONF'}/$pbpkg/$dfam/$f";
[16]203 $bfiles{$f} =~ s~$ENV{'PBROOT'}~~;
204 }
205 closedir(BDIR);
[27]206 } elsif (-d "$ENV{'PBCONF'}/$pbpkg/$ddir") {
207 opendir(BDIR,"$ENV{'PBCONF'}/$pbpkg/$ddir") || die "Unable to open dir $ENV{'PBCONF'}/$pbpkg/$ddir: $!";
[16]208 foreach my $f (readdir(BDIR)) {
209 next if ($f =~ /^\./);
[27]210 $bfiles{$f} = "$ENV{'PBCONF'}/$pbpkg/$ddir/$f";
[16]211 $bfiles{$f} =~ s~$ENV{'PBROOT'}~~;
212 }
[13]213 closedir(BDIR);
[27]214 } elsif (-d "$ENV{'PBCONF'}/$pbpkg/$ddir-$dver") {
215 opendir(BDIR,"$ENV{'PBCONF'}/$pbpkg/$ddir-$dver") || die "Unable to open dir $ENV{'PBCONF'}/$pbpkg/$ddir-$dver: $!";
[16]216 foreach my $f (readdir(BDIR)) {
217 next if ($f =~ /^\./);
[27]218 $bfiles{$f} = "$ENV{'PBCONF'}/$pbpkg/$ddir-$dver/$f";
[16]219 $bfiles{$f} =~ s~$ENV{'PBROOT'}~~;
220 }
[13]221 closedir(BDIR);
222 } else {
[21]223 $build{"$ddir-$dver"} = "no";
[13]224 next;
225 }
[22]226 print $LOG "DEBUG bfiles: ".Dumper(\%bfiles)."\n" if ($debug >= 1);
[13]227
[15]228 # Get all filters to apply
[77]229 my $ptr = pb_get_filters($pbpkg, $dtype, $dfam, $ddir, $dver);
[15]230
[19]231 # Apply now all the filters on all the files concerned
232 # destination dir depends on the type of file
233 if (defined $ptr) {
234 foreach my $f (values %bfiles) {
[112]235 pb_filter_file_pb("$ENV{'PBROOT'}/$f",$ptr,"$dest/pbconf/$ddir-$dver/".basename($f),$dtype,$pbsuf,$pbpkg,$pbver,$pbtag,$pbrev,$pbdate,$defpkgdir,$extpkgdir);
[16]236 }
[113]237 if (defined $filteredfiles->{$pbpkg}) {
238 foreach my $f (split(/,/,$filteredfiles->{$pbpkg})) {
[99]239 pb_filter_file("$ENV{'PBROOT'}/$dir/$f",$ptr,"$dest/$f",$pbsuf,$pbpkg,$pbver,$pbtag,$pbrev,$pbdate);
[61]240 }
[19]241 }
[15]242 }
[18]243 }
[21]244 if ($debug >= 0) {
245 my @found;
246 my @notfound;
247 foreach my $b (keys %build) {
248 push @found,$b if ($build{$b} =~ /yes/);
249 push @notfound,$b if ($build{$b} =~ /no/);
250 }
[22]251 print $LOG "Build files generated for ".join(',',@found)."\n";
252 print $LOG "No Build files found for ".join(',',@notfound)."\n";
[21]253 }
[18]254 # Prepare the dest directory for archive
[60]255 if (-x "$ENV{'PBCONF'}/$pbpkg/pbinit") {
[108]256 #pb_system("cd $dest ; $ENV{'PBCONF'}/$pbpkg/pbinit","Executing init script $ENV{'PBCONF'}/$pbpkg/pbinit");
257 print $LOG "Executing init script $ENV{'PBCONF'}/$pbpkg/pbinit\n";
258 system("cd $dest ; $ENV{'PBCONF'}/$pbpkg/pbinit");
[11]259 }
[29]260
[18]261 # Archive dest dir
[69]262 chdir "$ENV{'PBDESTDIR'}" || die "Unable to change dir to $ENV{'PBDESTDIR'}";
[25]263 # Possibility to look at PBSRC to guess more the filename
[94]264 pb_system("tar cfz $pbpkg-$pbver.tar.gz $pbpkg-$pbver","Creating $pbpkg tar files compressed");
[31]265 print $LOG "Under $ENV{'PBDESTDIR'}/$pbpkg-$pbver.tar.gz\n" if ($debug >= 0);
[83]266
[70]267 # Keep track of what is generated for default
[113]268 open(LAST,"> $pbrc->{$ENV{'PBPROJ'}}") || die "Unable to create $pbrc->{$ENV{'PBPROJ'}}";
[83]269 print LAST "pbroot $pbprojver-$pbprojtag = $ENV{'PBROOT'}\n";
270 close(LAST);
271
272 # Keep track of per package version
273 if (! -f "$ENV{'PBDESTDIR'}/$pbprojver-$pbprojtag.pb") {
274 open(PKG,">$ENV{'PBDESTDIR'}/$pbprojver-$pbprojtag.pb") || die "Unable to create $ENV{'PBDESTDIR'}/$pbprojver-$pbprojtag.pb";
275 print PKG "# Empty\n";
276 close(PKG);
277 }
[89]278 my ($pkg) = pb_conf_read("$ENV{'PBDESTDIR'}/$pbprojver-$pbprojtag.pb","pbpkg");
[83]279 $pkg = { } if (not defined $pkg);
[88]280 if ((not defined $pkg->{$pbpkg}) || ($pkg->{$pbpkg} ne "$pbver-$pbtag")) {
281 $pkg->{$pbpkg} = "$pbver-$pbtag";
[83]282 }
283
[88]284 print $LOG "DEBUG pkg: ".Dumper($pkg)."\n" if ($debug >= 1);
[83]285 open(PKG,"> $ENV{'PBDESTDIR'}/$pbprojver-$pbprojtag.pb") || die "Unable to create $ENV{'PBDESTDIR'}/$pbprojver-$pbprojtag.pb";
[88]286 foreach my $p (keys %$pkg) {
287 print PKG "pbpkg $p = $pkg->{$p}\n";
[83]288 }
289 close(PKG);
[9]290 }
[77]291}
[22]292
[77]293sub pb_build2pkg {
294
[22]295 # Get list of packages to build
[112]296 my $ptr = pb_get_pkg($defpkgdir,$extpkgdir);
[22]297 @pkgs = @$ptr;
298
299 # Get the running distro to build on
[99]300 my ($ddir, $dver, $dfam, $dtype, $pbsuf) = pb_distro_init();
301 print $LOG "DEBUG: distro tuple: ".join(',',($ddir, $dver, $dfam, $dtype, $pbsuf))."\n" if ($debug >= 1);
[22]302
[83]303 # Get content saved in cms2build
[89]304 my ($pkg) = pb_conf_read("$ENV{'PBDESTDIR'}/$pbprojver-$pbprojtag.pb","pbpkg");
[83]305 $pkg = { } if (not defined $pkg);
306
[25]307 chdir "$ENV{'PBBUILDDIR'}";
[126]308 my $made = ""; # pkgs made during build
[27]309 foreach my $pbpkg (@pkgs) {
[88]310 my $vertag = $pkg->{$pbpkg};
[77]311 # get the version of the current package - maybe different
312 ($pbver,$pbtag) = split(/-/,$vertag);
313
[27]314 my $src="$ENV{'PBDESTDIR'}/$pbpkg-$pbver.tar.gz";
[67]315 print $LOG "Source file: $src\n" if ($debug >= 0);
[25]316
317 if ($dtype eq "rpm") {
[28]318 print $LOG "Working under $ENV{'PBBUILDDIR'}\n" if ($debug >= 0);
[25]319 foreach my $d ('RPMS','SRPMS','SPECS','SOURCES','BUILD') {
[28]320 if (! -d "$ENV{'PBBUILDDIR'}/$d") {
[96]321 pb_mkdir_p("$ENV{'PBBUILDDIR'}/$d") || die "Please ensure that you can write into $ENV{'PBBUILDDIR'} to create $d\nchown the $ENV{'PBBUILDDIR'} directory to your uid";
[28]322 }
[25]323 }
324
325 # We need to first extract the spec file
[28]326 symlink "$src","$ENV{'PBBUILDDIR'}/SOURCES/".basename($src) || die "Unable to symlink $src in $ENV{'PBBUILDDIR'}/SOURCES";
327 my @specfile;
[77]328 @specfile = pb_extract_build_files($src,"$pbpkg-$pbver/pbconf/$ddir-$dver/","$ENV{'PBBUILDDIR'}/SPECS");
[25]329
[28]330 print $LOG "specfile: ".Dumper(\@specfile)."\n" if ($debug >= 1);
[25]331 # set LANGUAGE to check for correct log messages
332 $ENV{'LANGUAGE'}="C";
[28]333 #system("ls -R $ENV{'PBBUILDDIR'}") if ($debug >= 1);
334 foreach my $f (@specfile) {
335 if ($f =~ /\.spec$/) {
[97]336 pb_system("rpmbuild --define \"_topdir $ENV{'PBBUILDDIR'}\" -ba $f","Building package with $f under $ENV{'PBBUILDDIR'}");
[28]337 last;
338 }
339 }
[126]340 $made="$made $ENV{'PBBUILDDIR'}/RPMS/*/$pbpkg-$pbver-$pbtag$pbsuf.*.rpm $ENV{'PBBUILDDIR'}/SRPMS/$pbpkg-$pbver-$pbtag$pbsuf.src.rpm";
[118]341 } elsif ($dtype eq "deb") {
342 my $tmp = "$ENV{'PBBUILDDIR'}/$pbpkg";
[126]343 $made="$made $tmp"."_*.deb $tmp"."_*.dsc $tmp"."_*.tar.gz";
[87]344 } elsif ($dtype eq "ebuild") {
[126]345 $made="$made $ENV{'PBBUILDDIR'}/portage/*/$pbpkg/$pbpkg-$pbver.ebuild";
[87]346 pb_mkdir_p("$ENV{'PBBUILDDIR'}/portage") if (! -d "$ENV{'PBBUILDDIR'}/portage");
[118]347 } elsif ($dtype eq "slackware") {
[127]348 $made="$made $ENV{'PBBUILDDIR'}/build-$pbpkg/$pbpkg-$pbver-*-$pbtag.tgz";
[118]349 pb_mkdir_p("$ENV{'PBBUILDDIR'}/install") if (! -d "$ENV{'PBBUILDDIR'}/install");
[87]350 } else {
[118]351 die "Unknown dtype format $dtype";
[87]352 }
353 }
[118]354 # Keep track of what is generated so that we can get them back from VMs
[129]355 open(KEEP,"> $ENV{'PBBUILDDIR'}/pbgen-$pbprojver-$pbprojtag") || die "Unable to create $ENV{'PBBUILDDIR'}/pbgen-$pbprojver-$pbprojtag";
[118]356 print KEEP "$made\n";
357 close(KEEP);
[87]358}
359
[88]360sub pb_build2ssh {
[90]361 pb_send2ssh("Sources");
362}
[87]363
[90]364sub pb_pkg2ssh {
365 pb_send2ssh("Packages");
366}
367
[108]368# By default deliver to the the public site hosting the
369# ftp structure (or whatever) or a VM
[90]370sub pb_send2ssh {
371
372 my $cmt = shift;
[118]373 my $vm = shift || undef;
[108]374 my $host = shift || "sshhost";
375 my $login = shift || "sshlogin";
376 my $dir = shift || "sshdir";
377 my $port = shift || "sshport";
[90]378
[87]379 # Get list of packages to build
[112]380 my $ptr = pb_get_pkg($defpkgdir,$extpkgdir);
[87]381 @pkgs = @$ptr;
382
383 # Get the running distro to build on
[118]384 my ($odir,$over) = (undef, undef);
385 if (defined $vm) {
386 ($odir,$over) = split(/_/,$vm);
387 }
388 my ($ddir, $dver, $dfam, $dtype, $pbsuf) = pb_distro_init($odir,$over);
[99]389 print $LOG "DEBUG: distro tuple: ".join(',',($ddir, $dver, $dfam, $dtype, $pbsuf))."\n" if ($debug >= 1);
[87]390
391 # Get content saved in cms2build
[89]392 my ($pkg) = pb_conf_read("$ENV{'PBDESTDIR'}/$pbprojver-$pbprojtag.pb","pbpkg");
[87]393 $pkg = { } if (not defined $pkg);
394
[118]395 my $src = "";
[87]396 chdir "$ENV{'PBBUILDDIR'}";
397 foreach my $pbpkg (@pkgs) {
[88]398 my $vertag = $pkg->{$pbpkg};
[87]399 # get the version of the current package - maybe different
400 ($pbver,$pbtag) = split(/-/,$vertag);
401
[118]402 if (($cmt eq "Sources") || ($cmt eq "VMs")) {
403 $src="$src $ENV{'PBDESTDIR'}/$pbpkg-$pbver.tar.gz";
404 }
405 }
406 if ($cmt eq "VMs") {
[132]407 $src="$src $ENV{'PBDESTDIR'}/pbscript $ENV{'PBCONF'}/$ENV{'PBPROJ'}.pb $ENV{'PBDESTDIR'}/$pbprojver-$pbprojtag.pb $ENV{'PBETC'}";
[118]408 } elsif ($cmt eq "Packages") {
409 # Get package list from file made during build2pkg
[129]410 open(KEEP,"$ENV{'PBBUILDDIR'}/pbgen-$pbprojver-$pbprojtag") || die "Unable to read $ENV{'PBBUILDDIR'}/pbgen-$pbprojver-$pbprojtag";
[126]411 $src = <KEEP>;
[118]412 chomp($src);
413 close(KEEP);
414 if ($dtype eq "rpm") {
415 # Also make a pbscript to generate yum/urpmi bases
[108]416 # $src = "$src $ENV{'PBDESTDIR'}/pbscript"
[118]417 } elsif ($dtype eq "deb") {
418 # Also make a pbscript to generate apt bases
419 # $src = "$src $ENV{'PBDESTDIR'}/pbscript"
[90]420 }
[87]421 }
[132]422 # Remove potential leading spaces (cause pb with basename)
423 $src =~ s/^ *//;
[129]424 my $basesrc = "";
[131]425 foreach my $i (split(/ +/,$src)) {
426 $basesrc .= " ".basename($i);
[130]427 }
[118]428
[128]429 print $LOG "Sources handled ($cmt): $src\n" if ($debug >= 0);
[108]430 my ($sshhost,$sshlogin,$sshdir,$sshport) = pb_conf_get($host,$login,$dir,$port);
[88]431 my $mac = "$sshlogin->{$ENV{'PBPROJ'}}\@$sshhost->{$ENV{'PBPROJ'}}";
[108]432 my $tdir;
[90]433 if ($cmt eq "Sources") {
[108]434 $tdir = "$sshdir->{$ENV{'PBPROJ'}}/src";
435 } elsif ($cmt eq "VMs") {
[129]436 $tdir = dirname("$sshdir->{$ENV{'PBPROJ'}}");
[90]437 } elsif ($cmt eq "Packages") {
[108]438 $tdir = "$sshdir->{$ENV{'PBPROJ'}}/$ddir/$dver";
[90]439 } else {
440 return;
[22]441 }
[132]442 # Remove a potential $ENV{'HOME'} as tdir shold be relative to pb's home
443 $tdir =~ s|\$ENV.+\}/||;
444
[111]445 $port = $sshport->{$ENV{'PBPROJ'}};
[132]446 pb_system("ssh -q -p $port $mac \"mkdir -p $tdir/delivery ; cd $tdir/delivery ; rm -f $basesrc\"","Preparing $tdir on $mac");
447 pb_system("scp -p -P $port $src $mac:$tdir/delivery","$cmt delivery in $tdir on $mac");
448 pb_system("ssh -q -p $port $mac \"echo \'cd $tdir/delivery ; if [ -f pbscript ]; then ./pbscript; fi\' | bash\"","Executing pbscript on $mac if needed");
[108]449 if ($cmt eq "VMs") {
[128]450 # Get back info on pkg produced, compute their name and get them from the VM
[132]451 pb_system("scp -p -P $port $mac:$tdir/delivery/pbgen-$pbprojver-$pbprojtag $ENV{'PBBUILDDIR'}","Get package names in $tdir on $mac");
[129]452 open(KEEP,"$ENV{'PBBUILDDIR'}/pbgen-$pbprojver-$pbprojtag") || die "Unable to read $ENV{'PBBUILDDIR'}/pbgen-$pbprojver-$pbprojtag";
[118]453 my $src = <KEEP>;
454 chomp($src);
455 close(KEEP);
[131]456 $src =~ s/^ *//;
[132]457 $src =~ s/ +/,/g;
458 pb_system("scp -p -P $port $mac:$tdir/delivery/{$src} $ENV{'PBBUILDDIR'}/$odir/$over","Package recovery of in $tdir from $mac");
459 #pb_system("ssh -q -p $port $mac \"rm -rf $tdir ; sido /usr/bin/poweroff\"","VM cleanup and halt on $mac");
[126]460 pb_send2ssh("Packages","$odir"."_"."$over");
[132]461 pb_rm_rf("$ENV{'PBBUILDDIR'}/$odir");
[108]462 }
[9]463}
[16]464
[105]465sub pb_build2vm {
466 my ($vm,$all) = pb_get_vm();
[106]467
[108]468 # Prepare the script to be executed on the VM
469 # in $ENV{'PBDESTDIR'}/pbscript
[118]470 open(SCRIPT,"> $ENV{'PBDESTDIR'}/pbscript") || die "Unable to create $ENV{'PBDESTDIR'}/pbscript";
471 print SCRIPT "#!/bin/bash\n";
[126]472 print SCRIPT "echo ... Execution needed\n";
[132]473 print SCRIPT "# This is in directory delivery\n";
[118]474 print SCRIPT "# Setup the variables required for building\n";
475 print SCRIPT "export PBPROJ=$ENV{'PBPROJ'}\n";
[132]476 print SCRIPT "# Preparation for pb\n";
477 print SCRIPT "mkdir -p ../pbconf\n";
478 print SCRIPT "mv $ENV{'PBPROJ'}.pb ../pbconf\n";
479 print SCRIPT "mv .pbrc \$HOME\n";
480 print SCRIPT "cd ..\n";
[118]481 print SCRIPT "export PBROOT=\`pwd\`\n";
482 print SCRIPT "# Build\n";
[127]483 my $p = "";
484 $p = $ARGV[0] if (defined $ARGV[0]);
[132]485 print SCRIPT "echo Building packages on VM...\n";
[127]486 print SCRIPT "pb build2pkg $p\n";
[118]487 close(SCRIPT);
488 chmod 0755,"$ENV{'PBDESTDIR'}/pbscript";
489
[106]490 # Send tar files when we do a global generation
491 pb_build2ssh() if ($all == 1);
[118]492
493 foreach my $v (@$vm) {
494 # Launch the VMs
[128]495 my ($ptr,$vmopt,$vmport,$vmpath) = pb_conf_get("vmtype","vmopt","vmport","vmpath");
[127]496 my $vmtype = $ptr->{$ENV{'PBPROJ'}};
[128]497 if (defined $vmopt->{$ENV{'PBPROJ'}}) {
498 $ENV{'PBVMOPT'} = $vmopt->{$ENV{'PBPROJ'}};
[127]499 } else {
500 $ENV{'PBVMOPT'} = "";
501 }
[118]502
[127]503 my $cmd;
504 if ($vmtype eq "qemu") {
505 my $arch = `uname -m`;
506 chomp($arch);
507 my $qemucmd;
508 my $qemucmd32;
509 my $qemucmd64;
510 if ($arch eq "x86_64") {
511 $qemucmd32 = "/usr/bin/qemu-system-i386";
512 $qemucmd64 = "/usr/bin/qemu";
513 } else {
514 $qemucmd32 = "/usr/bin/qemu";
515 $qemucmd64 = "/usr/bin/qemu-system-x86_64";
516 }
517 if ($v =~ /_64/) {
518 $qemucmd = "$qemucmd64 -no-kqemu";
519 } else {
520 $qemucmd = "$qemucmd32";
521 }
[128]522 if (! -f "$vmpath->{$ENV{'PBPROJ'}}/$v.qemu") {
523 print "Unable to find VM $vmpath->{$ENV{'PBPROJ'}}/$v.qemu";
[127]524 next;
525 }
[128]526 $cmd = "$qemucmd $ENV{'PBVMOPT'} -redir tcp:$vmport->{$ENV{'PBPROJ'}}:10.0.2.15:22 $vmpath->{$ENV{'PBPROJ'}}/$v.qemu"
[127]527 } elsif ($vmtype eq "xen") {
528 } elsif ($vmtype eq "vmware") {
529 } else {
530 die "VM of type $vmtype not supported. Report to the dev team";
531 }
532 pb_system("$cmd &","Launching the VM");
533 pb_system("sleep 300","Waiting for it to come up");
534
[118]535 # Gather all required files to send them to the VM and launch the build thourgh pbscript
[128]536 pb_send2ssh("VMs","$v","vmhost","vmlogin","pbrc","vmport");
[118]537 }
[105]538}
539
[77]540sub pb_get_pkg {
[16]541
[22]542my @pkgs;
[108]543my $defpkgdir = shift;
544my $extpkgdir = shift;
[22]545
546# Get packages list
547if (not defined $ARGV[0]) {
[112]548 @pkgs = keys %$defpkgdir;
[22]549} elsif ($ARGV[0] =~ /^all$/) {
[112]550 @pkgs = keys %$defpkgdir;
551 push(@pkgs, keys %$extpkgdir);
[22]552} else {
553 @pkgs = @ARGV;
554}
555print $LOG "Packages: ".join(',',@pkgs)."\n" if ($debug >= 0);
556return(\@pkgs);
557}
558
[105]559#
560# Return the list of VMs we are working on
561# $all is a flag to know if we return all of them
562# or only some (if all we publish also tar files in addition to pkgs
563#
[91]564sub pb_get_vm {
565
566my @vm;
[105]567my $all = 0;
[91]568
569# Get VM list
[105]570if ((not defined $ENV{'PBVM'}) || ($ENV{'PBVM'} =~ /^all$/)) {
[108]571 my ($ptr) = pb_conf_get("vmlist");
[105]572 $ENV{'PBVM'} = $ptr->{$ENV{'PBPROJ'}};
573 $all = 1;
[91]574}
[105]575@vm = split(/,/,$ENV{'PBVM'});
[108]576print $LOG "VMs: ".join(',',@vm)."\n";
[105]577return(\@vm,$all);
[91]578}
579
[77]580sub pb_extract_build_files {
[25]581
582my $src=shift;
583my $dir=shift;
[26]584my $ddir=shift;
[28]585my @files;
[25]586
[106]587pb_system("tar xfpz $src $dir","Extracting build files");
[25]588opendir(DIR,"$dir") || die "Unable to open directory $dir";
589foreach my $f (readdir(DIR)) {
590 next if ($f =~ /^\./);
[26]591 move("$dir/$f","$ddir") || die "Unable to move $dir/$f to $ddir";
[28]592 print $LOG "mv $dir/$f $ddir\n" if ($debug >= 1);
593 push @files,"$ddir/$f";
[25]594}
595closedir(DIR);
[26]596# Not enough but still a first cleanup
[74]597pb_rm_rf("$dir");
[28]598return(@files);
[25]599}
600
[74]601sub pb_syntax {
[21]602
[53]603 print "pb (aka project-builder) Version $projectbuilderver-$projectbuilderrev\n";
604 print "\n";
[105]605 print "Syntax: pb [-vhqt][-r pbroot][-p project][-m \"mach-1[,...]\"] <action> [<pkg1>...]\n";
[21]606 print "\n";
607 print "-h : This help file\n";
608 print "-q : Quiet mode\n";
609 print "-t : Test mode (not done yet)\n";
610 print "-v : Verbose mode\n";
611 print "\n";
[91]612 print "-m machine : Name of the virtual Machines you want\n";
613 print " to build on (space separated) \n";
614 print " (or use the env variable PBVM) \n";
[69]615 print "\n";
[21]616 print "-p project : Name of the project you're working on\n";
617 print " (or use the env variable PBPROJ) \n";
618 print "\n";
[91]619 print "-r pbroot : Path Name of project under the CMS \n";
620 print " (or use the env variable PBROOT) \n";
621 print "\n";
[21]622 print "<action> can be:\n";
623 print "\n";
[105]624 print "\tcms2build: Create tar files for the project under your CMS\n";
[21]625 print "\t CMS supported are SVN and CVS\n";
[22]626 print "\t parameters are packages to build\n";
627 print "\t if not using default list\n";
[21]628 print "\n";
629 print "\tbuild2pkg: Create packages for your running distribution \n";
[22]630 print "\t first parameter is version-tag to build\n";
631 print "\t if not using default version-tag\n";
632 print "\t following parameters are packages to build\n";
633 print "\t if not using default list\n";
[21]634 print "\n";
[105]635 print "\tbuild2ssh: Send the tar files to a SSH host \n";
636 print "\n";
637 print "\tpkg2ssh: Send the packages built to a SSH host \n";
638 print "\n";
[77]639 print "\tcms2pkg: cms2build + build2pkg\n";
[21]640 print "\n";
641}
Note: See TracBrowser for help on using the repository browser.