docs(ci): report runner-only backend test failure investigation
Bisected the failure across four CI runs (job logs are not readable via the Gitea API) down to the AiWorkspace test classes — 10 tests that pass on Windows, in a clean Linux container, under a 1GB memory cap, in CI's exact step order, with a custom-dir SDK and no DOTNET_ROOT, serially, and under a hostile locale/timezone. Ruled out: Linux behaviour, case sensitivity, path separators, locale/culture, time zone, environment variables, parallel execution, test ordering, shared state, memory. Not testable remotely: host permissions/limits. Assessment is environmental: the workflow already documents three failure modes on this same runner with an identical signature (processes dying with no error output — SDK cache corruption, npm ci SIGSEGV, CRA build OOM/SIGSEGV). Report includes evidence table and recommended infrastructure fix. Removes the temporary bisection scaffolding; keeps the restore/build/test split and the host smoke. No test was weakened, skipped, or filtered. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -62,47 +62,14 @@ jobs:
|
||||
- name: Test backend (host smoke)
|
||||
run: dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-build --filter "FullyQualifiedName~CvBuilderTests.Every_catalog_theme_renders_valid_html"
|
||||
|
||||
# The host smoke above passes, so the test host starts fine; the full suite still dies ~3s in
|
||||
# even with parallelism disabled, i.e. one specific test takes the process down on this runner
|
||||
# only. Job logs are not readable via the API, so the suite is bisected across steps: the first
|
||||
# failing step localises the offending class. Slices are alphabetical because execution order is
|
||||
# alphabetical once collection parallelism is off. Temporary diagnostic — every test still runs.
|
||||
# Slice 1 (A-C) is the failing slice; split per class to name the offender in one run.
|
||||
- name: T AiWorkspace
|
||||
run: dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-build -- xUnit.parallelizeTestCollections=false xUnit.maxParallelThreads=1 --filter "FullyQualifiedName~AiWorkspace"
|
||||
|
||||
- name: T Attachment
|
||||
run: dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-build -- xUnit.parallelizeTestCollections=false xUnit.maxParallelThreads=1 --filter "FullyQualifiedName~Attachment"
|
||||
|
||||
- name: T AuthAndSystem
|
||||
run: dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-build -- xUnit.parallelizeTestCollections=false xUnit.maxParallelThreads=1 --filter "FullyQualifiedName~AuthAndSystem"
|
||||
|
||||
- name: T BackupController
|
||||
run: dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-build -- xUnit.parallelizeTestCollections=false xUnit.maxParallelThreads=1 --filter "FullyQualifiedName~BackupController"
|
||||
|
||||
- name: T CareerProfile
|
||||
run: dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-build -- xUnit.parallelizeTestCollections=false xUnit.maxParallelThreads=1 --filter "FullyQualifiedName~CareerProfile"
|
||||
|
||||
- name: T ClientErrors
|
||||
run: dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-build -- xUnit.parallelizeTestCollections=false xUnit.maxParallelThreads=1 --filter "FullyQualifiedName~ClientErrors"
|
||||
|
||||
- name: T Correspondence
|
||||
run: dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-build -- xUnit.parallelizeTestCollections=false xUnit.maxParallelThreads=1 --filter "FullyQualifiedName~Correspondence"
|
||||
|
||||
- name: T CvBuilder
|
||||
run: dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-build -- xUnit.parallelizeTestCollections=false xUnit.maxParallelThreads=1 --filter "FullyQualifiedName~CvBuilder"
|
||||
|
||||
- name: T CvCorpus
|
||||
run: dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-build -- xUnit.parallelizeTestCollections=false xUnit.maxParallelThreads=1 --filter "FullyQualifiedName~CvCorpus"
|
||||
|
||||
- name: Test backend (slice 2 D-J)
|
||||
run: dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-build -- xUnit.parallelizeTestCollections=false xUnit.maxParallelThreads=1 --filter "FullyQualifiedName~DatabaseBackup|FullyQualifiedName~EmailStatus|FullyQualifiedName~GmailController|FullyQualifiedName~GoogleToken|FullyQualifiedName~Imap|FullyQualifiedName~InterviewPrep|FullyQualifiedName~JobApplications"
|
||||
|
||||
- name: Test backend (slice 3 J-P)
|
||||
run: dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-build -- xUnit.parallelizeTestCollections=false xUnit.maxParallelThreads=1 --filter "FullyQualifiedName~JobCvMatch|FullyQualifiedName~JobImport|FullyQualifiedName~JobPipeline|FullyQualifiedName~LocalAuth|FullyQualifiedName~MicrosoftGraph|FullyQualifiedName~MicrosoftToken|FullyQualifiedName~Ownership|FullyQualifiedName~ProductionConfig|FullyQualifiedName~ProfileCv"
|
||||
|
||||
- name: Test backend (slice 4 R-T)
|
||||
run: dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-build -- xUnit.parallelizeTestCollections=false xUnit.maxParallelThreads=1 --filter "FullyQualifiedName~RulesEngine|FullyQualifiedName~Sessions|FullyQualifiedName~SqliteMigration|FullyQualifiedName~StageAnalytics|FullyQualifiedName~Summarizer|FullyQualifiedName~TwoFactor"
|
||||
# Runner-only failure, localised to the AiWorkspace tests by bisecting across steps (the job
|
||||
# log is not readable via the Gitea API). Those 10 tests pass on Windows, in a clean Linux
|
||||
# container, under a 1GB memory cap, with a custom-dir SDK and no DOTNET_ROOT, serially, and
|
||||
# under a hostile locale/timezone -- so the trigger is specific to this runner host.
|
||||
# See docs/ci-runner-investigation.md. Collection parallelism stays off for determinism, the
|
||||
# same reason the frontend runs --runInBand. Every test still runs; nothing is filtered.
|
||||
- name: Test backend
|
||||
run: dotnet test JobTrackerApi.Tests/JobTrackerApi.Tests.csproj --configuration Release --no-build -- xUnit.parallelizeTestCollections=false xUnit.maxParallelThreads=1
|
||||
|
||||
- name: Install frontend deps
|
||||
working-directory: job-tracker-ui
|
||||
|
||||
Reference in New Issue
Block a user