windows-nt/Source/XPSP1/NT/tools/sp/propbuild.cmd
2020-09-26 16:20:57 +08:00

414 lines
12 KiB
Batchfile

@echo off
REM ------------------------------------------------------------------
REM
REM propbuild.cmd
REM Propgate the build to the release server.
REM
REM Copyright (c) Microsoft Corporation. All rights reserved.
REM Version: < 1.0 > 04/26/2002 Suemiao Rossignol
REM ------------------------------------------------------------------
perl -x "%~f0" %*
goto :EOF
#!perl
use strict;
use lib "$ENV{RAZZLETOOLPATH}\\PostBuildScripts";
use lib $ENV{RAZZLETOOLPATH};
use Logmsg;
use ParseArgs;
use File::Basename;
use comlib;
use GetIniSetting;
use WaitProc;
$ENV{script_name} = basename( $0 );
sub Usage {
print<<USAGE;
Pull XPSP1 build to release servers.
Usage:
$ENV{script_name} -n:<Build Number> [-s:<Source Server>] [-d:<Target Server>]
[-a:<Build Architecture>] [-t:<Build Debug Type>]
[-mail][-d] [-p]
-n: Build Number.
-s: Source Server.
Default is %computername%.
-d: Target Server.
Default is %computername%.
-c: Conglomeration Server.
Default is defined in the xpsp1.ini.
-a: Build Architecture. x86 or ia64.
Default is $ENV{_BuildArch}.
-t: Build Debug Type. fre or chk.
Default is $ENV{_BuildType}.
-mail Send notification mail to BVT.
-p: Powerless.
-qfe qfe number
-? Display Usage.
USAGE
exit(1)
}
my ( $buildNo, $relPath, $srcServer, $relServer, @aggServers );
my ( $isThinRelease );
my ( $buildArch, $buildType, $sendMail, $isPowerLess );
my ( $qfe);
if( !&GetParams() ) { &ExitWithStatus(1); }
timemsg( "Start $ENV{script_name}" );
if( !&InitVars() ) { &ExitWithStatus(1); }
if( !&PushRelease() ){ &ExitWithStatus(1); }
&ExitWithStatus(0);
#-----------------------------------------------------------------------------
sub ExitWithStatus
{
my ( $pStatus ) = @_;
if( $pStatus == 0 )
{
timemsg( "Complete $ENV{script_name} - NO ERRORS ENCOUNTERED" );
}
else
{
timemsg( "Complete $ENV{script_name} - ERRORS ENCOUNTERED" );
}
# Copy log file over the rlease server
my $temp = $ENV{temp};
$temp =~ s/\:/\$/;
&comlib::ExecuteSystemX( "copy $ENV{LOGFILE} \\\\$relServer\\$temp", $isPowerLess ) if( -e $ENV{LOGFILE} );
&comlib::ExecuteSystemX( "copy $ENV{ERRFILE} \\\\$relServer\\$temp", $isPowerLess ) if( -e $ENV{ERRFILE} );
# repeat this for allrel.cmd to be able to parse status correctly
if( $pStatus == 0 )
{
timemsg( "Complete $ENV{script_name} - NO ERRORS ENCOUNTERED" );
}
else
{
timemsg( "Complete $ENV{script_name} - ERRORS ENCOUNTERED" );
}
exit($pStatus);
}
#-----------------------------------------------------------------------------
sub GetParams
{
parseargs('?' => \&Usage, 'l:' =>\$ENV{lang}, 'n:' => \$buildNo,
's:' =>\$srcServer, 'd:' =>\$relServer, 'c:' =>\@aggServers,
'a:' =>\$buildArch, 't:' =>\$buildType,
'p'=>\$isPowerLess, 'mail'=>\$sendMail ,'-qfe:' => \$qfe);
$ENV{lang}="usa" if( !$ENV{lang} );
if( !$buildNo && !$qfe )
{
errmsg( "Please enter build number or qfe num." );
return 0;
}
$srcServer = $ENV{computername} if( !$srcServer );
$relServer = $ENV{computername} if( !$relServer );
if( !$buildArch ) { $buildArch = $ENV{_BuildArch}; }
elsif( lc $buildArch ne "x86" && lc $buildArch ne "ia64" )
{
errmsg( "Invalid Build Architecture." );
return 0;
}
if( !$buildType ) { $buildType = $ENV{_BuildType}; }
elsif( lc $buildType ne "fre" && lc $buildType ne "chk" )
{
errmsg( "Invalid Build Debug Type." );
return 0;
}
if( $sendMail ){ $sendMail = 1; } else { $sendMail = 0; }
&comlib::ResetLogErrFile("propbuild.$buildNo.$buildArch$buildType.$relServer");
return 1;
}
#-----------------------------------------------------------------------------
sub InitVars
{
# Check source server is available
if( !&comlib::ExecuteSystem( "net view $srcServer >nul 2>nul") )
{
errmsg( "Failed to see [$srcServer] via net view, exit. ");
return 0;
}
# Check source path is existing
if (!$qfe) {
$relPath = "\\release\\$buildNo\\$ENV{lang}\\$buildArch$buildType";
} else {
$relPath = "\\release\\Q$qfe\\$buildArch$buildType";
}
if( !(-e "\\\\$srcServer$relPath" ) )
{
errmsg( "[\\\\$srcServer$relPath] does not exist" );
return 0;
}
# Verify access of the target server
if( system( "net view $relServer >nul 2>nul") )
{
errmsg( "Failed to see [$relServer] via net view. ");
return 0;
}
# Define Conglomeration Servers
if( !@aggServers )
{
my $iniAggServers = &GetIniSetting::GetSetting( "ConglomerationServers::$ENV{lang}" );
@aggServers = split( /\s+/, $iniAggServers );
}
# Check if runs for thin release
my $iniThinServers = &GetIniSetting::GetSetting( "ThinRelease" );
my @thinServers = split( /\s+/,$iniThinServers );
for ( @thinServers ) { if( lc $relServer eq lc $_ ){ $isThinRelease = 1; last; } }
# Check if the release server need to send BVT mail
my $tmp = &GetIniSetting::GetSetting( "SendBVTMailServer" );
my @mailBVTServers = split( /\s/, $tmp);
if( $sendMail )
{
$sendMail = 0;
for( @mailBVTServers ) { if( lc $relServer eq lc $_ ){ $sendMail = 1; last; } }
}
logmsg( "Lauguage .............[$ENV{lang}]" );
logmsg( "Build No .............[$buildNo]" );
logmsg( "Source Serevr. .......[$srcServer]" );
logmsg( "Release Server .......[$relServer]" );
logmsg( "Build Platform .......[$buildArch$buildType]" );
logmsg( "Release Path .........[$relPath]" );
logmsg( "Conglomeration Servers[@aggServers]" );
logmsg( "Is Thin Release ......[$isThinRelease]" );
logmsg( "Need Send mail to BVT.[$sendMail]" );
logmsg( "Temp Log file ........[$ENV{LOGFILE}]" );
logmsg( "Temp Error file ......[$ENV{ERRFILE}]" );
logmsg( "PID ..................[$$]");
return 1;
}
#-----------------------------------------------------------------------------
sub ThinCopy
{
my $dash = '-' x 60;
logmsg ( $dash );
my $src = "\\\\$srcServer$relPath";
my $dest = "\\\\$relServer$relPath";
my @thinDirs = ( "netfx", "idw", "perinf\\idw", "setuptxt","support", "valueadd","OPK" ,"symbolcd", "ddk_cd", "hal_cd", "processor_cd", "ifs_cd", "mantis", "eval" );
my @thinFiles = ( "xpsp1.exe" , "dump\\epidgen.dll" , "dump\\vpidgen.dll", "nt5inf.cat" );
my @thinDirsx86 = ( "makeboot", "realsign", "perinf\\realsign","bootfloppy", "perinf\\bootfloppy", "eval.wpa.wksinf\\dpcdll.dll" );
my @thinFilesx86 = ( "netfxocm\\netfx.cab", "bflics.txt", "tabletpc.cab", "mediactr.cab","bfcab.inf", "perinf\\bfcab.inf", "perinf\\nt5inf.cat" );
my @thinDirsia64 = ( "EFIpart");
# Copy upd folder under bin
my $from = "$src\\upd";
my $to = "$dest\\bin\\upd";
&comlib::ExecuteSystemX( "md $to", $isPowerLess ) if( !(-e $to ) );
return 0 if( !&comlib::ExecuteSystemX( "compdir /eknst $from $to", $isPowerLess ) );
$src .= "\\bin";
$dest .= "\\bin";
# Copy dirs
for my $theDir ( @thinDirs )
{
$from = "$src\\$theDir";
$to = "$dest\\$theDir";
next if( !(-e $from) );
&comlib::ExecuteSystemX( "md $to", $isPowerLess ) if( !(-e $to ) );
return 0 if( !&comlib::ExecuteSystemX( "compdir /eknst $from $to", $isPowerLess ) );
}
# Copy files
for my $theFile ( @thinFiles )
{
$from = "$src\\$theFile";
$to = "$dest\\$theFile";
if( $to =~ /^(.+)\\[^\\]+$/ )
{
&comlib::ExecuteSystemX( "md $1", $isPowerLess ) if( !(-e $1 ) );
}
return 0 if( !&comlib::ExecuteSystemX( "copy $from $to", $isPowerLess ) );
}
if( lc $buildArch eq "x86" )
{
for my $theDir ( @thinDirsx86 )
{
$from = "$src\\$theDir";
$to = "$dest\\$theDir";
&comlib::ExecuteSystemX( "md $to", $isPowerLess ) if( !(-e $to ) );
return 0 if( !&comlib::ExecuteSystemX( "compdir /eknst $from $to", $isPowerLess ) );
}
for my $theFile ( @thinFilesx86 )
{
$from = "$src\\$theFile";
$to = "$dest\\$theFile";
if( $to =~ /^(.+)\\[^\\]+$/ )
{
&comlib::ExecuteSystemX( "md $1", $isPowerLess ) if( !(-e $1 ) );
}
if( -e $from )
{
return 0 if( !&comlib::ExecuteSystemX( "copy $from $to", $isPowerLess ) );
}
}
}
elsif( lc $buildArch eq "ia64" )
{
for my $theDir ( @thinDirsia64 )
{
$from = "$src\\$theDir";
$to = "$dest\\$theDir";
&comlib::ExecuteSystemX( "md $to", $isPowerLess ) if( !(-e $to ) );
return 0 if( !&comlib::ExecuteSystemX( "compdir /eknst $from $to", $isPowerLess ) );
}
}
# Create SLP
logmsg ( $dash );
#my $cmdLine = "echo cd /d ^%^sdxroot%^\\tools\\sp ^& ";
my $cmdLine = "echo pushd ^^%RazzleToolPath^^% ^& echo sd sync ... ^& echo popd ^&";
$cmdLine .= " echo start /min cmd /c ^^%RazzleToolPath^^%\\sp\\BuildSlp.cmd ";
$cmdLine .= "\-l:$ENV{lang} \-n:$buildNo \-a:$buildArch \-t:$buildType";
$cmdLine .= " \| \@remote.exe /c $relServer xpsp1release /L 1";
if( !&comlib::ExecuteSystemX( $cmdLine, $isPowerLess ))
{
errmsg( "Failed to start remote on [$relServer], please investigate." );
return 0;
}
return 1;
}
#-----------------------------------------------------------------------------
sub PushRelease
{
# If qfe mode
if ($qfe) {
return ( &QfeThinCopy );
}
# Thin Release
if( $isThinRelease )
{
return ( &ThinCopy() );
}
# Full release
my $dash = '-' x 60;
logmsg ( $dash );
my $src = "\\\\$srcServer$relPath";
my $dest = "\\\\$relServer$relPath";
my @copyDirs = `dir /ad /b $src`;
chomp( @copyDirs );
for my $theDir ( @copyDirs )
{
my $from = "$src\\$theDir";
my $to = "$dest\\$theDir";
&comlib::ExecuteSystemX( "md $to",$isPowerLess ) if( !(-e $to ) );
return 0 if( !&comlib::ExecuteSystemX( "compdir /eknst $from $to", $isPowerLess ) );
}
my $cmdLine;
# miscrel.cmd - Make a conglomerator dirs
if( grep { $relServer eq $_} @aggServers )
{
logmsg ( $dash );
$cmdLine = "$ENV{RazzleToolPath}\\sp\\miscrel.cmd -l:$ENV{lang} -n:$buildNo
-d:$relServer -s:$relServer -a:$buildArch -t:$buildType";
return 0 if( !&comlib::ExecuteSystemX( $cmdLine, $isPowerLess ));
}
# Raiseall.cmd - Make bvt dfs links
if( lc $relServer ne "burnarch1" )
{
logmsg ( $dash );
$cmdLine = "$ENV{RazzleToolPath}\\sp\\raiseall.cmd -l:$ENV{lang} -n:$buildNo -q:bvt
-r:$relServer -a:$buildArch -t:$buildType";
if( &comlib::ExecuteSystemX( $cmdLine, $isPowerLess ) && $sendMail )
{
# mailbvt.cmd - Send mail notification to BVT lab
logmsg ( $dash );
$cmdLine = "$ENV{RazzleToolPath}\\sp\\mailbvt.cmd -l:$ENV{lang} -n:$buildNo
-a:$buildArch -t:$buildType";
&comlib::ExecuteSystemX( $cmdLine, $isPowerLess );
}
}
# copysym.cmd - Copy common symbols files from usa build
logmsg ( $dash );
$cmdLine = "$ENV{RazzleToolPath}\\sp\\copysym.cmd -l:$ENV{lang} -n:$buildNo
-d:$relServer -a:$buildArch -t:$buildType";
return 0 if( !&comlib::ExecuteSystemX( $cmdLine, $isPowerLess ));
# delbuild.cmd - delete builds for build machine
logmsg ( $dash );
$cmdLine = "$ENV{RazzleToolPath}\\sp\\delbuild.cmd -l:$ENV{lang}";
&comlib::ExecuteSystemX( $cmdLine, $isPowerLess );
# Start remote to run delbuild in release server
logmsg ( $dash );
my $cmdLine = "echo cd /d ^%^sdxroot%^\\tools\\sp ^& ";
$cmdLine .= "echo pushd ^^%RazzleToolPath^^% ^& echo sd sync ... ^& echo popd ^&";
$cmdLine .= " echo start /min cmd /c ^^%RazzleToolPath^^%\\sp\\DelBuild.cmd ";
$cmdLine .= "\-l:$ENV{lang} ";
$cmdLine .= " \| \@remote.exe /c $relServer xpsp1release /L 1";
&comlib::ExecuteSystemX( $cmdLine, $isPowerLess );
return 1;
}
#-----------------------------------------------------------------------------
sub QfeThinCopy
{
my $dash = '-' x 60;
logmsg ( $dash );
my $src = "\\\\$srcServer$relPath";
my $dest = "\\\\$relServer$relPath";
my $qfeName = "Q$qfe"."_"."$ENV{lang}.exe";
&comlib::ExecuteSystemX ("copy $src\\$qfeName $dest");
&comlib::ExecuteSystemX ("xcopy /eiyd $src\\bin_$ENV{lang} $dest\\bin_$ENV{lang}");
}
#-----------------------------------------------------------------------------
1;