From 994d52403fa72215ce9484116617ba39e9e87c7f Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 19 Aug 2026 10:50:21 +0200 Subject: [PATCH] ci: stream tests on the Windows gate instead of the log-redirecting gate script The windows-gate job was marked failed while the work was still running: 20 dotnet processes were alive on the runner and a complete 8.7 MB App.Tests TRX was on disk after Forgejo had already recorded a failure. Cause: tools/run-release-gate.ps1 redirects every bounded child process to its own log file, so the workflow step emits no output for minutes. Forgejo treats a task that stops reporting as a zombie and fails it. The Linux job, which runs dotnet test directly, streamed continuously and produced real results. The Windows job now builds and then runs each test project directly with the same trait filter copied from the gate script's default, so output streams the whole time. run-release-gate.ps1 remains the canonical LOCAL gate, where its bounded-process/blame-hang machinery is the point. Co-Authored-By: Claude Fable 5 --- .gitea/workflows/ci.yml | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 5c203078..352332eb 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -28,18 +28,32 @@ jobs: dotnet --version dotnet --list-sdks - - name: Complete Release gate + # NOT tools/run-release-gate.ps1 here. That script redirects every child + # process to its own log file, so the step emits nothing for minutes at a + # time; Forgejo treats a task that stops reporting as a zombie and fails + # it while the work is still running (observed: job marked failed with 20 + # dotnet processes still alive and a complete 8.7 MB TRX on disk). Running + # the projects directly keeps output streaming. The script stays the + # canonical LOCAL gate; the trait filter below is copied from its default. + - name: Build shell: pwsh - run: ./tools/run-release-gate.ps1 + run: dotnet build AcDream.slnx -c Release --nologo - - name: Upload gate evidence - if: always() - uses: actions/upload-artifact@v4 - with: - name: release-gate-windows - path: artifacts/release-gate/ - if-no-files-found: warn - retention-days: 14 + - name: Test (lane-filtered, streaming) + shell: pwsh + run: | + $ErrorActionPreference = 'Stop' + $filter = 'Lane!=InstalledDat&Lane!=PreparedPackage&Lane!=Live&Lane!=Manual&Lane!=Windows&Lane!=Linux&Lane!=SystemFont&Purpose!=Diagnostic&Status!=KnownFailure' + $failed = @() + foreach ($proj in Get-ChildItem tests -Directory | Sort-Object Name) { + $csproj = Join-Path $proj.FullName "$($proj.Name).csproj" + if (-not (Test-Path $csproj)) { continue } + Write-Host "::group::$($proj.Name)" + dotnet test $csproj -c Release --no-build --nologo --filter $filter + if ($LASTEXITCODE -ne 0) { $failed += $proj.Name } + Write-Host "::endgroup::" + } + if ($failed.Count) { throw "Failed test projects: $($failed -join ', ')" } linux-portable: runs-on: ubuntu-latest