Skip to content

Commit 77f51c0

Browse files
fix: catch error codes in parallel (#3504)
* catch and report exitcodes for individual modules * build all modules in parrallel and catch at the end
1 parent b85f311 commit 77f51c0

File tree

2 files changed

+63
-25
lines changed

2 files changed

+63
-25
lines changed

tools/GenerateModules.ps1

Lines changed: 61 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,10 @@ $AutoRestTempFolder | ForEach-Object {
9494
$Stopwatch = [system.diagnostics.stopwatch]::StartNew()
9595
$CpuCount = (Get-CimInstance Win32_Processor).NumberOfLogicalProcessors
9696
$Throttle = [math]::Min(4, $cpuCount / 2) # Use half the CPU count but max 4
97-
$ModuleToGenerate | ForEach-Object -Parallel {
97+
$Results = $ModuleToGenerate | ForEach-Object -Parallel {
9898
$Module = $_
9999
Write-Host -ForegroundColor Green "-------------'Generating $Module'-------------"
100+
100101
$ServiceModuleParams = @{
101102
Module = $Module
102103
ModulesSrc = $using:ModulesSrc
@@ -111,32 +112,69 @@ $ModuleToGenerate | ForEach-Object -Parallel {
111112
ArtifactsLocation = $using:ArtifactsLocation
112113
RequiredModules = $using:RequiredGraphModules
113114
}
114-
& $using:GenerateServiceModulePS1 @ServiceModuleParams
115-
function Get-OpenFiles {
116-
param (
117-
[string] $Path
118-
)
119-
$OpenFiles = @()
120-
$Files = Get-ChildItem -Path $Path -Recurse -Directory | Where-Object { $_.Name -match "autorest" }
121-
$Files | ForEach-Object {
122-
$File = $_
123-
try {
124-
$FileStream = $File.Open([System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None)
125-
$FileStream.Close()
126-
}
127-
catch {
128-
$OpenFiles += $File.FullName
115+
116+
try {
117+
$Result = & $using:GenerateServiceModulePS1 @ServiceModuleParams
118+
119+
# Check if the script returned an exit code (failure)
120+
if ($null -ne $Result -and $Result -is [int] -and $Result -ne 0) {
121+
Write-Host -ForegroundColor Red "Failed to generate module '$Module' with exit code $Result"
122+
return @{ Module = $Module; Success = $false; ExitCode = $Result; Error = "Generation or build failed" }
123+
}
124+
125+
# Also check $LASTEXITCODE in case the script didn't return but set exit code
126+
if ($null -ne $LASTEXITCODE -and $LASTEXITCODE -ne 0) {
127+
Write-Host -ForegroundColor Red "Failed to generate module '$Module' with exit code $LASTEXITCODE"
128+
return @{ Module = $Module; Success = $false; ExitCode = $LASTEXITCODE; Error = "Generation or build failed" }
129+
}
130+
131+
function Get-OpenFiles {
132+
param (
133+
[string] $Path
134+
)
135+
$OpenFiles = @()
136+
$Files = Get-ChildItem -Path $Path -Recurse -Directory | Where-Object { $_.Name -match "autorest" }
137+
$Files | ForEach-Object {
138+
$File = $_
139+
try {
140+
$FileStream = $File.Open([System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None)
141+
$FileStream.Close()
142+
}
143+
catch {
144+
$OpenFiles += $File.FullName
145+
}
129146
}
147+
return $OpenFiles
148+
}
149+
#Call a function to check if there are any open files in the temp folder. Recurse through the folder until all files are closed
150+
$OpenFiles = Get-OpenFiles -Path $using:TempPath
151+
if ($OpenFiles.Count -gt 0) {
152+
$OpenFiles = Get-OpenFiles -Path $using:TempPath
130153
}
131-
return $OpenFiles
154+
155+
return @{ Module = $Module; Success = $true; ExitCode = 0; Error = $null }
132156
}
133-
#Call a function to check if there are any open files in the temp folder. Recurse through the folder until all files are closed
134-
$OpenFiles = Get-OpenFiles -Path $TempPath
135-
if ($OpenFiles.Count -gt 0) {
136-
$OpenFiles = Get-OpenFiles -Path $TempPath
157+
catch {
158+
Write-Host -ForegroundColor Red "Exception while generating module '$Module': $_"
159+
return @{ Module = $Module; Success = $false; ExitCode = -1; Error = $_.Exception.Message }
137160
}
138-
139161
} -ThrottleLimit $Throttle
140162
$stopwatch.Stop()
141163

142-
Write-Host -ForegroundColor Green "Generated SDK in '$($Stopwatch.Elapsed.TotalMinutes)' minutes."
164+
# Check if any modules failed to generate
165+
$FailedModules = $Results | Where-Object { -not $_.Success }
166+
if ($FailedModules.Count -gt 0) {
167+
Write-Host ""
168+
Write-Host -ForegroundColor Red "========================================="
169+
Write-Host -ForegroundColor Red "Failed to generate the following modules:"
170+
Write-Host -ForegroundColor Red "========================================="
171+
$FailedModules | ForEach-Object {
172+
Write-Host -ForegroundColor Red " - $($_.Module) (Exit Code: $($_.ExitCode)) - $($_.Error)"
173+
}
174+
Write-Host -ForegroundColor Red "========================================="
175+
Write-Host ""
176+
Write-Error "Module generation failed. $($FailedModules.Count) of $($ModuleToGenerate.Count) module(s) failed to generate."
177+
}
178+
else {
179+
Write-Host -ForegroundColor Green "All modules generated successfully in '$($Stopwatch.Elapsed.TotalMinutes)' minutes."
180+
}

tools/GenerateServiceModule.ps1

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ $ApiVersion | ForEach-Object {
7272
npx autorest --max-memory-size=$MaxMemorySize --module-version:$FullModuleVersion --module-name:$ModuleFullName --service-name:$Module --input-file:$OpenApiFile $AutoRestModuleConfig --max-cpu=2 --network-calls=2
7373
if ($LastExitCode -ne 0) {
7474
Write-Host -ForegroundColor Red "AutoREST failed to generate '$ModuleFullName' module."
75-
exit $LastExitCode
75+
return $LastExitCode
7676
}
7777
Write-Debug "AutoRest generated '$ModuleFullName' successfully."
7878

@@ -87,7 +87,7 @@ $ApiVersion | ForEach-Object {
8787
& $CleanUpPsm1 -ModuleProjectPath $ModuleProjectPath -FullyQualifiedModuleName $ModuleFullName
8888
if ($LastExitCode -ne 0) {
8989
Write-Host -ForegroundColor Red "Failed to build '$ModuleFullName' module."
90-
exit $LastExitCode
90+
return $LastExitCode
9191
}
9292
}
9393

0 commit comments

Comments
 (0)