eng/common/scripts/New-RegenerateMatrix.ps1 (79 lines of code) (raw):

[CmdLetBinding()] param ( [Parameter()] [string]$OutputDirectory, [Parameter()] [string]$OutputVariableName, [Parameter()] [int]$JobCount = 8, # The minimum number of items per job. If the number of items is less than this, then the number of jobs will be reduced. [Parameter()] [int]$MinimumPerJob = 10, [Parameter()] [string]$OnlyTypeSpec ) . (Join-Path $PSScriptRoot common.ps1) [bool]$OnlyTypespec = $OnlyTypespec -in @("true", "t", "1", "yes", "y") # Divide the items into groups of approximately equal size. function Split-Items([array]$Items) { # given $Items.Length = 22 and $JobCount = 5 # then $itemsPerGroup = 4 # and $largeJobCount = 2 # and $group.Length = 5, 5, 4, 4, 4 $itemCount = $Items.Length $jobsForMinimum = $itemCount -lt $MinimumPerJob ? 1 : [math]::Floor($itemCount / $MinimumPerJob) if ($JobCount -gt $jobsForMinimum) { $JobCount = $jobsForMinimum } $itemsPerGroup = [math]::Floor($itemCount / $JobCount) $largeJobCount = $itemCount % $itemsPerGroup $groups = [object[]]::new($JobCount) $i = 0 for ($g = 0; $g -lt $JobCount; $g++) { $groupLength = if ($g -lt $largeJobCount) { $itemsPerGroup + 1 } else { $itemsPerGroup } $group = [object[]]::new($groupLength) $groups[$g] = $group for ($gi = 0; $gi -lt $groupLength; $gi++) { $group[$gi] = $Items[$i++] } } Write-Host "$itemCount items split into $JobCount groups of approximately $itemsPerGroup items each." return , $groups } # ensure the output directory exists New-Item -ItemType Directory -Path $OutputDirectory -Force | Out-Null if (Test-Path "Function:$GetDirectoriesForGenerationFn") { $directoriesForGeneration = &$GetDirectoriesForGenerationFn -OnlyTypeSpec $OnlyTypespec } else { $directoriesForGeneration = Get-ChildItem "$RepoRoot/sdk" -Directory | Get-ChildItem -Directory if ($OnlyTypespec) { $directoriesForGeneration = $directoriesForGeneration | Where-Object { Test-Path "$_/tsp-location.yaml" } } } [array]$packageDirectories = $directoriesForGeneration | Sort-Object -Property FullName | ForEach-Object { [ordered]@{ "PackageDirectory" = "$($_.Parent.Name)/$($_.Name)" "ServiceArea" = $_.Parent.Name } } $batches = Split-Items -Items $packageDirectories $matrix = [ordered]@{} for ($i = 0; $i -lt $batches.Length; $i++) { $batch = $batches[$i] $json = $batch.PackageDirectory | ConvertTo-Json -AsArray $firstPrefix = $batch[0].ServiceArea.Substring(0, 2) $lastPrefix = $batch[-1].ServiceArea.Substring(0, 2) $key = "$firstPrefix`_$lastPrefix`_$i" $fileName = "$key.json" Write-Host "`n`n==================================" Write-Host $fileName Write-Host "==================================" $json | Out-Host $json | Out-File "$OutputDirectory/$fileName" $matrix[$key] = [ordered]@{ "JobKey" = $key; "DirectoryList" = $fileName } } $compressed = ConvertTo-Json $matrix -Depth 100 -Compress Write-Output "##vso[task.setVariable variable=$OutputVariableName;isOutput=true]$compressed"