build_package.pl
changeset 13 85202f272e4a
parent 12 2eaa774ddc63
child 14 0c4d71ffa649
equal deleted inserted replaced
12:2eaa774ddc63 13:85202f272e4a
     6 use File::Path;
     6 use File::Path;
     7 
     7 
     8 my $sBOOTSTRAP_DIR="D:\\Helium\\hlm-apps\\bootstrap";
     8 my $sBOOTSTRAP_DIR="D:\\Helium\\hlm-apps\\bootstrap";
     9 my $sJOB_BASE_DIR="D:\\fbf_project";
     9 my $sJOB_BASE_DIR="D:\\fbf_project";
    10 my $sCONFIG_REPO="\\\\lon-engbuild87\\d\$\\mercurial_development\\epl\\interim\\fbf\\configs\\pkgbuild\\FCL_pkgbuild";
    10 my $sCONFIG_REPO="\\\\lon-engbuild87\\d\$\\mercurial_development\\epl\\interim\\fbf\\configs\\pkgbuild\\FCL_pkgbuild";
       
    11 my $nMAX_JOBDIR_AGE_SECONDS = 86400; # max number of seconds after which the letter is forcibly released
    11 my $nLOCK_FILE_MAX_ATTEMPTS = 5;
    12 my $nLOCK_FILE_MAX_ATTEMPTS = 5;
    12 my $sNUMBERS_FILE="\\\\sym-build01\\f\$\\numbers.txt";
    13 my $sNUMBERS_FILE="\\\\sym-build01\\f\$\\numbers.txt";
       
    14 my $sLETTERS_FILE="D:\\letters.txt";
       
    15 my $nMAX_LETTER_AGE_SECONDS = 86400; # max number of seconds after which the letter is forcibly released
    13 
    16 
    14 my $sProjectRepo = '';
    17 my $sProjectRepo = '';
    15 my $sJobLabel = '';
    18 my $sJobLabel = '';
    16 my $nCmdLineNumber;
    19 my $nCmdLineNumber;
    17 GetOptions(('label:s' => \$sJobLabel, 'project:s' => \$sProjectRepo, 'number:s' => \$nCmdLineNumber));
    20 GetOptions(('label:s' => \$sJobLabel, 'project:s' => \$sProjectRepo, 'number:s' => \$nCmdLineNumber));
    28 chdir("$sBOOTSTRAP_DIR");
    31 chdir("$sBOOTSTRAP_DIR");
    29 print "###### BOOTSTRAP ######\n";
    32 print "###### BOOTSTRAP ######\n";
    30 print("hlm -f bootstrap.xml -Dsf.config.repo=$sCONFIG_REPO -Dsf.project.repo=$sProjectRepo -Dsf.target.dir=$sJobDir\n");
    33 print("hlm -f bootstrap.xml -Dsf.config.repo=$sCONFIG_REPO -Dsf.project.repo=$sProjectRepo -Dsf.target.dir=$sJobDir\n");
    31 system("hlm -f bootstrap.xml -Dsf.config.repo=$sCONFIG_REPO -Dsf.project.repo=$sProjectRepo -Dsf.target.dir=$sJobDir");
    34 system("hlm -f bootstrap.xml -Dsf.config.repo=$sCONFIG_REPO -Dsf.project.repo=$sProjectRepo -Dsf.target.dir=$sJobDir");
    32 
    35 
       
    36 # check that $sNUMBERS_FILE exists, otherwise create it
       
    37 if (!-f $sNUMBERS_FILE)
       
    38 {
       
    39 	open FILE, ">$sNUMBERS_FILE";
       
    40 	print FILE "\n";
       
    41 	close FILE;
       
    42 }
    33 
    43 
    34 my $nUnformattedNumber = ( $nCmdLineNumber ? $nCmdLineNumber : get_job_number($sProjectRepo));
    44 my $nUnformattedNumber = ( $nCmdLineNumber ? $nCmdLineNumber : get_job_number($sProjectRepo));
    35 my $nJobNumber = sprintf("%.3d", $nUnformattedNumber);
    45 my $nJobNumber = sprintf("%.3d", $nUnformattedNumber);
       
    46 
       
    47 # check that $sLETTERS_FILE exists, otherwise create it
       
    48 if (!-f $sLETTERS_FILE)
       
    49 {
       
    50 	open FILE, ">$sLETTERS_FILE";
       
    51 	print FILE "\n";
       
    52 	close FILE;
       
    53 }
       
    54 
       
    55 # acquire drive letter
       
    56 my $sDriveLetter = acquire_drive_letter();
       
    57 print "acquired drive letter: $sDriveLetter\n";
       
    58 die "Could not acquire drive letter" if (! $sDriveLetter);
    36 
    59 
    37 print("cd $sJobDir\\sf-config\n");
    60 print("cd $sJobDir\\sf-config\n");
    38 chdir("$sJobDir\\sf-config");
    61 chdir("$sJobDir\\sf-config");
    39 print "###### BUILD PREPARATION ######\n";
    62 print "###### BUILD PREPARATION ######\n";
    40 print("hlm sf-prep -Dsf.spec.job.number=$nJobNumber\n");
    63 print("hlm sf-prep -Dsf.spec.job.number=$nJobNumber -Dsf.spec.job.drive=$sDriveLetter:\n");
    41 system("hlm sf-prep -Dsf.spec.job.number=$nJobNumber");
    64 system("hlm sf-prep -Dsf.spec.job.number=$nJobNumber -Dsf.spec.job.drive=$sDriveLetter:");
    42 
    65 
    43 print "###### EXECUTE BUILD ######\n";
    66 print "###### EXECUTE BUILD ######\n";
    44 print("hlm sf-build-all -Dsf.spec.job.number=$nJobNumber\n");
    67 print("hlm sf-build-all -Dsf.spec.job.number=$nJobNumber -Dsf.spec.job.drive=$sDriveLetter:\n");
    45 system("hlm sf-build-all -Dsf.spec.job.number=$nJobNumber");
    68 system("hlm sf-build-all -Dsf.spec.job.number=$nJobNumber -Dsf.spec.job.drive=$sDriveLetter:");
       
    69 
       
    70 # release the drive letter
       
    71 release_drive_letter($sDriveLetter);
       
    72 system("subst $sDriveLetter: /d"); # this is not required, but it's a good idea to keep things in order
       
    73 print "drive letter $sDriveLetter released (and drive unsubsted)\n";
    46 
    74 
    47 sub mkdir_unique
    75 sub mkdir_unique
    48 {
    76 {
    49 	my ($sBaseDir) = @_;
    77 	my ($sBaseDir) = @_;
    50 	
    78 	
    65 
    93 
    66 sub get_job_number
    94 sub get_job_number
    67 {
    95 {
    68 	my ($sKey) = @_;
    96 	my ($sKey) = @_;
    69 	
    97 	
       
    98 	$sKey=lc($sKey);
       
    99 	
    70 	my %hnNumbers = ();
   100 	my %hnNumbers = ();
    71 	
   101 	
    72 	my $nAttempts = 0;
   102 	my $nAttempts = 0;
    73 	my $bGotNumber = 0;
   103 	my $bGotNumber = 0;
    74 	do
   104 	do
    77 		if ( flock(FILE, 6) )
   107 		if ( flock(FILE, 6) )
    78 		{
   108 		{
    79 			my $sLine;
   109 			my $sLine;
    80 			while ($sLine = <FILE>)
   110 			while ($sLine = <FILE>)
    81 			{
   111 			{
    82 				$hnNumbers{$1} = $2 if ($sLine =~ m%(.*),(.*)%);
   112 				$hnNumbers{lc($1)} = $2 if ($sLine =~ m%(.*),(.*)%);
    83 			}
   113 			}
    84 			
   114 			
    85 			$hnNumbers{$sKey} = 0 if (! $hnNumbers{$sKey} );
   115 			$hnNumbers{$sKey} = 0 if (! $hnNumbers{$sKey} );
    86 			$hnNumbers{$sKey} = $hnNumbers{$sKey} + 1;
   116 			$hnNumbers{$sKey} = $hnNumbers{$sKey} + 1;
    87 			
   117 			
    89 
   119 
    90 			for my $sStr ( keys(%hnNumbers) )
   120 			for my $sStr ( keys(%hnNumbers) )
    91 			{
   121 			{
    92 				print FILE "$sStr,$hnNumbers{$sStr}\n";
   122 				print FILE "$sStr,$hnNumbers{$sStr}\n";
    93 			}
   123 			}
       
   124 			truncate(FILE,tell(FILE));
    94 			
   125 			
    95 			$bGotNumber = 1;
   126 			$bGotNumber = 1;
    96 		}
   127 		}
    97 		else
   128 		else
    98 		{
   129 		{
   103 	}
   134 	}
   104 	until ( $bGotNumber or $nAttempts == $nLOCK_FILE_MAX_ATTEMPTS );
   135 	until ( $bGotNumber or $nAttempts == $nLOCK_FILE_MAX_ATTEMPTS );
   105 	
   136 	
   106 	return $hnNumbers{$sKey};
   137 	return $hnNumbers{$sKey};
   107 }
   138 }
       
   139 
       
   140 sub acquire_drive_letter
       
   141 {
       
   142 	my %hsPidsAndTimestamps = ();
       
   143 	
       
   144 	my $sLetterToRelease = '';
       
   145 	
       
   146 	my $nAttempts = 0;
       
   147 	my $bAcquired = 0;
       
   148 	do
       
   149 	{
       
   150 		open(FILE, "+<$sLETTERS_FILE") or die("Can't open $sLETTERS_FILE");
       
   151 		if ( flock(FILE, 6) )
       
   152 		{
       
   153 			my $sLine;
       
   154 			while ($sLine = <FILE>)
       
   155 			{
       
   156 				if ($sLine =~ m%([^,]*),(.*)%)
       
   157 				{
       
   158 					my $sLetter=$1;
       
   159 					my $sString=$2;
       
   160 					
       
   161 					$sString=~m%([^,]*),(.*)%;
       
   162 					my $nPid=$1;
       
   163 					my $nTimestamp=$2;
       
   164 					
       
   165 					if (time()-$nTimestamp<=$nMAX_LETTER_AGE_SECONDS)
       
   166 					{
       
   167 						$hsPidsAndTimestamps{$sLetter} = $sString;
       
   168 					}
       
   169 					else
       
   170 					{
       
   171 						# do nothing
       
   172 						print "forced release of letter: $sLetter\n";
       
   173 					}
       
   174 				}
       
   175 			}
       
   176 			
       
   177 			for my $sNewLetter ('H'..'Y')
       
   178 			{
       
   179 				if (! $hsPidsAndTimestamps{$sNewLetter})
       
   180 				{
       
   181 					my $sTimestamp = time();
       
   182 					$hsPidsAndTimestamps{$sNewLetter} = "$$,$sTimestamp";
       
   183 					$sLetterToRelease = $sNewLetter;
       
   184 					last;
       
   185 				}
       
   186 			}
       
   187 			
       
   188 			seek(FILE, 0, 0);
       
   189 
       
   190 			for my $sLetter ( keys(%hsPidsAndTimestamps) )
       
   191 			{
       
   192 				print FILE "$sLetter,$hsPidsAndTimestamps{$sLetter}\n";
       
   193 			}
       
   194 			truncate(FILE,tell(FILE));
       
   195 			
       
   196 			$bAcquired = 1;
       
   197 		}
       
   198 		else
       
   199 		{
       
   200 			$nAttempts ++;
       
   201 			sleep(3);
       
   202 		}
       
   203 		close(FILE);
       
   204 	}
       
   205 	until ( $bAcquired or $nAttempts == $nLOCK_FILE_MAX_ATTEMPTS );
       
   206 	
       
   207 	return $sLetterToRelease;
       
   208 }
       
   209 
       
   210 sub release_drive_letter
       
   211 {
       
   212 	my ($sLetterToRelease) = @_;
       
   213 	
       
   214 	my %hsPidsAndTimestamps = ();
       
   215 	
       
   216 	my $nAttempts = 0;
       
   217 	my $bAcquired = 0;
       
   218 	do
       
   219 	{
       
   220 		open(FILE, "+<$sLETTERS_FILE") or die("Can't open $sLETTERS_FILE");
       
   221 		if ( flock(FILE, 6) )
       
   222 		{
       
   223 			my $sLine;
       
   224 			while ($sLine = <FILE>)
       
   225 			{
       
   226 				$hsPidsAndTimestamps{$1} = $2 if ($sLine =~ m%([^,]*),(.*)%);
       
   227 			}
       
   228 			
       
   229 			delete $hsPidsAndTimestamps{$sLetterToRelease};
       
   230 			
       
   231 			seek(FILE, 0, 0);
       
   232 
       
   233 			for my $sLetter ( keys(%hsPidsAndTimestamps) )
       
   234 			{
       
   235 				print FILE "$sLetter,$hsPidsAndTimestamps{$sLetter}\n";
       
   236 			}
       
   237 			truncate(FILE,tell(FILE));
       
   238 			
       
   239 			$bAcquired = 1;
       
   240 		}
       
   241 		else
       
   242 		{
       
   243 			$nAttempts ++;
       
   244 			sleep(3);
       
   245 		}
       
   246 		close(FILE);
       
   247 	}
       
   248 	until ( $bAcquired or $nAttempts == $nLOCK_FILE_MAX_ATTEMPTS );
       
   249 }