When it comes to fixing broken builds, the first step is to determine when the last successful build run and which builds failed afterwards.
In practice I'm looking for the state of 20 build definitions each morning, but here I reduce the script to a single one.
# adapt the following 4 lines to your environment Add-Type -Path "C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.Build.Client.dll" $tfsuri = 'your tfs server' $project = "your prpject" $buildDefinition = 'Main' function Get-BuildInfo { param( $buildDefinition, $MaxBuildsPerDefinition = 5, [switch]$DontBreakOnSuccess, [switch]$Starttime ) #Write-Host "Using MaxBuildsPerDefinition $MaxBuildsPerDefinition" $tfs = [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory]::GetServer($tfsuri) $buildServerType = [Microsoft.TeamFoundation.Build.Client.IBuildServer] $buildServer = $tfs.GetService($buildServerType); $buildDetailSpec = $buildServer.CreateBuildDetailSpec($project, $buildDefinition); if ($Starttime) { $buildDetailSpec.QueryOrder = [Microsoft.TeamFoundation.Build.Client.BuildQueryOrder]::StartTimeDescending } else { $buildDetailSpec.QueryOrder = [Microsoft.TeamFoundation.Build.Client.BuildQueryOrder]::FinishTimeDescending } $buildDetailSpec.MaxBuildsPerDefinition = $MaxBuildsPerDefinition try { $buildQueryResult = $buildServer.QueryBuilds($buildDetailSpec) foreach ($build in $buildQueryResult.builds) { # [Microsoft.TeamFoundation.Build.Client.IBuildDetail]$buildDetail = $buildQueryResult.builds[0] $tfsBuildNumber = $build.BuildNumber $shortBuildNumber = $tfsBuildNumber.Substring($tfsBuildNumber.LastIndexOf('_')+1) # #$shortBuildNumber # $buildQueryResult.failures.length # $buildQueryResult.builds.length # $buildQueryResult.builds[0].BuildNumber # #$buildQueryResult.builds[0].Status # #$buildQueryResult.builds[0].BuildDefinitionUri.AbsolutePath # $buildQueryResult.builds[0].StartTime # $buildQueryResult.builds[0].FinishTime $buildAgent = '??' $build.Information | % { $_.nodes | % { try { $buildAgent = $_.children.nodes[2].fields['ReservedAgentName'] } catch { } } } New-Object PSObject -Property @{ Buildnumber = $build.BuildNumber; Status = $build.Status; CompilationStatus = $build.CompilationStatus; Start = $build.StartTime; End = $build.FinishTime; DropLocation = $build.DropLocation; SourceGetVersion = $build.SourceGetVersion; BuildAgent = $buildAgent } if ($build.Status -eq 'Succeeded' -and ! $DontBreakOnSuccess) { break } } } catch [Exception] { throw "TFS nicht erreichbar." } } $a = @(Get-BuildInfo $buildDefinition) $a | % { if ($_.Status -eq 'InProgress') { $end = Get-Date } else { $end = $_.End } "{0,-32} {1,18} {2:ddd} {3} - {4:T} {5,5:0} {6} {7,6} {8}" -f $_.Buildnumber, $_.Status, $_.Start, $_.Start, $End, ($End -$_.Start).Totalminutes, $_.SourceGetVersion, $_.buildAgent, $Droplocation }
The result tells me start time, end time, duration, included change set and drop location.
In the case of failed builds I some further checks on the log files not included here to dispatch the problem as quick as possible to the developer who caused the problem.
Keine Kommentare:
Kommentar veröffentlichen