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 |
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 } |