@echo off REM ------------------------------------------------------------------ REM REM localrel.cmd REM Move the build to the shared release directory locally. REM REM Copyright (c) Microsoft Corporation. All rights reserved. REM REM ------------------------------------------------------------------ perl -x "%~f0" %* goto :EOF #!perl use strict; use lib $ENV{RAZZLETOOLPATH} . "\\PostBuildScripts"; use lib $ENV{RAZZLETOOLPATH}; use PbuildEnv; use Logmsg; use ParseArgs; use File::Basename; use BuildName; use GetIniSetting; use comlib; my $scriptname = basename( $0 ); sub Usage { print< [-b:] [-p] -l Language. Default is "usa". -b Build Name. Default is defined in %_ntpostbld%\\build_logs\\buildname.txt. -p Powerless. Display key variables only. -? Display Usage. Example: $scriptname -b:2415.x86fre.main.001222-1745 -p $scriptname -l:ger USAGE exit(1) } my ( $buildName, $powerLess, $buildBranch, $buildArch, $buildType, $iniFile ); my ( $releaseShareName, $releaseShareRootDir, $releaseResDir, @releaseAccess); my ( $lang, $latestReleaseShareName, $freeSpaceReq, $numBuildToKeep ); my ( $localReleaseDrive ); if( !&GetParams() ) { exit(1); } if( !&InitVars() ) { exit(1); } if( !$powerLess && !&VerifyDiskSpace() ) { exit(1); } if( !$powerLess && !&LowerShare) { exit(1); } if( !$powerLess && !&MoveBuild ){ exit(1); } if( !$powerLess && !&RaiseShare ) { exit(1); } exit(0); #----------------------------------------------------------------------------- sub GetParams { parseargs('?' => \&Usage, 'b:' => \$buildName, 'p' =>\$powerLess ); $lang = $ENV{lang}; #####Verify %_ntpostbld% exists if( !( -e $ENV{_ntpostbld} ) ) { errmsg( "[$ENV{_ntpostbld}] not exists, exit."); return 0; } return 1; } #----------------------------------------------------------------------------- sub InitVars { my( @iniRequest ); #####Set build name, buildbranch, buildArch, buildType and ini file if( !$buildName ) { if( ! ($buildName = build_name() )) { errmsg( "[$ENV{_ntpostbld}\\build_logs\\buildname.txt] not found, exit." ); return 0; } } chomp( $buildName ); $buildBranch = build_branch($buildName); $buildArch = build_arch($buildName); $buildType = build_type($buildName); $iniFile = "$buildBranch.$lang.ini"; #####Set release Share Drive @iniRequest = ("LocalReleaseDrive::$ENV{computerName}"); $localReleaseDrive = &GetIniSetting::GetSettingEx( $buildBranch,$lang,@iniRequest ); if ( !$localReleaseDrive ) { $ENV{_ntdrive} =~ /(.*)\:/; $localReleaseDrive = $1; } #####Set & & $releaseShareName = &comlib::GetReleaseShareName( $ENV{_BuildBranch}, $lang ); #####Set release root path different ways if it is not Offcial_build_machine $releaseShareRootDir = "$localReleaseDrive:\\$releaseShareName"; if( !$ENV{Official_build_machine} ) { my $tmp = "$ENV{RazzleToolPath}\\postbuildscripts\\tmp.txt"; if( !system ("net share release > $tmp" ) ) { my @tmpFile= &comlib::ReadFile( $tmp ); for my $theLine ( @tmpFile ) { my @netShare = split( /\s+/, $theLine ); if( $netShare[0] eq "Path" ) { $releaseShareRootDir = $netShare[1]; ###No need to set $localReleaseDrive for now, but for future $releaseShareRootDir =~ /^(.*)\:(.*)$/; $localReleaseDrive = $1; last; } } unlink( $tmp ); } } $releaseShareRootDir = "$releaseShareRootDir\\$lang" if ( lc($lang) ne "usa" ); &comlib::ExecuteSystem("md $releaseShareRootDir") if( !( -e $releaseShareRootDir) ); #####Set the final resource dir $releaseResDir = "$releaseShareRootDir\\$buildName"; if( -e $releaseResDir ) { errmsg("Found [$releaseResDir] exists already, exit."); return 0; } #####Set latest share name $latestReleaseShareName = "latest"; if( lc ($lang) ne "usa" ) { $latestReleaseShareName .= "_$lang" } #####Set access user to the release share build machine @iniRequest = ( "BuildMachineReleaseAccess", "ReleaseAccess" ); for my $access( @iniRequest ) { my $iniAccess = &GetIniSetting::GetSetting( $access ); @releaseAccess = split ( /\s+/, $iniAccess ); last if( @releaseAccess ); } if ( !@releaseAccess ) { @releaseAccess = "$ENV{userDomain}\\$ENV{UserName}" ; } #####Set free space required & number builds to keep for the local build machine @iniRequest = ("BuildMachineFreeSpace::$ENV{computername}"); $freeSpaceReq = &GetIniSetting::GetSettingEx( $buildBranch,$lang,@iniRequest ); $freeSpaceReq = 10 if( !$freeSpaceReq ); @iniRequest = ("BuildMachineBuildsToKeep::$ENV{computername}"); $numBuildToKeep = &GetIniSetting::GetSettingEx( $buildBranch,$lang,@iniRequest ); $numBuildToKeep = 2 if( !$numBuildToKeep ); logmsg( "Lauguage .................[$lang]" ); logmsg( "Build name ...............[$buildName]" ); logmsg( "Ini file .................[$iniFile]" ); logmsg( "Postbuild dir ............[$ENV{_ntpostbld}]" ); logmsg( "Release share name .......[$releaseShareName]" ); logmsg( "Release share resource ...[$releaseResDir]" ); logmsg( "Latest Release Access.....[@releaseAccess]" ); logmsg( "Latest release share name [$latestReleaseShareName]" ); logmsg( "Free space required ......[$freeSpaceReq G]" ); logmsg( "Number builds to keep.....[$numBuildToKeep]" ); logmsg( "Temp Log file ............[$ENV{LOGFILE}]" ); logmsg( "Temp Error file ..........[$ENV{ERRFILE}]" ); return 1; } #----------------------------------------------------------------------------- sub MoveBuild { return ( &comlib::ExecuteSystem( "move $ENV{_ntpostbld} $releaseResDir" ) ); } #----------------------------------------------------------------------------- sub RaiseShare { my ( $cmdLine ); #####Set release root share. #####Verify release root share exists first. if( system( "net share $releaseShareName >nul 2>nul" ) ) { $cmdLine = "rmtshare \\\\$ENV{computerName}\\$releaseShareName=$releaseShareRootDir"; } else { $cmdLine = "rmtshare \\\\$ENV{computerName}\\$releaseShareName"; } for my $ID ( @releaseAccess ) { $cmdLine .= " /grant $ID:read"; } return 0 if( !&comlib::ExecuteSystem( $cmdLine ) ); #####Set individual build share $cmdLine = "rmtshare \\\\$ENV{computerName}\\$latestReleaseShareName=$releaseResDir"; for my $ID ( @releaseAccess ) { $cmdLine .= " /grant $ID:read"; } return 0 if( !&comlib::ExecuteSystem( $cmdLine ) ); return 1; } #----------------------------------------------------------------------------- sub LowerShare { if( !system( "net share $latestReleaseShareName >nul 2>nul" ) ) { return 0 if( !&comlib::ExecuteSystem( "net share $latestReleaseShareName /d /y" ) ); } return 1; } #----------------------------------------------------------------------------- sub VerifyDiskSpace { my ($retry, $reqSpace ) = (0, 1000000000); my $tmpFile = "$ENV{_ntdrive}\\freeSize"; my @freeSize; $reqSpace *= $freeSpaceReq; while( $retry < 2) { system( "freedisk>$tmpFile" ); @freeSize = &comlib::ReadFile( $tmpFile ); unlink( $tmpFile ); if( ($freeSize[0] - $reqSpace) > 0 ) { logmsg( "Available disk space [$freeSize[0]], delete builds is not required." ); return 1; } logmsg( "Available disk space [$freeSize[0]], Need to free disk space now."); my ( $cmdLine ) = "deletebuild.cmd AUTO /l $lang /a $buildArch$buildType /f $freeSpaceReq /k $numBuildToKeep"; return 1 if( &comlib::ExecuteSystem( $cmdLine ) ); ++$retry; } return 0; } #----------------------------------------------------------------------------- 1;