build/scripts/automation/winbldroutines.pm (1,588 lines of code) (raw):

package winbldroutines; use Time::HiRes; use strict; use Time::Duration; use Mail::Sender; use IO::Socket; use Sys::Hostname; use File::Path; use File::Find; use File::Touch; use JSON; # ----------------------------------------------------------------------------------------------------------------------------- # ------------------------ BEGIN: Class constructor, destructor and attribute APIs -------------------------------------------------- # ----------------------------------------------------------------------------------------------------------------------------- sub new { my ($pkg,$optionsetref) = @_; # Do not allow instance constructors die "Instance-based constructors are not allowed. Please use the class constructor! Stopped" if ref($pkg); # Since optionsetref is a reference, we should not directly bless it. # Create a "data copy" of that reference locally here and then bless it. my $self = {}; $self->{$_} = $optionsetref->{$_} foreach (keys %{$optionsetref}); $self->{datewisedir} = undef; $self->{date} = undef; $self->{month} = undef; $self->{year} = undef; $self->{timeinsecs} = undef; chomp($self->{pwd} = `cd`); return bless $self, $pkg; } sub DatewiseDir { my $this = shift; @_ ? $this->{datewisedir} = shift : $this->{datewisedir}; } sub Date { my $this = shift; @_ ? $this->{date} = shift : $this->{date}; } sub Month { my $this = shift; @_ ? $this->{month} = shift : $this->{month}; } sub Year { my $this = shift; @_ ? $this->{year} = shift : $this->{year}; } sub TimeInSecs { my $this = shift; @_ ? $this->{timeinsecs} = shift : $this->{timeinsecs}; } sub SrcPath { my $this = shift; @_ ? $this->{srcpath} = shift : $this->{srcpath}; } sub Partner { my $this = shift; @_ ? $this->{partner} = shift : $this->{partner}; } sub Branch { my $this = shift; @_ ? $this->{branch} = shift : $this->{branch}; } sub BuildQuality { my $this = shift; @_ ? $this->{buildquality} = shift : $this->{buildquality}; } sub BuildCopyPath { my $this = shift; @_ ? $this->{buildcopypath} = shift : $this->{buildcopypath}; } sub ShouldLoadSymbols { my $this = shift; return $this->{loadsymbols}; } sub SymbolStorePath { my $this = shift; @_ ? $this->{symbolserverpath} = shift : $this->{symbolserverpath}; } sub BuildPhase { my $this = shift; @_ ? $this->{buildphase} = shift : $this->{buildphase}; } sub MajorVersion { my $this = shift; @_ ? $this->{majorversion} = shift : $this->{majorversion}; } sub MinorVersion { my $this = shift; @_ ? $this->{minorversion} = shift : $this->{minorversion}; } sub PatchSetVersion { my $this = shift; @_ ? $this->{patchsetversion} = shift : $this->{patchsetversion}; } sub PatchVersion { my $this = shift; @_ ? $this->{patchversion} = shift : $this->{patchversion}; } sub ProductList { my $this = shift; return $this->{products}; } sub Signing { my $this = shift; return $this->{signing}; } sub ConfigList { my $this = shift; return $this->{config}; } sub ShouldUpdateSource { my $this = shift; return $this->{cvsupdate} =~ /yes/i ? 1 : 0; } sub ShouldCleanPrevBuild { my $this = shift; return $this->{incremental} =~ /no/i ? 1 : 0; } sub GetThisScriptDir { my $this = shift; return $this->{pwd}; } sub DESTROY { print "DEBUG: in DESTROY()\n"; my $this = shift; my $this_script_dir = $this->GetThisScriptDir(); chdir "$this_script_dir"; my $srcpath = $this->SrcPath(); # Undo branding changes if any my @files_to_be_deleted = ( "$srcpath\\host\\common\\version.h.orig", "$srcpath\\host\\common\\version.cs.orig", "$srcpath\\server\\tm\\version.orig", "$srcpath\\host\\setup\\version.iss.orig", "$srcpath\\server\\windows\\ProcessServerMSI\\Version.wxi" ); foreach my $file (@files_to_be_deleted) { $file =~ /^.+\\(.+)$/; print "DESTRUCTOR: Deleting file $file \n"; unlink($file); } } # ----------------------------------------------------------------------------------------------------------------------------- # ------------------------ END: Class constructor, destructor and attribute APIs -------------------------------------------------- # ----------------------------------------------------------------------------------------------------------------------------- # ----------------------------------------------------------------------------------------------------------------------------- # ------------------------ BEGIN: Class variables and any associated APIs -------------------------------------------------- # ----------------------------------------------------------------------------------------------------------------------------- my $PowerShellPath = 'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe'; my $mvss_exe = 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\devenv.com'; my $msbuild_exe = 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MSBuild.exe'; my $ISCC_exe = 'C:\Program Files (x86)\Inno Setup 5\ISCC.exe'; # Don't delete or change the path of EsrpClient.exe. UnifiedAgentCustomActions.dll and UnifiedAgentCustomActions.CA.dll # signing happens only when EsrpClient.exe file exists at C:\esrpclient.1.2.25\tools. my $signtool = 'C:\esrpclient.1.2.25\tools\EsrpClient.exe'; my $authfile = "C:\\esrpclientconfig\\Auth.json"; my $policyfile = "C:\\esrpclientconfig\\Policy.json"; my $zip_exe = 'C:\Program Files (x86)\7-Zip\7z'; my $pdbload_exe = 'C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\symstore.exe'; my $pdbcheck_exe = 'C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\symchk.exe'; my $sender = new Mail::Sender {smtp => 'cloudmail.microsoft.com', from => 'mabldadm@microsoft.com' }; my $failure_alert_ids = 'inmiet@microsoft.com' ; my $month_details = { 'Jan' => 1, 'Feb' => 2, 'Mar' => 3, 'Apr' => 4, 'May' => 5, 'Jun' => 6, 'Jul' => 7, 'Aug' => 8, 'Sep' => 9, 'Oct' => 10, 'Nov' => 11, 'Dec' => 12 }; my $host = hostname; my ($addr) = inet_ntoa((gethostbyname($host))[4]); my $partner_details = { 'inmage' => { 'string' => 'InMage', 'company' => 'InMage Systems', 'code' => '1' } }; my $pdb_filename_details = { 'ua' => 'pdb_list_ua.txt', 'cx' => 'pdb_list_cx.txt', 'ucx' => 'pdb_list_cx.txt', 'asrua' => 'pdb_list_asrua.txt', 'asrsetup' => 'pdb_list_asrsetup.txt', 'pi' => 'pdb_list_pi.txt', "psmsi" => 'pdb_list_psmsi.txt' }; my $branch_details = { 'develop' => { 'refsecs' => 1104517800, 'smrrefsecs' => 1337193000, }, 'release' => { 'refsecs' => 1104517800, 'smrrefsecs' => 1337193000, }, 'master' => { 'refsecs' => 1104517800, 'smrrefsecs' => 1337193000, } }; sub GetPartnerString { my $this = shift; my $partner = $this->Partner(); die "$partner is not supported, stopped" if not exists ${$partner_details}{$partner}; return $partner_details->{$partner}->{string}; } sub GetPartnerCompanyString { my $this = shift; my $partner = $this->Partner(); die "$partner is not supported, stopped" if not exists ${$partner_details}{$partner}; return $partner_details->{$partner}->{company}; } sub GetPartnerCode { my $this = shift; my $partner = $this->Partner(); die "$partner is not supported, stopped" if not exists ${$partner_details}{$partner}; return $partner_details->{$partner}->{code}; } sub GetProductPDBListFileName { my $this = shift; my $product = shift; return $pdb_filename_details->{$product}; } sub GetRefSecs { my $this = shift; my $branch = $this->Branch(); my $partnerstring = $this->GetPartnerString(); die "$branch is not supported, stopped" if not exists ${$branch_details}{$branch}; return $branch_details->{$branch}->{refsecs}; } sub GetSMRRefSecs { my $this = shift; my $branch = $this->Branch(); my $partnerstring = $this->GetPartnerString(); die "$branch is not supported, stopped" if not exists ${$branch_details}{$branch}; return $branch_details->{$branch}->{smrrefsecs}; } sub GetMajorVersion { my $this = shift; my $branch = $this->Branch(); my $partnerstring = $this->GetPartnerString(); my $MajorVersion = $this->MajorVersion(); die "$branch is not supported, stopped" if not exists ${$branch_details}{$branch}; return $MajorVersion; } sub GetMinorVersion { my $this = shift; my $branch = $this->Branch(); my $partnerstring = $this->GetPartnerString(); my $MinorVersion = $this->MinorVersion(); die "$branch is not supported, stopped" if not exists ${$branch_details}{$branch}; return $MinorVersion; } sub GetPatchSetVersion { my $this = shift; my $branch = $this->Branch(); my $partnerstring = $this->GetPartnerString(); my $PatchSetVersion = $this->PatchSetVersion(); die "$branch is not supported, stopped" if not exists ${$branch_details}{$branch}; return $PatchSetVersion; } sub GetPatchVersion { my $this = shift; my $branch = $this->Branch(); my $partnerstring = $this->GetPartnerString(); my $PatchVersion = $this->PatchVersion(); die "$branch is not supported, stopped" if not exists ${$branch_details}{$branch}; return $PatchVersion; } my $product_details = { 'UA' => { 'outputfile' => 'win_unified_setup.exe', 'proj' => { 'build' => 'unified_agent', 'packaging' => 'package_unified' }, 'issdir' => qw(host\setup), 'soln' => qw(host\host.sln) }, 'CX_TP' => { 'outputfile' => 'cx_thirdparty_setup.exe', 'proj' => { 'packaging' => 'setup_cxthirdparty' }, 'issdir' => qw(server\windows), 'soln' => qw(server\server.sln) }, 'UCX' => { 'outputfile' => 'ucx_server_setup.exe', 'proj' => { 'packaging' => 'setup_ucxserver' }, 'issdir' => qw(server\windows), 'soln' => qw(server\server.sln) }, 'ASRUA' => { 'outputfile' => 'MicrosoftAzureSiteRecoveryUnifiedAgent.exe', 'proj' => { 'build' => 'UnifiedAgentInstaller' }, 'issdir' => qw(host\setup), 'soln' => qw(host\ASRSetup\ASRSetup.sln) }, 'ASRSETUP' => { 'outputfile' => 'MicrosoftAzureSiteRecoveryUnifiedSetup.exe', 'proj' => { 'build' => 'UnifiedSetup' }, 'issdir' => qw(server\windows), 'soln' => qw(host\ASRSetup\ASRSetup.sln) }, 'CX' => { 'outputfile' => 'cx_server_setup.exe', 'proj' => { 'build' => 'build_cxserver', 'packaging' => 'setup_cxserver' }, 'issdir' => qw(server\windows), 'soln' => qw(server\server.sln) }, 'PI' => { 'outputfile' => 'win_pushserver_setup.exe', 'proj' => { 'build' => 'build_push', 'packaging' => 'setup_push' }, 'issdir' => qw(build\scripts\pushinstall), 'soln' => qw(host\host.sln) }, 'PSMSI' => { 'outputfile' => 'ProcessServer.msi', 'proj' => { 'build' => 'ProcessServerMSI', 'packaging' => 'ProcessServerMSI' }, 'issdir' => qw(server\windows), 'soln' => qw(server\server.sln) } }; sub GetSolnFileName { my ($this,$product) = @_; $product = uc($product); die "Product $product not supported, stopped" if not exists ${$product_details}{$product}; return $product_details->{$product}->{soln}; } sub GetBuildProjectName { my ($this,$product) = @_; $product = uc($product); die "Product $product not supported, stopped" if not exists ${$product_details}{$product}; if (ref($product_details->{$product}->{proj}) eq "HASH") { return $product_details->{$product}->{proj}->{build}; } } sub GetPackagingProjectName { my ($this,$product) = @_; $product = uc($product); die "Product $product not supported, stopped" if not exists ${$product_details}{$product}; if (ref($product_details->{$product}->{proj}) eq "HASH") { return $product_details->{$product}->{proj}->{packaging}; } } sub GetBuildIssDir { my ($this,$product) = @_; $product = uc($product); die "Product $product not supported, stopped" if not exists ${$product_details}{$product}; return $product_details->{$product}->{issdir}; } sub GetOutputFileName { my ($this,$product) = @_; $product = uc($product); die "Product $product not supported, stopped" if not exists ${$product_details}{$product}; return $product_details->{$product}->{outputfile}; } # ----------------------------------------------------------------------------------------------------------------------------- # ------------------------ END: Class variables and any associated APIs -------------------------------------------------- # ----------------------------------------------------------------------------------------------------------------------------- # ----------------------------------------------------------------------------------------------------------------------------- # ------------------------ BEGIN: Useful functions ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------------------------------------------------------- sub Log_Do { my $cmd = shift; print "\n\nDEBUG: EXECUTING ----- $cmd\n\n"; system($cmd); } sub send_mail { my ($to,$subject,$msg,$priority) = @_; print "\n\nDEBUG: In send_mail()\n\n"; if (ref($to) eq "ARRAY") { foreach my $to_id (@{$to}) { print "\nSending e-mail to id $to_id ...\n"; unless ($sender->MailMsg({ to => $to_id , subject => $subject , msg => $msg , priority => $priority })) { print "\nError while sending mail to $to_id - $Mail::Sender::Error\n"; } } } elsif (not ref($to)) { print "\n\nSending e-mail to id $to\n\n"; unless ($sender->MailMsg({ to => $to , subject => $subject , msg => $msg , priority => $priority })) { print "\nError while sending mail to $to - $Mail::Sender::Error\n"; } } else { $sender->MailMsg({ to => 'inmiet@microsoft.com' , subject => 'Windows build: Usage' , msg => 'Wrong format passed for "to"!' , priority => 1 }); } } sub prepare_signing_files { my ($inputfileslist, $filessection, $inputtempfile, $inputfile, $sourcerootdir,$destrootdir) = @_; # Open Files.json my $filejson; { local $/; #Enable 'slurp' mode open my $fh, "<", "$inputfileslist"; $filejson = <$fh>; close $fh; } my $filesdata = JSON->new->pretty->utf8->decode($filejson); # Construct InputSign.json with list of files to be signed. my @filelist = @{$filesdata->{$filessection}}; my $filestobesigned = ""; foreach (@filelist) { $filestobesigned = $filestobesigned . "\t\t\t{\n\t\t\t\t\"SourceLocation\" : \"".$_."\"\n\t\t\t},\n"; } open(IFILE,"<$inputtempfile") || die "can't open file for read\n"; open(OFILE,">$inputfile") || die "can't open file for writing\n"; while (<IFILE>){ if(/\"SignRequestFiles\": \[/) { print OFILE $_; print OFILE $filestobesigned; } elsif(/\"SourceRootDirectory\": \"/) { print OFILE $sourcerootdir; } elsif(/\"DestinationRootDirectory\": \"/) { print OFILE $destrootdir; } else { print OFILE $_; } } close(IFILE); close(OFILE); } sub check_for_signing_errors { my ($outputfile) = @_; open(FILE, "<$outputfile") or die "Unable to open: $outputfile\n"; while(<FILE>) { if(grep(/statusCode/, $_)) { unless (grep(/pass/, $_)) { print $_; close(FILE); return 1; } } } close(FILE); return 0; } sub submit_files_for_signing { my ($product, $config, $inputfile, $outputfile, $verboselogfile) = @_; if (Log_Do("$signtool sign -a $authfile -p $policyfile -i $inputfile -o $outputfile -l verbose -f $verboselogfile") == 0){ if (check_for_signing_errors("$outputfile")){ #send_mail($failure_alert_ids,'Windows build failure',"Signing has failed for $product for $config configuration in $addr",1); die "\nSigning has failed for $product. Please refer following files for more details - $outputfile and $verboselogfile.\n"; } print "\nSigning completed successfully for $product for $config configuration in $addr\n\n"; } else { #send_mail($failure_alert_ids,'Windows build failure',"Signing has failed for $product for $config configuration in $addr",1); die "\n\nSigning has failed for $product. Please refer following files for more details - $outputfile and $verboselogfile.\n\n"; } } sub ChangeModifiedTime { # Figure out the list of files in the input directory. my @dirpath = @_; my @files; find(sub { push @files,$File::Find::name if (-f $File::Find::name); }, @dirpath); my $nooffiles = @files; if ( $nooffiles >= 1) { print "\nFound $nooffiles files in @dirpath."; } else { die "\nDidn't find any files under @dirpath\n"; } # Set modified time of all files 48 hours back. my $secsperday = 24*60*60; my $modtime = time() - 2 * $secsperday; my $ref = File::Touch->new( mtime => $modtime); my $filestouched = $ref->touch(@files); if ( $nooffiles == $filestouched) { print "\nSuccessfully set modified time for $filestouched files under @dirpath.\n"; } else { die "\nFailed to set modified time for files unnder @dirpath.\n"; } } # ----------------------------------------------------------------------------------------------------------------------------- # ------------------------ END: Useful functions ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------------------------------------------------------- # ******************************************************************************************************************************************* # ----------------------------------------------------------------------------------------------------------------------------- # ----------------------- BEGIN: HELPER FUNCTIONS OF THIS CLASS ----------------------------------------------------------------- # ----------------------------------------------------------------------------------------------------------------------------- sub CreateDatewiseDirStructure { print "DEBUG: in CreateDatewiseDirStructure()\n"; my $this = shift; my $date = $this->Date(); my $month = $this->Month(); my $year = $this->Year(); my $outputdir = $this->BuildCopyPath(); my $configlist = $this->ConfigList(); my $datewisedir = "${outputdir}\\${date}_${month}_${year}"; $this->DatewiseDir($datewisedir); foreach my $config (@{$configlist}) { Log_Do("if not exist ${datewisedir}\\${config}\\logs md ${datewisedir}\\${config}\\logs"); } } sub DoCleanup { print "DEBUG: in DoCleanup()\n"; my $this = shift; my $srcpath = $this->SrcPath(); my $configlist = $this->ConfigList(); my $productlist = $this->ProductList(); my %solnfilehash = (); my $temp; my $ProductName; foreach my $product (@{$productlist}) { $temp = $this->GetSolnFileName($product); $solnfilehash{$temp} = 1 if not exists $solnfilehash{$temp}; $ProductName = uc($product) } foreach my $config (@{$configlist}) { foreach my $solnfile (keys %solnfilehash) { if (Log_Do("\"$mvss_exe\" ${srcpath}\\$solnfile /clean \"$config|Win32\"") == 0) { print "\n\n$solnfile clean successful for configuration $config for $ProductName in $addr\n\n"; } else { send_mail($failure_alert_ids,'Windows build failure',"$solnfile clean failed for configuration $config for $ProductName in $addr",1); die "\n\n$solnfile clean failed for configuration $config for $ProductName in $addr"; } } } # Clean up UnifiedAgentMSI project for both x86 and x64 configurations. foreach my $prod (@{$productlist}) { if (uc($prod) eq "ASRUA") { foreach my $proc ("x86", "x64") { if (Log_Do("\"$mvss_exe\" ${srcpath}\\host\\ASRSetup\\ASRSetup.sln /project UnifiedAgentMSI /clean \"release|$proc\"") == 0) { print "\n\nClean successful for UnifiedAgentMSI project for configuration release for $prod in $addr\n\n"; } else { send_mail($failure_alert_ids,'Windows build failure',"Clean failed for configuration release for $prod in $addr",1); die "\n\nClean failed UnifiedAgentMSI for configuration release for $prod in $addr"; } } } } foreach my $prod (@{$productlist}) { if (uc($prod) eq "PSMSI") { foreach my $proc ("x64") { if (Log_Do("\"$mvss_exe\" ${srcpath}\\server\\server.sln /project ProcessServerMSI /clean \"release|$proc\"") == 0) { print "\n\nClean successful for ProcessServerMSI project for configuration release for $prod in $addr\n\n"; } else { send_mail($failure_alert_ids,'Windows build failure',"Clean failed for configuration release for $prod in $addr",1); die "\n\nClean failed ProcessServerMSI for configuration release for $prod in $addr"; } } } } } sub DoBrandingChanges { print "DEBUG: in DoBrandingChanges()\n"; my $this = shift; my ($srcpath,$Prod_Version,$Intel_Delete_Path,$Win2k_Delete_Path,$partner,$cx_date,$config,$branchname,$bldquality,$bldphase,$MajorVersion,$MinorVersion,$PatchSetVersion,$refsecs,$smrrefsecs,$PatchVersion,$tagstring,$partnerstring,$partnercode,$dlybldnum,$smrdlybldnum,$pvt); my ($date,$month,$year,$timeinsecs); my $configlist = $this->ConfigList(); my $productlist = $this->ProductList(); $srcpath = $this->SrcPath(); $partner = $this->Partner(); $branchname = $this->Branch(); $bldquality = $this->BuildQuality(); $bldphase = $this->BuildPhase(); $MajorVersion = $this->GetMajorVersion(); $MinorVersion = $this->GetMinorVersion(); $PatchSetVersion = $this->GetPatchSetVersion(); $refsecs = $this->GetRefSecs(); $smrrefsecs = $this->GetSMRRefSecs(); $PatchVersion = $this->GetPatchVersion(); $partnerstring = $this->GetPartnerString(); $partnercode = $this->GetPartnerCode(); $pvt = 1; $date = $this->Date(); $month = $this->Month(); $year = $this->Year(); $timeinsecs = $this->TimeInSecs(); $Prod_Version="${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}"; $dlybldnum = int(($timeinsecs - $refsecs)/86400); $smrdlybldnum = int(($timeinsecs - $smrrefsecs)/86400); foreach my $product (@{$productlist}) { system($PowerShellPath ' -File "delete_files.ps1"' , $branchname); } $tagstring = "${bldquality}_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_${bldphase}_${dlybldnum}_${month}_${date}_${year}"; eval { # Rename them to .orig Log_Do("rename $srcpath\\host\\common\\version.h version.h.orig"); Log_Do("rename $srcpath\\host\\common\\version.cs version.cs.orig"); Log_Do("rename $srcpath\\server\\tm\\version version.orig"); }; if ($@ =~ /cannot/) { send_mail($failure_alert_ids,'Windows build failure',"Failure in branding\n\n$@",1); die "DEBUG: One of the above commands failed. Stopped"; } # host\common\version.h open(FH_W_VH,">$srcpath\\host\\common\\version.h") or die "Could not open $srcpath\\host\\common\\version.h"; my $version_h_contents = "#define INMAGE_PRODUCT_VERSION_STR \"${tagstring}\"\n"; $version_h_contents = $version_h_contents . "#define INMAGE_PRODUCT_VERSION ${MajorVersion},${MinorVersion},${dlybldnum},${pvt}\n"; $version_h_contents = $version_h_contents . "#define INMAGE_PRODUCT_VERSION_MAJOR ${MajorVersion}\n"; $version_h_contents = $version_h_contents . "#define INMAGE_PRODUCT_VERSION_MINOR ${MinorVersion}\n"; $version_h_contents = $version_h_contents . "#define INMAGE_PRODUCT_VERSION_BUILDNUM ${dlybldnum}\n"; $version_h_contents = $version_h_contents . "#define INMAGE_PRODUCT_VERSION_PRIVATE ${pvt}\n"; $version_h_contents = $version_h_contents . "#define INMAGE_HOST_AGENT_CONFIG_CAPTION \"${tagstring}\"\n"; $version_h_contents = $version_h_contents . "#define PROD_VERSION \"${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}\"\n"; $version_h_contents = $version_h_contents . "#define INMAGE_COPY_RIGHT \"\\xa9 ${year} Microsoft Corp. All rights reserved.\"\n"; $version_h_contents = $version_h_contents . "#define INMAGE_PRODUCT_NAME \"Microsoft Azure Site Recovery\"\n"; print FH_W_VH $version_h_contents; close(FH_W_VH); # host\common\version.cs open(FH_W_VCS,">$srcpath\\host\\common\\version.cs") or die "Could not open $srcpath\\host\\common\\version.cs"; my $version_cs_contents = "using System.Reflection\;\n"; $version_cs_contents = $version_cs_contents . "\n"; $version_cs_contents = $version_cs_contents . "[assembly: AssemblyFileVersion(\"${MajorVersion}.${MinorVersion}.${dlybldnum}.${pvt}\")]\n"; $version_cs_contents = $version_cs_contents . "[assembly: AssemblyCompany(\"Microsoft Corporation\")]\n"; $version_cs_contents = $version_cs_contents . "[assembly: AssemblyProduct(\"Microsoft Azure Site Recovery\")]\n"; $version_cs_contents = $version_cs_contents . "[assembly: AssemblyInformationalVersion(\"${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}\")]\n"; $version_cs_contents = $version_cs_contents . "[assembly: AssemblyCopyright(\"\\u00A9 ${year} Microsoft Corp. All rights reserved.\")]\n"; $version_cs_contents = $version_cs_contents . "[assembly: AssemblyTrademark(\"Microsoft\\u00AE is a registered trademark of Microsoft Corporation.\")]\n"; print FH_W_VCS $version_cs_contents; close(FH_W_VCS); # server\tm\version open(FH_W_V,">$srcpath\\server\\tm\\version") or die "Could not open $srcpath\\server\\tm\\version"; my $version_contents = "$tagstring\n${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_${bldphase}_${dlybldnum}\nVERSION=${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}\nPROD_VERSION=${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}"; print FH_W_V $version_contents; close(FH_W_V); open(FH_W_V,">$srcpath\\host\\ASRSetup\\UnifiedAgentMSI\\version.wxi") or die "Could not open $srcpath\\host\\ASRSetup\\UnifiedAgentMSI\\version.wxi"; my $version_wxi_contents = "<Include>\n"; $version_wxi_contents = $version_wxi_contents . "<?define BuildVersion = \"${MajorVersion}.${MinorVersion}.${dlybldnum}.${pvt}\" ?>\n"; $version_wxi_contents = $version_wxi_contents . "<?define ProductVersion = \"${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}\" ?>\n"; $version_wxi_contents = $version_wxi_contents . "<?define BuildPhase = \"${bldphase}\" ?>\n"; $version_wxi_contents = $version_wxi_contents . "<?define BuildTag = \"${tagstring}\" ?>\n"; $version_wxi_contents = $version_wxi_contents . "<?define BuildNumber = \"${dlybldnum}\" ?>\n"; $version_wxi_contents = $version_wxi_contents . "<?define CompanyName = \"Microsoft Corporation\" ?>\n"; $version_wxi_contents = $version_wxi_contents . "</Include>\n"; print FH_W_V $version_wxi_contents; close(FH_W_V); open(FH_W_V,">$srcpath\\server\\windows\\ProcessServerMSI\\Version.wxi") or die "Could not open $srcpath\\server\\windows\\ProcessServerMSI\\Version.wxi"; my $version_pswxi_contents = "<Include>\n"; $version_pswxi_contents = $version_pswxi_contents . "<?define BuildVersion = \"${MajorVersion}.${MinorVersion}.${dlybldnum}.${pvt}\" ?>\n"; $version_pswxi_contents = $version_pswxi_contents . "<?define ProductVersion = \"${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}\" ?>\n"; $version_pswxi_contents = $version_pswxi_contents . "<?define BuildPhase = \"${bldphase}\" ?>\n"; $version_pswxi_contents = $version_pswxi_contents . "<?define BuildTag = \"${tagstring}\" ?>\n"; $version_pswxi_contents = $version_pswxi_contents . "<?define BuildNumber = \"${dlybldnum}\" ?>\n"; $version_pswxi_contents = $version_pswxi_contents . "<?define CompanyName = \"Microsoft Corporation\" ?>\n"; $version_pswxi_contents = $version_pswxi_contents . "</Include>\n"; print FH_W_V $version_pswxi_contents; close(FH_W_V); print "version.h contents are:\n\n$version_h_contents\n\n"; print "version.cs contents are:\n\n$version_cs_contents\n\n"; print "version contents are:\n\n$version_contents\n\n"; print "version.wxi contents are:\n\n$version_wxi_contents\n\n"; print "version.wxi contents for PSMSI are:\n\n$version_pswxi_contents\n\n"; } sub DoProductBuilds { print "DEBUG: in DoProductBuilds()\n"; my $this = shift; my $srcpath = $this->SrcPath(); my $partner = $this->Partner(); my $configlist = $this->ConfigList(); my $productlist = $this->ProductList(); my $datewisedir = $this->DatewiseDir(); my $branchname = $this->Branch(); my $MajorVersion = $this->GetMajorVersion(); my $MinorVersion = $this->GetMinorVersion(); my $buildversion = "${MajorVersion}.${MinorVersion}"; my $pwd = $this->GetThisScriptDir(); my ($solnfile,$project,$buildoutputdir,$logfile,$host_solnfile,$vacp_bldlogfile,$Log_bldlogfile,$hostagenthelpers_bldlogfile); foreach my $config (reverse sort @{$configlist}) { my $draReturnCode = system($PowerShellPath ' -File "Copy_DRA_Binaries.ps1"', $branchname, $config ); $draReturnCode = $draReturnCode >> 8; if ( $draReturnCode == 1 ) { die "Failed executing Copy_DRA_Binaries.ps1.\n"; } system($PowerShellPath ' -File "Copy_Vista_Drivers.ps1"', $branchname, $buildversion, $config ); chdir "${srcpath}\\host"; if (Log_Do("\"$msbuild_exe\" /t:restore /p:RestorePackagesConfig=true /p:Configuration=Release /p:Platform=Win32") != 0) { die "Failed to restore nuget pacakges for host.\n"; } chdir "${srcpath}\\server"; if (Log_Do("\"$msbuild_exe\" /t:restore /p:RestorePackagesConfig=true /p:Configuration=Release /p:Platform=x64") != 0) { die "Failed to restore nuget pacakges for server.\n"; } chdir "$pwd"; if (Log_Do("\"$mvss_exe\" ${srcpath}\\thirdparty\\sqlite3x\\sqlite3x.sln /project sqlite3x /build \"Release|Win32\" /out $logfile") != 0) { die "Failed to build Win32 sqlite3x.\n"; } if (Log_Do("\"$mvss_exe\" ${srcpath}\\thirdparty\\sqlite3x\\sqlite3x.sln /project sqlite3x /build \"Release|X64\" /out $logfile") != 0) { die "Failed to build X64 sqlite3x.\n"; } # workaround to generate the sqlite3x builds and copy to packages. this should be avoided by referring the libs from build path Log_Do("copy /Y ${srcpath}\\thirdparty\\sqlite3x\\sqlite3x\\lib\\win32\\Release\\sqlite3x.lib ${srcpath}\\host\\packages\\sqlite3x.0.0.6\\lib\\win32\\release\\"); Log_Do("copy /Y ${srcpath}\\thirdparty\\sqlite3x\\sqlite3x\\lib\\win32\\Release\\sqlite3x.pdb ${srcpath}\\host\\packages\\sqlite3x.0.0.6\\lib\\win32\\release\\"); Log_Do("copy /Y ${srcpath}\\thirdparty\\sqlite3x\\sqlite3x\\lib\\x64\\Release\\sqlite3x.lib ${srcpath}\\host\\packages\\sqlite3x.0.0.6\\lib\\x64\\release\\"); Log_Do("copy /Y ${srcpath}\\thirdparty\\sqlite3x\\sqlite3x\\lib\\x64\\Release\\sqlite3x.pdb ${srcpath}\\host\\packages\\sqlite3x.0.0.6\\lib\\x64\\release\\"); foreach my $product (@{$productlist}) { $project = $this->GetBuildProjectName($product); $buildoutputdir = $this->GetBuildIssDir($product); $logfile = "${srcpath}\\${buildoutputdir}\\BuildLog_${product}_${config}_${partner}.txt"; $solnfile = $this->GetSolnFileName($product); unlink "$logfile" if -e "$logfile"; if (uc($product) eq "CX") { foreach my $projectname ("CSAuthModule") { if (Log_Do("\"$mvss_exe\" ${srcpath}\\$solnfile /project $projectname /clean \"$config|x64\" /out $logfile") == 0) { print "\n\n $projectname project clean successful for configuration $config for $product in $addr\n\n"; } else { send_mail($failure_alert_ids,'Windows build failure',"$projectname project clean failed for configuration $config for $product in $addr",1); die "\n\n $projectname project clean failed for configuration $config for $product in $addr"; } if (Log_Do("\"$mvss_exe\" ${srcpath}\\$solnfile /project $projectname /build \"$config|x64\" /out $logfile") == 0 ) { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); print "\n\n$config build from $branchname is successful for $product for $projectname in $addr\n\n"; } else { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); send_mail($failure_alert_ids,'Windows build failure',"$config build from $branchname is failed for $product for $projectname in $addr",1); die "\n\n$config build from $branchname is failed for $product for $projectname in $addr"; } } } if (uc($product) ne "PSMSI") { # Main product build if (Log_Do("\"$mvss_exe\" ${srcpath}\\$solnfile /project $project /build \"$config|Win32\" /out $logfile") == 0 ) { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); Log_Do("if exist $vacp_bldlogfile copy /Y $vacp_bldlogfile ${datewisedir}\\${config}\\logs"); Log_Do("if exist $Log_bldlogfile copy /Y $Log_bldlogfile ${datewisedir}\\${config}\\logs"); Log_Do("if exist $hostagenthelpers_bldlogfile copy /Y $hostagenthelpers_bldlogfile ${datewisedir}\\${config}\\logs"); print "\n\n$config build from $branchname is successful for $product in $addr\n\n"; } else { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); Log_Do("if exist $vacp_bldlogfile copy /Y $vacp_bldlogfile ${datewisedir}\\${config}\\logs"); Log_Do("if exist $Log_bldlogfile copy /Y $Log_bldlogfile ${datewisedir}\\${config}\\logs"); Log_Do("if exist $hostagenthelpers_bldlogfile copy /Y $hostagenthelpers_bldlogfile ${datewisedir}\\${config}\\logs"); send_mail($failure_alert_ids,'Windows build failure',"$config build from $branchname is failed for $product in $addr",1); die "\n\n$config build from $branchname is failed for $product in $addr"; } } if (uc($product) eq "UA") { foreach my $projectname ("DiskFlt") { foreach my $configuration ("Win7", "Win8", "Win8.1") { Log_Do("\"$mvss_exe\" ${srcpath}\\$solnfile /project $projectname /clean \"$configuration $config|Win32\" /out $logfile"); if (Log_Do("\"$mvss_exe\" ${srcpath}\\$solnfile /project $projectname /build \"$configuration $config|Win32\" /out $logfile") == 0 ) { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); print "\n\n$config build from $branchname is successful for $product for $projectname in $addr\n\n"; } else { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); send_mail($failure_alert_ids,'Windows build failure',"$config build from $branchname is failed for $product for $projectname in $addr",1); } Log_Do("\"$mvss_exe\" ${srcpath}\\$solnfile /project $projectname /clean \"$configuration $config|x64\" /out $logfile"); if (Log_Do("\"$mvss_exe\" ${srcpath}\\$solnfile /project $projectname /build \"$configuration $config|x64\" /out $logfile") == 0 ) { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); print "\n\n$config build from $branchname is successful for $product for $projectname in $addr\n\n"; } else { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); send_mail($failure_alert_ids,'Windows build failure',"$config build from $branchname is failed for $product for $projectname in $addr",1); } } } foreach my $projectname ("cxps", "vacp", "InMageVssProvider") { if (Log_Do("\"$mvss_exe\" ${srcpath}\\$solnfile /project $projectname /clean \"$config|x64\" /out $logfile") == 0) { print "\n\n $projectname project clean successful for configuration $config for $product in $addr\n\n"; } else { send_mail($failure_alert_ids,'Windows build failure',"$projectname project clean failed for configuration $config for $product in $addr",1); die "\n\n $projectname project clean failed for configuration $config for $product in $addr"; } if (Log_Do("\"$mvss_exe\" ${srcpath}\\$solnfile /project $projectname /build \"$config|x64\" /out $logfile") == 0 ) { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); print "\n\n$config build from $branchname is successful for $product for $projectname in $addr\n\n"; } else { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); send_mail($failure_alert_ids,'Windows build failure',"$config build from $branchname is failed for $product for $projectname in $addr",1); die "\n\n$config build from $branchname is failed for $product for $projectname in $addr"; } } my $ComponentDriverDITestsolnfile = 'ComponentDriverDITest.sln'; Log_Do("\"$mvss_exe\" ${srcpath}\\host\\tests\\$ComponentDriverDITestsolnfile /clean \"$config|Win32\" /out $logfile"); if (Log_Do("\"$mvss_exe\" ${srcpath}\\host\\tests\\$ComponentDriverDITestsolnfile /build \"$config|Win32\" /out $logfile") == 0 ) { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); print "\n\n$config build from $branchname is successful for $product for $ComponentDriverDITestsolnfile in $addr\n\n"; } else { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); send_mail($failure_alert_ids,'Windows build failure',"$config build from $branchname is failed for $product for $ComponentDriverDITestsolnfile in $addr",1); die "\n\n$config build from $branchname is failed for $product for $ComponentDriverDITestsolnfile in $addr"; } my $DITestsolnfile = 'DITests.sln'; Log_Do("\"$mvss_exe\" ${srcpath}\\host\\tests\\DITests\\$DITestsolnfile /clean \"$config|Win32\" /out $logfile"); if (Log_Do("\"$mvss_exe\" ${srcpath}\\host\\tests\\DITests\\$DITestsolnfile /build \"$config|Win32\" /out $logfile") == 0 ) { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); print "\n\n$config build from $branchname is successful for $product for $DITestsolnfile in $addr\n\n"; } else { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); send_mail($failure_alert_ids,'Windows build failure',"$config build from $branchname is failed for $product for $DITestsolnfile in $addr",1); die "\n\n$config build from $branchname is failed for $product for $DITestsolnfile in $addr"; } } } } } sub DoDriverSigning { print "DEBUG: in DoDriverSigning()\n"; my $this = shift; my $srcpath = $this->SrcPath(); my $partner = $this->Partner(); my $configlist = $this->ConfigList(); my $productlist = $this->ProductList(); my $datewisedir = $this->DatewiseDir(); my $branchname = $this->Branch(); my $signing = $this->Signing(); my ($buildoutputdir,$logfile); foreach my $config (reverse sort @{$configlist}) { foreach my $product (@{$productlist}) { next if uc($product) ne "UA" and uc($product) ne "CX" and uc($product) ne "PI" and uc($product) ne "ASRUA" and uc($product) ne "ASRSETUP"; $buildoutputdir = $this->GetBuildIssDir($product); $logfile = "${srcpath}\\${buildoutputdir}\\DriverSigningLog_${product}_${config}_${partner}.txt"; my $bldlogfile = "${srcpath}\\${buildoutputdir}\\BuildLog_${product}_${config}_${partner}.txt"; my $solnfile = $this->GetSolnFileName($product); unlink "$logfile" if -e "$logfile"; my ($weekday,$month,$sdate,$hour,$min,$sec,$year) = ( localtime =~ /^(\w{3})\s+(\w{3})\s+(\d{1,2})\s+(\d{2}):(\d{2}):(\d{2})\s+(\d{4})$/ ); $sdate = sprintf("%02d", $sdate); my $sdate = "${sdate}_${month}_${year}"; my $product = uc($product); # Delete signing related files if they exists. my @signfilestoberemoved = ("InputSign.json", "OutputSign.json", "OutputSignVerbose.log"); foreach (@signfilestoberemoved) { Log_Do("if exist I:\\Signing\\$branchname\\$sdate\\$product\\$_ del /F I:\\Signing\\$branchname\\$sdate\\$product\\$_"); } # Variables specific to signing. my $inputfileslist = "$srcpath\\build\\scripts\\automation\\CodeSignScripts\\Files.json"; my $sourcerootdir = "\t\t\"SourceRootDirectory\":" . " \"I:\\\\Signing\\\\$branchname\\\\$sdate\\\\$product\\\\Unsigned\\\\$config\",\n"; my $destrootdir = "\t\t\"DestinationRootDirectory\":" . " \"I:\\\\Signing\\\\$branchname\\\\$sdate\\\\$product\\\\Signed\\\\$config\",\n"; my $inputtempfile = "$srcpath\\build\\scripts\\automation\\CodeSignScripts\\InputSignTemplate.json"; my $inputfile = "I:\\Signing\\$branchname\\$sdate\\$product\\InputSign.json"; my $outputfile = "I:\\Signing\\$branchname\\$sdate\\$product\\OutputSign.json"; my $verboselogfile = "I:\\Signing\\$branchname\\$sdate\\$product\\OutputSignVerbose.log"; if (uc($product) eq "UA") { # Copy unsigned binaries/files to submission path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Unsinged_Binaries_To_Submission_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); # Prepare files for signing. my $filessection = "UA_SIGN_FILES"; prepare_signing_files ("$inputfileslist", "$filessection", "$inputtempfile", "$inputfile", "$sourcerootdir", "$destrootdir"); # Submit binaries/files for signing. submit_files_for_signing("$product", "$config", "$inputfile", "$outputfile", "$verboselogfile"); # Copy signed binaries/files back to build path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Signed_Binaries_To_Build_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); } if (uc($product) eq "ASRUA") { # Copy managed binaries to submission path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Unsinged_Binaries_To_Submission_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); # Prepare files for signing. my $filessection = "ASRUA_SIGN_FILES"; prepare_signing_files ("$inputfileslist", "$filessection", "$inputtempfile", "$inputfile", "$sourcerootdir", "$destrootdir"); # Submit binaries/files for signing. submit_files_for_signing("$product", "$config", "$inputfile", "$outputfile", "$verboselogfile"); # Copy managed binaries to build path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Signed_Binaries_To_Build_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); if (Log_Do("\"$msbuild_exe\" ${srcpath}\\$solnfile /t:UnifiedAgentCustomActions:Rebuild /p:Configuration=$config /p:Platform=\"Any CPU\" /p:Signing=True") == 0 ) { Log_Do("if exist $bldlogfile copy /Y $bldlogfile ${datewisedir}\\${config}\\logs"); print "\n\n$config build from $branchname is successful for $product for UnifiedAgentCustomActions in $addr\n\n"; } else { Log_Do("if exist $bldlogfile copy /Y $bldlogfile ${datewisedir}\\${config}\\logs"); send_mail($failure_alert_ids,'Windows build failure',"$config build from $branchname is failed for $product for UnifiedAgentCustomActions in $addr",1); die "\n\n$config build from $branchname is failed for $product for UnifiedAgentCustomActions in $addr"; } } if (uc($product) eq "ASRSETUP") { # Copy managed binaries to submission path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Unsinged_Binaries_To_Submission_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); # Prepare files for signing. my $filessection = "ASRUS_SIGN_FILES"; prepare_signing_files ("$inputfileslist", "$filessection", "$inputtempfile", "$inputfile", "$sourcerootdir", "$destrootdir"); # Submit binaries/files for signing. submit_files_for_signing("$product", "$config", "$inputfile", "$outputfile", "$verboselogfile"); # Copy managed binaries to build path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Signed_Binaries_To_Build_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); } if (uc($product) eq "PI") { # Copy unsigned binaries to submission path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Unsinged_Binaries_To_Submission_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); # Prepare files for signing. my $filessection = "PI_SIGN_FILES"; prepare_signing_files ("$inputfileslist", "$filessection", "$inputtempfile", "$inputfile", "$sourcerootdir", "$destrootdir"); # Submit binaries/files for signing. submit_files_for_signing("$product", "$config", "$inputfile", "$outputfile", "$verboselogfile"); # Copy signed binaries to build path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Signed_Binaries_To_Build_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); } if (uc($product) eq "CX") { # Copy binaries/files to submission path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Unsinged_Binaries_To_Submission_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); # Prepare files for signing. my $filessection = "CX_SIGN_FILES"; prepare_signing_files ("$inputfileslist", "$filessection", "$inputtempfile", "$inputfile", "$sourcerootdir", "$destrootdir"); # Submit binaries/files for signing. submit_files_for_signing("$product", "$config", "$inputfile", "$outputfile", "$verboselogfile"); # Copy signed binaries/files to build path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Signed_Binaries_To_Build_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); } else { next; } Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); } } } sub DoGetPDBList { print "DEBUG: in DoGetPDBList()\n"; my $this = shift; my $config = shift; my $product = shift; my $srcpath = $this->SrcPath(); my $pwd = $this->GetThisScriptDir(); my $pdblistfilename = $this->GetProductPDBListFileName($product); my $branchname = $this->Branch(); my @pdbfilelist = (); print "\n\n$pwd $pdblistfilename values \n\n"; open my $fh,"<${pwd}\\${pdblistfilename}" or die "Could not open pdb list file ${pwd}\\${pdblistfilename} in $addr for $branchname, stopped"; while (<$fh>) { chomp; next if /^\s*\t*$/; if (/\\CONFIG\\/) { if (/\\SPECIAL_NAME/) { } s/CONFIG/ucfirst $config/e; push @pdbfilelist, "$_"; } elsif (/\\CONFIG_DEBUG_ONLY\\/) { next if $config eq "release"; s/CONFIG_DEBUG_ONLY/Debug/; push @pdbfilelist, "$_"; } elsif (/\\CONFIG_RELEASE_IS_SPECIAL\\/) { next if $config eq "debug"; s/CONFIG_RELEASE_IS_SPECIAL/ReleaseMinDependency/; push @pdbfilelist, "$_"; } elsif (/\\DRIVERCONFIG_/) { if ($config eq "debug") { s/DRIVERCONFIG/objchk/; } else { s/DRIVERCONFIG/objfre/; } push @pdbfilelist, "$_"; } else { push @pdbfilelist, "$_"; } } return @pdbfilelist; } sub DoCreatePDBZip { print "DEBUG: in DoCreatePDBZip()\n"; my $this = shift; my $srcpath = $this->SrcPath(); my $partner = $this->Partner(); my $configlist = $this->ConfigList(); my $productlist = $this->ProductList(); my $datewisedir = $this->DatewiseDir(); my $partnerstring = $this->GetPartnerString(); my $MajorVersion = $this->GetMajorVersion(); my $MinorVersion = $this->GetMinorVersion(); my $PatchSetVersion = $this->GetPatchSetVersion(); my $PatchVersion = $this->GetPatchVersion(); my $branchname = $this->Branch(); my $date = $this->Date(); my $month = $this->Month(); my $year = $this->Year(); my $pwd = $this->GetThisScriptDir(); my $buildphase = $this->BuildPhase(); my @pdbfilelist = (); my ($buildoutputdir,$logfile,$pdbzipfilebasename,$pdbzipfilefullpath,$pdbzipdirfullpath); chdir "$srcpath"; foreach my $config (reverse sort @{$configlist}) { foreach my $product (@{$productlist}) { next if $product eq "cx_tp" ; @pdbfilelist = $this->DoGetPDBList($config,$product); $buildoutputdir = $this->GetBuildIssDir($product); $logfile = "${srcpath}\\${buildoutputdir}\\PDBZipLog_${product}_${config}_${partner}.txt"; $pdbzipfilebasename = "${partnerstring}_" . uc($product) . "_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_Windows_${buildphase}_${date}${month}${year}_${config}_symbols"; $pdbzipdirfullpath = "${srcpath}\\${buildoutputdir}\\$pdbzipfilebasename"; $pdbzipfilefullpath = "${srcpath}\\${buildoutputdir}\\$pdbzipfilebasename.zip"; unlink "$logfile" if -e "$logfile"; if (rmtree $pdbzipdirfullpath) { print "\nSuccessfully deleted $pdbzipdirfullpath"; } unlink "$pdbzipfilefullpath"; Log_Do("if not exist $pdbzipdirfullpath md $pdbzipdirfullpath"); foreach (@pdbfilelist) { my $lastIndex = rindex ($_, '\\'); my $first = substr($_,0,$lastIndex); if (Log_Do("xcopy /Y /F $_ $pdbzipdirfullpath\\$first\ >> $logfile 2>&1") != 0) { print "FAILURE: $_ could not be added to $pdbzipdirfullpath for $branchname in $addr\n"; } } if (Log_Do("\"$zip_exe\" a -mx5 $pdbzipfilefullpath $pdbzipdirfullpath\\* >> $logfile 2>&1") != 0) { print "FAILURE: could not create $pdbzipfilefullpath for $branchname in $addr\n"; } if (Log_Do("\"$zip_exe\" t $pdbzipfilefullpath >> $logfile 2>&1") == 0) { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); Log_Do("if exist $pdbzipfilefullpath copy /Y $pdbzipfilefullpath ${datewisedir}\\${config}"); print "\n\n$pdbzipfilefullpath has been tested for its integrity and it passed...\n\n"; } else { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); Log_Do("if exist $pdbzipfilefullpath rename $pdbzipfilefullpath ${pdbzipfilebasename}.checkfailed"); print "\n\n$pdbzipfilefullpath has been tested for its integrity and it FAILED...\n\n"; send_mail($failure_alert_ids,'Windows build failure',"$pdbzipfilefullpath has been tested for its integrity and it failed for $branchname in $addr",1); die "\n\n$pdbzipfilefullpath has been renamed to ${pdbzipfilebasename} for $branchname in $addr.checkfailed ...\n\n"; } if (rmtree $pdbzipdirfullpath) { print "\nSuccessfully deleted $pdbzipdirfullpath"; } } } chdir "$pwd"; } sub DoCheckSymbolMatching { print "DEBUG: in DoCheckSymbolMatching()\n"; my $this = shift; my $srcpath = $this->SrcPath(); my $partner = $this->Partner(); my $symserverpath = $this->SymbolStorePath(); my $configlist = $this->ConfigList(); my $productlist = $this->ProductList(); my $datewisedir = $this->DatewiseDir(); my $pwd = $this->GetThisScriptDir(); my $branchname = $this->Branch(); my @pdbfilelist = (); my ($buildoutputdir,$logfile); chdir "$srcpath"; foreach my $config (reverse sort @{$configlist}) { foreach my $product (@{$productlist}) { next if $product eq "cx_tp" ; @pdbfilelist = $this->DoGetPDBList($config,$product); $buildoutputdir = $this->GetBuildIssDir($product); $logfile = "${srcpath}\\${buildoutputdir}\\SymbolMatchingLog_${product}_${config}_${partner}.txt"; unlink "$logfile" if -e "$logfile"; foreach (@pdbfilelist) { # Replace .pdb in pdb file name with .exe/.sys to get executable's name # This makes sense because we have to check symbol matching only for those executable that have pdb if (/(InDskFlt)[.]pdb$/) { s/[.]pdb$/.sys/; } elsif (/(VimClient)[.]pdb$/) { s/[.]pdb$/.dll/; } elsif (/(CSAuthModule)[.]pdb$/) { s/[.]pdb$/.dll/; } elsif (/(inmmessage)[.]pdb$/) { s/[.]pdb$/.dll/; } elsif (/(configtool)[.]pdb$/) { s/[.]pdb$/.dll/; } elsif (/(httpclient)[.]pdb$/) { s/[.]pdb$/.dll/; } elsif (/(InMageAPILibrary)[.]pdb$/) { s/[.]pdb$/.dll/; } elsif (/(UnifiedAgentCustomActions)[.]pdb$/) { s/[.]pdb$/.dll/; } elsif (/(ProcessServerCustomActions)[.]pdb$/) { s/[.]pdb$/.dll/; } elsif (/(diskgeneric)[.]pdb$/) { s/[.]pdb$/.dll/; } elsif (/(InMageVssProvider)[.]pdb$/) { s/[.]pdb$/.dll/; } elsif (/(InMageVssProvider_X64)[.]pdb$/) { s/[.]pdb$/.dll/; } elsif (/(ASRResources)[.]pdb$/) { s/[.]pdb$/.dll/; } elsif (/(ASRSetupFramework)[.]pdb$/) { s/[.]pdb$/.dll/; } else { s/[.]pdb$/.exe/; } if (Log_Do("\"$pdbcheck_exe\" /v $_ /s srv*C:\\symbols\\$branchname*http://localhost/symserv/$branchname/ >> $logfile 2>&1") != 0) { my $failure_msg = "FAILURE: $_ could not find a symbol in the symbol server! Symbol matching failed from $branchname for product ${product} and configuration ${config} for company ${partner} in $addr ..."; print "${failure_msg}\n"; send_mail($failure_alert_ids,'Windows build failure',"$failure_msg",1); Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); die "${failure_msg}\n"; } } Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); } } chdir "$pwd"; } sub DoLoadPDBToServer { print "DEBUG: in DoLoadPDBToServer()\n"; my $this = shift; return if $this->ShouldLoadSymbols() eq "no"; my $srcpath = $this->SrcPath(); my $symserverpath = $this->SymbolStorePath(); my $partner = $this->Partner(); my $configlist = $this->ConfigList(); my $productlist = $this->ProductList(); my $datewisedir = $this->DatewiseDir(); my $MajorVersion = $this->GetMajorVersion(); my $MinorVersion = $this->GetMinorVersion(); my $branchname = $this->Branch(); my $PatchSetVersion = $this->GetPatchSetVersion(); my $PatchVersion = $this->GetPatchVersion(); my @pdbfilelist = (); my ($buildoutputdir,$logfile); foreach my $config (reverse sort @{$configlist}) { foreach my $product (@{$productlist}) { next if $product eq "cx_tp" ; @pdbfilelist = $this->DoGetPDBList($config,$product); $buildoutputdir = $this->GetBuildIssDir($product); $logfile = "${srcpath}\\${buildoutputdir}\\SymbolLoadLog_${product}_${config}_${partner}.txt"; unlink "$logfile" if -e "$logfile"; foreach (@pdbfilelist) { my $pdbfullname = "${srcpath}\\$_"; if (Log_Do("\"$pdbload_exe\" add /f $pdbfullname /s $symserverpath /t \"DrScout${MajorVersion}\.${MinorVersion}\.${PatchSetVersion}\.${PatchVersion}\" >> $logfile 2>&1") == 0) { print "$pdbfullname has been successfully loaded to symbol server at path $symserverpath\n"; } else { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); send_mail($failure_alert_ids,'Windows build failure',"$pdbfullname could not be successfully loaded to symbol server",1); die "$pdbfullname could not be successfully loaded to symbol server for $branchname in $addr, stopped"; } } Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); } } } sub DoProductPackaging { print "DEBUG: in DoProductPackaging()\n"; my $this = shift; my $srcpath = $this->SrcPath(); my $partner = $this->Partner(); my $partnerstring = $this->GetPartnerString(); my $configlist = $this->ConfigList(); my $productlist = $this->ProductList(); my $datewisedir = $this->DatewiseDir(); my $MajorVersion = $this->GetMajorVersion(); my $MinorVersion = $this->GetMinorVersion(); my $PatchSetVersion = $this->GetPatchSetVersion(); my $PatchVersion = $this->GetPatchVersion(); my $branchname = $this->Branch(); my $partnercode = $this->GetPartnerCode(); my $bldphase = $this->BuildPhase(); my $pvt = 1; my $date = $this->Date(); my $month = $this->Month(); my $year = $this->Year(); my $buildphase = $this->BuildPhase(); my $signing = $this->Signing(); my $buildpath = "${MajorVersion}.${MinorVersion}"; my ($outputfilename,$targetfilename,$solnfile,$buildproject,$packagingproject,$packagingoutputdir,$logfile); foreach my $config (reverse sort @{$configlist}) { foreach my $product (@{$productlist}) { # Skip packaging if the product is UA/CX/PI as we don't need to generate installers for them. next if uc($product) eq "UA" or uc($product) eq "CX"; $buildproject = $this->GetBuildProjectName($product); $packagingproject = $this->GetPackagingProjectName($product); $packagingoutputdir = $this->GetBuildIssDir($product); $logfile = "${srcpath}\\${packagingoutputdir}\\PackagingLog_${product}_${config}_${partner}.txt"; $solnfile = $this->GetSolnFileName($product); unlink "$logfile" if -e "$logfile"; my $product = uc($product); # Populate version.iss file when product is CX_TP or UCX. if (uc($product) eq "CX_TP" or uc($product) eq "UCX") { Log_Do("rename $srcpath\\host\\setup\\version.iss version.iss.orig"); my $productname = uc($product); my $timeinsecs = $this->TimeInSecs(); my $refsecs = $this->GetRefSecs(); my $smrrefsecs = $this->GetSMRRefSecs(); my $dlybldnum = int(($timeinsecs - $refsecs)/86400); my $smrdlybldnum = int(($timeinsecs - $smrrefsecs)/86400); my $bldquality = $this->BuildQuality(); my $tagstring = "${bldquality}_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_${bldphase}_${dlybldnum}_${month}_${date}_${year}_${partnerstring}"; open(FH_W_V_ISS,">$srcpath\\host\\setup\\version.iss") or die "Could not open $srcpath\\host\\setup\\version.iss"; my $version_iss_contents = "#define VERSION \"${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}\"\n"; $version_iss_contents = $version_iss_contents . "#define PRODUCTVERSION \"${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}\"\n"; $version_iss_contents = $version_iss_contents . "#define APPVERSION \"${MajorVersion}.${MinorVersion}.${dlybldnum}.${partnercode}\"\n"; $version_iss_contents = $version_iss_contents . "#define PRODUCTNAME \"${productname}\"\n"; $version_iss_contents = $version_iss_contents . "#define BUILDTAG \"${tagstring}\"\n"; $version_iss_contents = $version_iss_contents . "#define BUILDNUMBER \"${dlybldnum}\"\n"; $version_iss_contents = $version_iss_contents . "#define BUILDPHASE \"${bldphase}\"\n"; $version_iss_contents = $version_iss_contents . "#define PARTNERCODE \"${partnercode}\"\n"; $version_iss_contents = $version_iss_contents . "#define BUILDDATE \"${date}${month}${year}\"\n"; $version_iss_contents = $version_iss_contents . "#define SMRBUILDNUMBER \"${smrdlybldnum}\"\n"; $version_iss_contents = $version_iss_contents . "#define COPYRIGHT \"(c) ${year} Microsoft Corp. All rights reserved.\"\n"; print FH_W_V_ISS $version_iss_contents; close(FH_W_V_ISS); print "version.iss contents are:\n\n$version_iss_contents\n\n"; } # Populate manifest.txt and copy Linux agents, push clients, DRA and MARS agents when product is UCX. if (uc($product) eq "UCX") { # Populate host\setup\manifest.txt open(FH_W_V_ISS,">$srcpath\\host\\setup\\manifest.txt") or die "Could not open $srcpath\\host\\setup\\manifest.txt"; my $manifest_contents = "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_Windows_${bldphase}_${date}${month}${year}_${config}.exe,1,Windows,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_RHEL5-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,RHEL5-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_RHEL6-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,RHEL6-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_RHEL7-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,RHEL7-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_RHEL8-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,RHEL8-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_OL6-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,OL6-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_OL7-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,OL7-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_OL8-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,OL8-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_SLES11-SP3-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,SLES11-SP3-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_SLES11-SP4-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,SLES11-SP4-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_SLES12-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,SLES12-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_SLES15-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,SLES15-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_UBUNTU-14.04-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,UBUNTU-14.04-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_UBUNTU-16.04-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,UBUNTU-16.04-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_UBUNTU-18.04-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,UBUNTU-18.04-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_UBUNTU-20.04-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,UBUNTU-20.04-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_DEBIAN7-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,DEBIAN7-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_DEBIAN8-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,DEBIAN8-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_DEBIAN9-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,DEBIAN9-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; $manifest_contents = $manifest_contents . "Microsoft-ASR_UA_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_DEBIAN10-64_${bldphase}_${date}${month}${year}_${config}.tar.gz,2,DEBIAN10-64,,${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion},Upgrade,no\n"; print FH_W_V_ISS $manifest_contents; close(FH_W_V_ISS); print "manifest.txt contents are:\n\n$manifest_contents\n\n"; # Copy Linux agents, push clients, DRA and MARS agent from their corresponding staging servers. system($PowerShellPath ' -File "Copy_RHEL.ps1"', $branchname, $buildpath, $config ); } # Set modified timestamp of CX_TP Perl modules 48 hours back. if (uc($product) eq "CX_TP") { foreach my $dirname ("Win32-0.39", "Win32-OLE-0.1709", "Win32-Process-0.14", "Win32-Service-0.06") { my $dirpath = $srcpath . "\\thirdparty\\server\\" . $dirname; ChangeModifiedTime($dirpath); } } # Set modified timestamp of UCX Perl modules 48 hours back. if (uc($product) eq "UCX") { foreach my $dirname ("Win32-UTCFileTime-1.50") { my $dirpath = $srcpath . "\\thirdparty\\server\\" . $dirname; ChangeModifiedTime($dirpath); } } if (uc($product) eq "PSMSI") { # Generate PSMSI package if (Log_Do("\"$mvss_exe\" ${srcpath}\\$solnfile /project ProcessServerMSI /build \"$config|x64\" /out $logfile") == 0 ) { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); print "\n\n$config build from $branchname is successful for $product for ProcessServerMSI in $addr\n\n"; } else { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); send_mail($failure_alert_ids,'Windows build failure',"$config build from $branchname is failed for $product for ProcessServerMSI in $addr",1); die "\n\n$config build from $branchname is failed for $product for ProcessServerMSI in $addr"; } } if (uc($product) eq "ASRUA") { foreach my $proc ("x86", "x64") { # Generate both 32-bit and 64-bit MSIs. if (Log_Do("\"$mvss_exe\" ${srcpath}\\$solnfile /project UnifiedAgentMSI /build \"$config|$proc\" /out $logfile") == 0 ) { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); print "\n\n$config build from $branchname is successful for $product for UnifiedAgentMSI in $addr\n\n"; } else { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); send_mail($failure_alert_ids,'Windows build failure',"$config build from $branchname is failed for $product for UnifiedAgentMSI in $addr",1); die "\n\n$config build from $branchname is failed for $product for UnifiedAgentMSI in $addr"; } } # Sign both 32-bit and 64-bit MSIs. my ($weekday,$month,$sdate,$hour,$min,$sec,$year) = ( localtime =~ /^(\w{3})\s+(\w{3})\s+(\d{1,2})\s+(\d{1,2}):(\d{2}):(\d{2})\s+(\d{4})$/ ); $sdate = sprintf("%02d", $sdate); my $sdate = "${sdate}_${month}_${year}"; # Copy unmanaged binaries to submission path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Unsinged_Binaries_To_Submission_Path.ps1"' , $config , "ASRUAMSI" , $srcpath, $branchname, $signing); # Delete signing related files if they exists. my @signfilestoberemoved = ("InputSign.json", "OutputSign.json", "OutputSignVerbose.log"); foreach (@signfilestoberemoved) { Log_Do("if exist I:\\Signing\\$branchname\\$sdate\\ASRUAMSI\\$_ del /F I:\\Signing\\$branchname\\$sdate\\ASRUAMSI\\$_"); } # Variables related to signing. my $inputfileslist = "$srcpath\\build\\scripts\\automation\\CodeSignScripts\\Files.json"; my $sourcerootdir = "\t\t\"SourceRootDirectory\":" . " \"I:\\\\Signing\\\\$branchname\\\\$sdate\\\\ASRUAMSI\\\\Unsigned\\\\$config\",\n"; my $destrootdir = "\t\t\"DestinationRootDirectory\":" . " \"I:\\\\Signing\\\\$branchname\\\\$sdate\\\\ASRUAMSI\\\\Signed\\\\$config\",\n"; my $inputtempfile = "$srcpath\\build\\scripts\\automation\\CodeSignScripts\\InputSignTemplate.json"; my $inputfile = "I:\\Signing\\$branchname\\$sdate\\ASRUAMSI\\InputSign.json"; my $outputfile = "I:\\Signing\\$branchname\\$sdate\\ASRUAMSI\\OutputSign.json"; my $verboselogfile = "I:\\Signing\\$branchname\\$sdate\\ASRUAMSI\\OutputSignVerbose.log"; # Prepare files for signing. my $filessection = "ASRUA_MSI_SIGN_FILES"; prepare_signing_files ("$inputfileslist", "$filessection", "$inputtempfile", "$inputfile", "$sourcerootdir", "$destrootdir"); # Submit MSIs for signing. submit_files_for_signing("$product", "$config", "$inputfile", "$outputfile", "$verboselogfile"); # Copy unmanaged binaries to build path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Signed_Binaries_To_Build_Path.ps1"' , $config , "ASRUAMSI" , $srcpath, $branchname, $signing); # Generate UnifiedAgent package if (Log_Do("\"$mvss_exe\" ${srcpath}\\$solnfile /project PackagerUnifiedAgent /build \"$config|Any\ CPU\" /out $logfile") == 0 ) { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); print "\n\n$config build from $branchname is successful for $product for PackagerUnifiedAgent in $addr\n\n"; } else { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); send_mail($failure_alert_ids,'Windows build failure',"$config build from $branchname is failed for $product for PackagerUnifiedAgent in $addr",1); die "\n\n$config build from $branchname is failed for $product for PackagerUnifiedAgent in $addr"; } } elsif (uc($product) eq "ASRSETUP") { my $product = uc($product); # Build UnifiedSetup Packager if (Log_Do("\"$mvss_exe\" ${srcpath}\\$solnfile /project Packager /build \"$config|Any\ CPU\" /out $logfile") == 0 ) { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); print "\n\n$config build from $branchname is successful for $product for packager in $addr\n\n"; } else { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); send_mail($failure_alert_ids,'Windows build failure',"$config build from $branchname is failed for $product for packager in $addr",1); die "\n\n$config build from $branchname is failed for $product for packager in $addr"; } } elsif (uc($product) eq "PI") { my $product = uc($product); print "\n\nSkipping packaging as product is $product\n\n"; } else { if (Log_Do("\"$mvss_exe\" ${srcpath}\\$solnfile /project $packagingproject /build \"$config|Win32\" /out $logfile") == 0) { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); print "\n\n$config packaging for $branchname is successful for $product in $addr\n\n"; } else { Log_Do("if exist $logfile copy /Y $logfile ${datewisedir}\\${config}\\logs"); send_mail($failure_alert_ids,'Windows build failure',"$config packaging for $branchname is failed for $product in $addr",1); die "\n\n$config packaging for $branchname is failed for $product in $addr"; } } # Sign installers. my ($weekday,$month,$sdate,$hour,$min,$sec,$year) = ( localtime =~ /^(\w{3})\s+(\w{3})\s+(\d{1,2})\s+(\d{1,2}):(\d{2}):(\d{2})\s+(\d{4})$/ ); $sdate = sprintf("%02d", $sdate); my $sdate = "${sdate}_${month}_${year}"; # Delete signing related files if they exists. my @signfilestoberemoved = ("InputSign.json", "OutputSign.json", "OutputSignVerbose.log"); foreach (@signfilestoberemoved) { Log_Do("if exist I:\\Signing\\$branchname\\$sdate\\${product}_INSTALLER\\$_ del /F I:\\Signing\\$branchname\\$sdate\\${product}_INSTALLER\\$_"); } # Variables specific to signing. my $inputfileslist = "$srcpath\\build\\scripts\\automation\\CodeSignScripts\\Files.json"; my $sourcerootdir = "\t\t\"SourceRootDirectory\":" . " \"I:\\\\Signing\\\\$branchname\\\\$sdate\\\\${product}_INSTALLER\\\\Unsigned\\\\$config\",\n"; my $destrootdir = "\t\t\"DestinationRootDirectory\":" . " \"I:\\\\Signing\\\\$branchname\\\\$sdate\\\\${product}_INSTALLER\\\\Signed\\\\$config\",\n"; my $inputtempfile = "$srcpath\\build\\scripts\\automation\\CodeSignScripts\\InputSignTemplate.json"; my $inputfile = "I:\\Signing\\$branchname\\$sdate\\${product}_INSTALLER\\InputSign.json"; my $outputfile = "I:\\Signing\\$branchname\\$sdate\\${product}_INSTALLER\\OutputSign.json"; my $verboselogfile = "I:\\Signing\\$branchname\\$sdate\\${product}_INSTALLER\\OutputSignVerbose.log"; if (uc($product) eq "CX_TP") { # Copy installer to submission path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Unsinged_Installers_To_Submission_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); # Prepare files for signing. my $filessection = "CXTP_SIGN_INSTALLER"; prepare_signing_files ("$inputfileslist", "$filessection", "$inputtempfile", "$inputfile", "$sourcerootdir", "$destrootdir"); # Submit installer or signing. submit_files_for_signing("$product", "$config", "$inputfile", "$outputfile", "$verboselogfile"); # Copy installer to build path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Singed_Installers_To_Build_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); } if (uc($product) eq "UCX") { # Copy installer to submission path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Unsinged_Installers_To_Submission_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); # Prepare files for signing. my $filessection = "UCX_SIGN_INSTALLER"; prepare_signing_files ("$inputfileslist", "$filessection", "$inputtempfile", "$inputfile", "$sourcerootdir", "$destrootdir"); # Submit installer for signing. submit_files_for_signing("$product", "$config", "$inputfile", "$outputfile", "$verboselogfile"); # Copy installer to build path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Singed_Installers_To_Build_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); } if (uc($product) eq "ASRUA") { $packagingoutputdir = qw(host\ASRSetup\PackagerUnifiedAgent\bin); # Copy installer to submission path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Unsinged_Installers_To_Submission_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); # Prepare files for signing. my $filessection = "ASRUA_SIGN_INSTALLER"; prepare_signing_files ("$inputfileslist", "$filessection", "$inputtempfile", "$inputfile", "$sourcerootdir", "$destrootdir"); # Submit installer for signing. submit_files_for_signing("$product", "$config", "$inputfile", "$outputfile", "$verboselogfile"); # Copy installer to build path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Singed_Installers_To_Build_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); } if (uc($product) eq "PSMSI") { $packagingoutputdir = qw(\server\windows\ProcessServerMSI\x64\bin); # Copy installer to submission path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Unsinged_Installers_To_Submission_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); # Prepare files for signing. my $filessection = "PSMSI_SIGN_FILES"; prepare_signing_files ("$inputfileslist", "$filessection", "$inputtempfile", "$inputfile", "$sourcerootdir", "$destrootdir"); # Submit installer or signing. submit_files_for_signing("$product", "$config", "$inputfile", "$outputfile", "$verboselogfile"); # Copy installer to build path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Singed_Installers_To_Build_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); } if (uc($product) eq "ASRSETUP") { $packagingoutputdir = qw(host\ASRSetup\Packager\bin); # Copy installer to submission path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Unsinged_Installers_To_Submission_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); # Prepare files for signing. my $filessection = "ASRSETUP_SIGN_INSTALLER"; prepare_signing_files ("$inputfileslist", "$filessection", "$inputtempfile", "$inputfile", "$sourcerootdir", "$destrootdir"); # Submit installer for signing. submit_files_for_signing("$product", "$config", "$inputfile", "$outputfile", "$verboselogfile"); # Copy installer to build path. system($PowerShellPath ' -File ".\\CodeSignScripts\\Copy_Singed_Installers_To_Build_Path.ps1"' , $config , $product , $srcpath, $branchname, $signing); } if (uc($product) eq "PI") { my $product = uc($product); print "\n\nSkipping exe file packaging as product is $product and build is disabled for this.\n\n"; } else { $outputfilename = "${srcpath}\\${packagingoutputdir}\\${config}\\" . $this->GetOutputFileName($product); die "\n\nCannot find outputfilename - $outputfilename" unless -e $outputfilename; } if (uc($product) eq "UCX") { $targetfilename = "${datewisedir}\\${config}\\Microsoft-ASR_" . "CX" . "_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_Windows_${buildphase}"; } elsif (uc($product) eq "ASRUA") { $targetfilename = "${datewisedir}\\${config}\\Microsoft-ASR_UA" . "_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_Windows_${buildphase}"; } else { $targetfilename = "${datewisedir}\\${config}\\Microsoft-ASR_" . uc($product) . "_${MajorVersion}.${MinorVersion}.${PatchSetVersion}.${PatchVersion}_Windows_${buildphase}"; } $targetfilename = $targetfilename . "_${date}${month}${year}_${config}.exe"; if (uc($product) eq "ASRSETUP") { $targetfilename = "${datewisedir}\\${config}\\" . $this->GetOutputFileName($product); } elsif (uc($product) eq "PSMSI") { $targetfilename = "${datewisedir}\\${config}\\" . $this->GetOutputFileName($product); } my $prodversion = "${MajorVersion}.${MinorVersion}"; if (Log_Do("copy /Y $outputfilename $targetfilename")==0) { print "\n\nPackaged $targetfilename successful\n\n"; system($PowerShellPath ' -File "TRUNK_Builds_Copy.ps1"' , $config , uc($product), $branchname, $buildpath, $prodversion); } else { send_mail($failure_alert_ids,'Windows build failure',"Packaging failure from $branchname for $product for $config in $addr",1); die "\n\nPackaging failure from $branchname for $product for $config"; } } } } # Create Nuget packages. sub CreateNugetPackages { print "Creating Nuget packages."; my $this = shift; my $branchname = $this->Branch(); my $srcpath = $this->SrcPath(); my $MajorVersion = $this->GetMajorVersion(); my $MinorVersion = $this->GetMinorVersion(); my $Prod_Version="${MajorVersion}.${MinorVersion}"; my $NugetCreationFolder = "$srcpath\\build\\NugetCreation"; my $NugetCreationScript = "$NugetCreationFolder\\NugetCreation.ps1"; my $ret_val = system($PowerShellPath " -File \"$NugetCreationScript\"" , $branchname, $Prod_Version, $NugetCreationFolder); if ($ret_val eq 0) { print "Successfully created Nuget packages."; } else { print "Nuget packages creation failed."; } my $MarsNugetCreationFolder = "$srcpath\\build\\MarsNugetCreation"; my $MarsNugetCreationScript = "$MarsNugetCreationFolder\\MarsNugetCreation.ps1"; my $ret_val = system($PowerShellPath " -File \"$MarsNugetCreationScript\"" , $Prod_Version, $Prod_Version, $MarsNugetCreationFolder); if ($ret_val eq 0) { print "Successfully created Mars Nuget packages."; } else { print "Mars Nuget packages creation failed."; } } sub DoPSGalleryImageBuild { print "Inside DoPSGalleryImageBuild function"; my $this = shift; my $branchname = $this->Branch(); if (uc($branchname) eq "RELEASE") { my $datewisedir = $this->DatewiseDir(); my $MajorVersion = $this->GetMajorVersion(); my $MinorVersion = $this->GetMinorVersion(); my $buildpath = "${MajorVersion}.${MinorVersion}"; my $srcpath = $this->SrcPath(); my $PSConfigPath = "$srcpath\\build\\PsDeployment\\PsConfig.xml"; my $PSConfigBuilderPath = "$srcpath\\build\\PsDeployment\\PSConfigBuilder.ps1"; my $PSDeploymentScriptPath = "$srcpath\\build\\PsDeployment\\PSDeployment.ps1"; my $PSGISourceLogPath = "$srcpath\\build\\PsDeployment\\PSLogs\\DeployPS.log"; my $PSGITargetLogPath = "${datewisedir}\\DeployPS.log"; my $PSCredsPath = "C:\\PS_CERT_DO_NOT_DELETE\\Credentials.xml"; system($PowerShellPath " -File \"$PSConfigBuilderPath\"" , $MajorVersion , $MinorVersion, $PSConfigPath, $PSCredsPath); my $ret_val = system($PowerShellPath " -File \"$PSDeploymentScriptPath\""); if ($ret_val eq 0 ) { print "Successfully created PS Gallery Image."; } else { print "PS GAllery Image Creation failed."; } # Copy log to build and staging paths. Log_Do("copy /Y $PSGISourceLogPath $PSGITargetLogPath"); system($PowerShellPath ' -File "TRUNK_Builds_Copy.ps1"' , "release", "PSGI", $branchname, $buildpath); } } # ----------------------------------------------------------------------------------------------------------------------------- # ----------------------- END : HELPER FUNCTIONS OF THIS CLASS ----------------------------------------------------------------- # ----------------------------------------------------------------------------------------------------------------------------- # ----------------------------------------------------------------------------------------------------------------------------- # ----------------------- BEGIN: MAIN FUNCTION OF THIS CLASS ----------------------------------------------------------------- # ----------------------------------------------------------------------------------------------------------------------------- sub Start { print "DEBUG: in Start()\n"; my $this = shift; # Since there is a possibility of date change between start and end of this function, # it is better to capture time stats during start and use them uniformly everywhere my ($weekday,$month,$date,$hour,$min,$sec,$year) = ( localtime =~ /^(\w{3})\s+(\w{3})\s+(\d{1,2})\s+(\d{2}):(\d{2}):(\d{2})\s+(\d{4})$/ ); if(length($date) == 1) { $date = "0" . $date; } $this->Date($date); $this->Month($month); $this->Year($year); $this->TimeInSecs(time); # Create the buildoutputdir and datewise structure under it now $this->CreateDatewiseDirStructure(); # Clean previous builds if desired $this->DoCleanup() if $this->ShouldCleanPrevBuild(); # Make branding changes $this->DoBrandingChanges(); # Start the builds $this->DoProductBuilds(); # Do the driver signing $this->DoDriverSigning(); # Load pdb to sym server $this->DoLoadPDBToServer(); # Create the zip of PDBs $this->DoCreatePDBZip(); # Check symbol matching $this->DoCheckSymbolMatching(); # Start the packaging $this->DoProductPackaging(); # Create Nuget packages. $this->CreateNugetPackages(); # Create PS Gallery Image $this->DoPSGalleryImageBuild(); } # ----------------------------------------------------------------------------------------------------------------------------- # ----------------------- END: MAIN FUNCTION OF THIS CLASS ----------------------------------------------------------------- # ----------------------------------------------------------------------------------------------------------------------------- 1;