function Invoke-WebTests { <# .SYNOPSIS Helper function that wraps Start-WebTests and sets up the variables needed for Start-WebTests. .DESCRIPTION This is intended to be used from a TeamCity agent as it uses Invoke-Command -Script {Start-WebTests} which are to be run on each web-tier server. .PARAMETER Servers String CSV of servers to run the Start-WebTests on. .PARAMETER AwsProfile Aws Profile to use for S3 bucket. .PARAMETER EnvironmentType Which environment (dev, prod) to run the tests on. Uses different URLs based on environmentType. .PARAMETER SitesToSkip A list of sites to skip web tests on. Http/https will be trimmed .PARAMETER SkipWidgetWarmup Bool to skip warming up the widgets with a throw-away http request to all configured widgets on a site. Defaults to true (skip widget warmup). .NOTES Keeps track of all the tests and will return bool if they all pass or any fail. return $PassedAllTests #> [cmdletbinding()] [OutputType([System.Boolean])] param( [Parameter(Mandatory = $true)] [string[]]$Servers, [Parameter(Mandatory = $false)] [string]$AwsProfile, [Parameter(Mandatory = $false)] [string[]]$SitesToSkip, [Parameter(Mandatory = $false)] [bool]$SkipWidgetWarmUp = $true, [Parameter(Mandatory = $false)] [int]$MaximumSitesToTest = 20, [Parameter(Mandatory = $false)] [int]$SiteThreads = 4, [Parameter(Mandatory = $false)] [int]$WidgetThreads = 8, [Parameter(Mandatory = $false)] [string[]]$ServerTargetOverride ) if([string]::IsNullOrEmpty($AwsProfile)) { $AwsProfile = "prod" } $logLead = (Get-LogLeadName) $passedAllTests = $true $sitesToSkipArray = @() # We do a type check here to determine if this was called directly from TC or not. If yes, clean it up. if($null -ne $SitesToSkip -and $SitesToSkip -match ",|\s+") { Write-Host "Got called from TC directly. Doing the splits for sites to skip." # Split out individual sites, divided by commas or spaces. Ignore blanks. $sitesToSkipArray = ($SitesToSkip -split ',|\s+') | Where-Object {("" -ne $_)} } else { $sitesToSkipArray = $SitesToSkip } if (![String]::IsNullOrEmpty($ServerTargetOverride)) { # Same type check here. Split override servers if there's more than one. # Also split servers, because we're coming from TC, so it must be a string as well. if(($Servers -match ",") -or ($ServerTargetOverride -match ",|\s+")) { Write-Host "Got called from TC directly. Doing the splits for override servers." [array]$overrideArray = ($ServerTargetOverride -split ',|\s+') | Where-Object {("" -ne $_)} [array]$serverArray = $Servers.split(',') Write-Host "$logLead : ServerArray $serverArray" Write-Host "$logLead : OverrideArray $overrideArray" } else { Write-Host "Got Arrays, passing through" [array]$overrideArray = $ServerTargetOverride [array]$serverArray = $Servers } $unexpectedServers = $overrideArray.Where{ $_ -notin $serverArray } if (($null -ne $unexpectedServers) -and ($unexpectedServers.Count -gt 0)) { throw "$logLead : Received unexpected servers/values in the Server Target Override List. Re-examine your parameter list. Unexpected: $unexpectedServers" } else { $finalServers = $overrideArray } } else { $finalServers = $Servers } # Get the logins try{ $loginsJson = Get-LoginsToTest -AwsProfile $AwsProfile } catch { Write-Warning "$logLead : Exception getting logins to test!" $ex = $_ Resolve-Error -ErrorRecord $ex Write-Host "$logLead : Setting test results to failed, returning False." return $false } # Get the Urls try { $coreUrlsJson = Get-CoreUrlsToTest -AwsProfile $AwsProfile } catch { Write-Warning "$logLead : Exception getting core URLs to test!" $ex = $_ Resolve-Error -ErrorRecord $ex Write-Host "$logLead : Setting test results to failed, returning False." return $false } # Kick off the webtests on the servers try { $serverScriptArguments = @{ LoginsJson = $loginsJson CoreUrlsJson = $coreUrlsJson SitesToSkip = $sitesToSkipArray MaximumSitesToTest = $MaximumSitesToTest SkipWidgetWarmUp = $SkipWidgetWarmUp SiteThreads = $SiteThreads WidgetThreads = $WidgetThreads } $results = Invoke-ParallelServers -Servers $finalServers -ReturnObjects -Arguments $serverScriptArguments -Script { param($inputArguments) $server = (Get-FullyQualifiedServerName) $sbLoginsJson = $inputArguments.LoginsJson $sbCoreUrlsJson = $inputArguments.CoreUrlsJson $sbSitesToSkip = $inputArguments.SitesToSkip $sbMaximumSitesToTest = $inputArguments.MaximumSitesToTest $sbSkipWidgetWarmUp = $inputArguments.SkipWidgetWarmUp $sbSiteThreads = $inputArguments.SiteThreads $sbWidgetThreads = $inputArguments.WidgetThreads Write-Host "##teamcity[blockOpened name='$server']" $result = (Start-WebTests -LoginsJson $sbLoginsJson ` -CoreUrlsJson $sbCoreUrlsJson ` -SitesToSkip $sbSitesToSkip ` -MaximumSitesToTest $sbMaximumSitesToTest ` -SkipWidgetWarmUp $sbSkipWidgetWarmup ` -SiteThreads $sbSiteThreads ` -WidgetThreads $sbWidgetThreads) Write-Host "##teamcity[blockClosed name='$server']" return $result } foreach($result in $results) { if(!$result) { $passedAllTests = $false } } } catch { Write-Warning "$logLead : Error during web tests!" $ex = $_ Resolve-Error -ErrorRecord $ex Write-Host "$logLead : Setting test results to failed, returning False." $passedAllTests = $false } Write-Host "$logLead : Has passed all tests? : $passedAllTests" return $passedAllTests }