Advertisement
Guest User

Untitled

a guest
Mar 18th, 2019
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.70 KB | None | 0 0
  1. #In this script I expect that the user is already logged in into Azure DevOps with the VSTeam module
  2.  
  3. $projectName = "Pipeline Artifacts vs Build Artifacts"
  4. $buildDefinitionIds = @(15,16,17,19)
  5. $csvStatsFilePath = "C:\temp\BuildStats.csv"
  6.  
  7. #function to convert the flat timeline logs to a parent child tree, since the timeline has
  8. #pipeline, phases and tasks which follow a hierarchy
  9. Function ConvertTo-TreeArray($flatArray,$parentKey,$childKey){
  10.  
  11. $groupedByDefinition = $flatArray | Group-Object -Property $parentKey
  12.  
  13. foreach($flatObj in $flatArray){
  14.  
  15. $children = $groupedByDefinition | Where-Object {
  16. $_.Name -eq $flatObj.$childKey
  17. }
  18.  
  19. if($null -ne $children){
  20.  
  21. $children = $children | Sort-Object order
  22. Add-Member -InputObject $flatObj -MemberType NoteProperty -Name Children -Value $children.Group
  23. }
  24.  
  25. }
  26.  
  27. return $flatArray | Where-Object { $_.name -eq "__default"}
  28. }
  29.  
  30. # Get Build Stats
  31.  
  32. $builds = Get-VSTeamBuild -ProjectName $projectName -StatusFilter completed -Definitions $buildDefinitionIds | Sort-Object -Property queueTime,definitionName
  33.  
  34. $InformationPreference = "continue"
  35. $ErrorActionPreference = "stop"
  36.  
  37. $buildTimelines = @()
  38.  
  39. foreach($build in $builds){
  40.  
  41. Write-Information -MessageData "Checking build $($build.buildNumber) for definition $($build.definitionName)"
  42.  
  43. $url = "$($build._links.timeline.href)?api-version=5.1-preview.2"
  44.  
  45. $json = Invoke-RestMethod -Method Get -Uri $url
  46.  
  47. $buildTimeline = $json.records
  48.  
  49. $selectedTimeline = $buildTimeline #| Select-Object -Property id,parentId,type,Name,startTime,finishTime,order
  50.  
  51. #$selectedTimeline | Out-GridView
  52.  
  53. $treeArray = ConvertTo-TreeArray -flatArray $selectedTimeline -parentKey "parentId" -childKey "Id"
  54.  
  55. Add-Member -InputObject $treeArray -MemberType NoteProperty -Name BuildName -Value $build.definitionName
  56. Add-Member -InputObject $treeArray -MemberType NoteProperty -Name BuildNumber -Value $build.buildNumber
  57. Add-Member -InputObject $treeArray -MemberType NoteProperty -Name BuildId -Value $build.id
  58.  
  59. $buildTimelines = $buildTimelines + $treeArray
  60.  
  61. }
  62.  
  63.  
  64. # build the csv to be exported
  65. $exportedBuildStats = @()
  66.  
  67. foreach($timeline in $buildTimelines){
  68.  
  69. $exportStatInfo = @{}
  70.  
  71. foreach($phase in $timeline.Children){
  72.  
  73. if($null -eq $phase.children){
  74. continue
  75. }
  76.  
  77. $job = $phase.Children[0]
  78.  
  79. foreach($task in $job.Children){
  80.  
  81. [datetime]$endTimeDt = [datetime]$task.finishTime
  82. [datetime]$startTimeDt = [datetime]$task.startTime
  83.  
  84. #rounding time to milliseconds by deducting it's ticks down to the current second
  85. $endTimeDt = $endTimeDt.Ticks - ($endTimeDt.Ticks % [TimeSpan]::TicksPerSecond)
  86. $startTimeDt = $startTimeDt.Ticks - ($startTimeDt.Ticks % [TimeSpan]::TicksPerSecond)
  87.  
  88. $exportStatInfo = [ordered] @{
  89. "BuildName" = $timeline.BuildName
  90. "BuildNumber" = $timeline.BuildNumber
  91. "BuildId" = $timeline.BuildId
  92. "Phase" = $phase.name
  93. "TaskName" = $task.name
  94. "TaskStartTime" = $startTimeDt
  95. "TaskFinishTime" = $endTimeDt
  96. "TaskOrder" = $task.order
  97. "TaskRuntimeSpan" = $endTimeDt - $startTimeDt
  98. "TaskResult" = $task.result
  99. }
  100.  
  101. $exportStat = New-Object -TypeName PSObject -Property $exportStatInfo
  102.  
  103. $exportedBuildStats = $exportedBuildStats + $exportStat
  104. }
  105.  
  106. }
  107. }
  108.  
  109. #$exportedBuildStats | Out-GridView
  110. $exportedBuildStats | ConvertTo-Csv -Delimiter ";" -NoTypeInformation | Out-File -FilePath $csvStatsFilePath -Encoding utf8
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement