@REM ----------------------------------------------------------------- @REM @REM localrel.cmd - SuemiaoR @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 if( $ENV{Official_build_machine} ) { $releaseShareRootDir = "$localReleaseDrive:\\$releaseShareName"; } else { $releaseShareRootDir = &comlib::ParseNetShare( "release", "Path" ); } if( !$releaseShareRootDir ) { errmsg( "[release] share undefined" ); return 0; } my $releaseResRootDir = $releaseShareRootDir; $releaseResRootDir .= "\\$lang" if ( lc($lang) ne "usa" ); &comlib::ExecuteSystem("md $releaseResRootDir") if( !( -e $releaseResRootDir) ); #####Set the final resource dir $releaseResDir = "$releaseResRootDir\\$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 if( $ENV{ReleaseAccess} ) { @releaseAccess = split( /\;/, $ENV{ReleaseAccess} ); } else { @iniRequest = ( "BuildMachineReleaseAccess", "ReleaseAccess" ); for my $access( @iniRequest ) { my $iniAccess = &GetIniSetting::GetSetting( $access ); @releaseAccess = split ( /\s+/, $iniAccess ); last if( @releaseAccess ); } if ( !@releaseAccess || !$ENV{Official_Build_Machine} ) { @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;