Skip to content

Bound aspire doctor checks with timeouts - #18969

Merged
James Newton-King (JamesNK) merged 3 commits into
mainfrom
doctor-check-timeouts
Aug 3, 2026
Merged

Bound aspire doctor checks with timeouts#18969
James Newton-King (JamesNK) merged 3 commits into
mainfrom
doctor-check-timeouts

Conversation

@JamesNK

Copy link
Copy Markdown
Member

Description

aspire doctor could remain at Checking Aspire environment... until an external job timeout when an environment check or installation discovery operation blocked indefinitely.

This change bounds individual environment checks and installation discovery to 30 seconds, with a two-minute aggregate limit for environment checks. Individual timeouts are reported as warnings and later checks continue; reaching the aggregate limit reports a warning and stops scheduling remaining checks. Timeout details are also included in JSON output metadata.

Cancellation now terminates owned dotnet --list-sdks and Unix certutil process trees so timed-out checks do not leave child processes running.

User-facing usage

When an individual check exceeds its deadline, aspire doctor continues and reports:

⚠ Environment check 'dot-net-sdk' timed out after 30 seconds.

When the aggregate deadline is reached, it reports:

⚠ Environment checks timed out after 120 seconds.

Validation:

  • dotnet test --project .\tests\Aspire.Cli.Tests\Aspire.Cli.Tests.csproj --no-launch-profile --no-restore -- --filter-class "*.DoctorCommandTests" --filter-class "*.EnvironmentCheckerTests" --filter-class "*.InstallationInfoOutputTests" --filter-class "*.DotNetSdkInstallerTests" --filter-class "*.DevCertsCheckTests" --filter-class "*.NativeCertificateToolRunnerTests" --filter-class "*.UnixCertificateManagerTests" --filter-class "*.CertificateServiceTests" --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true" (91 passed, 4 platform-specific tests skipped on Windows)
  • dotnet build .\src\Aspire.Cli\Aspire.Cli.csproj --no-restore

Fixes #18961

Checklist

  • Is this feature complete?
    • Yes. Ready to ship.
    • No. Follow-up changes expected.
  • Are you including unit tests for the changes and scenario tests if relevant?
    • Yes
    • No
  • Did you add public API?
    • Yes
      • If yes, did you have an API Review for it?
        • Yes
        • No
      • Did you add <remarks /> and <code /> elements on your triple slash comments?
        • Yes
        • No
    • No
  • Does the change make any security assumptions or guarantees?
    • Yes
      • If yes, have you done a threat model and had a security review?
        • Yes
        • No
    • No

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 18969

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 18969"

@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Bounds aspire doctor environment checks and installation discovery, preventing indefinite hangs and orphaned child processes.

Changes:

  • Adds per-check, aggregate, and discovery timeouts with warning metadata.
  • Terminates canceled dotnet and Unix certutil process trees.
  • Adds timeout orchestration tests and localized messages.

Reviewed changes

Copilot reviewed 28 out of 29 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
tests/Aspire.Cli.Tests/Utils/EnvironmentCheckerTests.cs Tests check and aggregate timeouts.
tests/Aspire.Cli.Tests/TestServices/TestWindowsRegistryReader.cs Adds registry test fake.
tests/Aspire.Cli.Tests/TestServices/TestEnvironmentCheck.cs Adds configurable check fake.
tests/Aspire.Cli.Tests/TestServices/TestCertificateToolRunner.cs Supports cancellation.
tests/Aspire.Cli.Tests/TestServices/FakeInstallationDiscovery.cs Adds discovery callback seam.
tests/Aspire.Cli.Tests/Commands/InstallationInfoOutputTests.cs Tests non-cooperative discovery timeout.
src/Aspire.Cli/Utils/EnvironmentChecker/EnvironmentChecker.cs Implements bounded check orchestration.
src/Aspire.Cli/Utils/EnvironmentChecker/DevCertsCheck.cs Propagates cancellation to certificate checks.
src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.zh-Hant.xlf Adds timeout resources.
src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.zh-Hans.xlf Adds timeout resources.
src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.tr.xlf Adds timeout resources.
src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.ru.xlf Adds timeout resources.
src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.pt-BR.xlf Adds timeout resources.
src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.pl.xlf Adds timeout resources.
src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.ko.xlf Adds timeout resources.
src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.ja.xlf Adds timeout resources.
src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.it.xlf Adds timeout resources.
src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.fr.xlf Adds timeout resources.
src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.es.xlf Adds timeout resources.
src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.de.xlf Adds timeout resources.
src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.cs.xlf Adds timeout resources.
src/Aspire.Cli/Resources/DoctorCommandStrings.resx Defines timeout messages.
src/Aspire.Cli/Resources/DoctorCommandStrings.Designer.cs Exposes generated resource properties.
src/Aspire.Cli/DotNet/DotNetSdkInstaller.cs Kills canceled SDK probe trees.
src/Aspire.Cli/Commands/InstallationInfoOutput.cs Bounds installation discovery.
src/Aspire.Cli/Certificates/NativeCertificateToolRunner.cs Passes cancellation through trust checks.
src/Aspire.Cli/Certificates/ICertificateToolRunner.cs Adds cancellation to the contract.
src/Aspire.Cli/Certificates/CertificateService.cs Propagates caller cancellation.
src/Aspire.Cli/Certificates/CertificateGeneration/UnixCertificateManager.cs Kills canceled certutil trees.
Files not reviewed (1)
  • src/Aspire.Cli/Resources/DoctorCommandStrings.Designer.cs: Generated file

Comment thread src/Aspire.Cli/DotNet/DotNetSdkInstaller.cs
Copilot AI review requested due to automatic review settings August 3, 2026 04:05
@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 31 out of 32 changed files in this pull request and generated no new comments.

Files not reviewed (1)
  • src/Aspire.Cli/Resources/DoctorCommandStrings.Designer.cs: Generated file
Suppressed comments (6)

src/Aspire.Cli/DotNet/DotNetSdkInstaller.cs:65

  • If process-tree termination throws Win32Exception or NotSupportedException, this catch does not preserve the original cancellation; the outer catch at line 114 converts the cleanup failure into an SDK-not-found result. Cleanup is best-effort and must not mask cancellation, so handle the documented kill failures here and then rethrow the original OperationCanceledException.
                catch (InvalidOperationException)
                {
                    // The process exited between cancellation and the kill attempt.
                }

src/Aspire.Cli/Utils/EnvironmentChecker/EnvironmentChecker.cs:64

  • The check is invoked even if the linked timeout token was already canceled (for example, caller cancellation before entry or the aggregate deadline expiring between checks). WaitAsync notices only after Task.Run has scheduled the callback, so external work can start after cancellation and the aggregate path does not reliably stop scheduling remaining checks. Check the linked token inside this try before invoking the check so the existing catch filters handle it.
                var checkTask = Task.Run(() => check.CheckAsync(checkTimeoutCts.Token), CancellationToken.None);

src/Aspire.Cli/Commands/InstallationInfoOutput.cs:43

  • A pre-canceled caller token still schedules DiscoverAllCoreAsync, which runs the synchronous winget probe before discovery observes cancellation. This can mutate the install sidecar after the command was canceled. Check the linked token before scheduling the task, inside the existing try, so caller cancellation propagates without starting discovery.
        var discoveryTask = Task.Run(
            () => DiscoverAllCoreAsync(discovery, wingetFirstRunProbe, logger, timeoutCts.Token),
            CancellationToken.None);

src/Aspire.Cli/Certificates/NativeCertificateToolRunner.cs:19

  • Cancellation is checked only while enumerating certificates. When the store is empty, the selector never runs and a pre-canceled call returns normally, so the newly added cancellation contract is not honored. Check the token before accessing/enumerating the certificate store.
    public CertificateTrustResult CheckHttpCertificate(CancellationToken cancellationToken = default)
    {
        var availableCertificates = certificateManager.ListCertificates(
            StoreName.My, StoreLocation.CurrentUser, isValid: true);

src/Aspire.Cli/DotNet/DotNetSdkInstaller.cs:60

  • The timeout path becomes unbounded again while waiting for the process to exit after Kill. A termination request does not guarantee prompt exit, so a stuck process can keep CheckAsync at this await indefinitely despite cancellation. Use a separately bounded post-kill wait and always rethrow the original cancellation when that bound expires.

This issue also appears on line 62 of the same file.

                    process.Kill(entireProcessTree: true);
                    await process.WaitForExitAsync(CancellationToken.None);

src/Aspire.Cli/Certificates/CertificateGeneration/UnixCertificateManager.cs:747

  • When the cancellation callback cannot kill certutil (a case explicitly swallowed above), this blocking wait still has no bound and the caller never reaches ThrowIfCancellationRequested. Cancellation can therefore hang indefinitely and leave the process tree running. Make the exit wait cancellation-aware or separately bounded so kill failure cannot block return.
        process.WaitForExit();
        cancellationToken.ThrowIfCancellationRequested();

Copilot AI review requested due to automatic review settings August 3, 2026 04:12
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Tests selector (audit mode)

The full test matrix and all jobs still run in audit mode. The tests and jobs below are what selective CI would run under enforcement.

2 / 100 test projects · 5 jobs, from 32 changed files.

Selected test projects (2 / 100)

Aspire.Cli.EndToEnd.Tests, Aspire.Cli.Tests

Selected jobs (5)

cli-starter, deployment-e2e, extension-e2e, polyglot, typescript-api-compat


How these were chosen — grouped by what changed

📦 affected project Aspire.Cli
1 test: Aspire.Cli.EndToEnd.Tests

🧪 tests/Aspire.Cli.Tests/Certificates/UnixCertificateManagerTests.cs (changed test)
1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/Commands/InstallationInfoOutputTests.cs (changed test)
1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/DotNetSdkInstallerTests.cs (changed test)
1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/TestServices/FakeInstallationDiscovery.cs (changed test)
1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/TestServices/ProcessTestHelpers.cs (changed test)
1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/TestServices/TestCertificateToolRunner.cs (changed test)
1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/TestServices/TestEnvironmentCheck.cs (changed test)
1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/TestServices/TestWindowsRegistryReader.cs (changed test)
1 directly: Aspire.Cli.Tests

🧪 tests/Aspire.Cli.Tests/Utils/EnvironmentCheckerTests.cs (changed test)
1 directly: Aspire.Cli.Tests

Job reasons

Job Triggered by
cli-starter • affected project Aspire.Cli
• selected test Aspire.Cli.Tests
deployment-e2e affected project Aspire.Cli
extension-e2e src/Aspire.Cli/Certificates/CertificateGeneration/UnixCertificateManager.cs, src/Aspire.Cli/Certificates/CertificateService.cs, src/Aspire.Cli/Certificates/ICertificateToolRunner.cs, src/Aspire.Cli/Certificates/NativeCertificateToolRunner.cs, src/Aspire.Cli/Commands/InstallationInfoOutput.cs, src/Aspire.Cli/DotNet/DotNetSdkInstaller.cs, src/Aspire.Cli/Resources/DoctorCommandStrings.Designer.cs, src/Aspire.Cli/Resources/DoctorCommandStrings.resx, src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.cs.xlf, src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.de.xlf, src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.es.xlf, src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.fr.xlf, src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.it.xlf, src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.ja.xlf, src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.ko.xlf, src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.pl.xlf, src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.pt-BR.xlf, src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.ru.xlf, src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.tr.xlf, src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.zh-Hans.xlf, src/Aspire.Cli/Resources/xlf/DoctorCommandStrings.zh-Hant.xlf, src/Aspire.Cli/Utils/EnvironmentChecker/DevCertsCheck.cs, src/Aspire.Cli/Utils/EnvironmentChecker/EnvironmentChecker.cs, tests/Aspire.Cli.Tests/Certificates/UnixCertificateManagerTests.cs, tests/Aspire.Cli.Tests/Commands/InstallationInfoOutputTests.cs, tests/Aspire.Cli.Tests/DotNetSdkInstallerTests.cs, tests/Aspire.Cli.Tests/TestServices/FakeInstallationDiscovery.cs, tests/Aspire.Cli.Tests/TestServices/ProcessTestHelpers.cs, tests/Aspire.Cli.Tests/TestServices/TestCertificateToolRunner.cs, tests/Aspire.Cli.Tests/TestServices/TestEnvironmentCheck.cs, tests/Aspire.Cli.Tests/TestServices/TestWindowsRegistryReader.cs, tests/Aspire.Cli.Tests/Utils/EnvironmentCheckerTests.cs
• affected project Aspire.Cli
polyglot affected project Aspire.Cli
typescript-api-compat affected project Aspire.Cli

Selection computed for commit 7f4c03c.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 31 out of 32 changed files in this pull request and generated no new comments.

Files not reviewed (1)
  • src/Aspire.Cli/Resources/DoctorCommandStrings.Designer.cs: Generated file
Suppressed comments (2)

src/Aspire.Cli/Utils/EnvironmentChecker/EnvironmentChecker.cs:64

  • Scheduling with CancellationToken.None allows a queued check to begin after either deadline has already fired and CheckAllAsync has reported the timeout. Under thread-pool starvation, that late check can continue running or spawn processes after aspire doctor returns. Pass the linked check token to Task.Run so work that has not started by the deadline is canceled rather than invoked.
                var checkTask = Task.Run(() => check.CheckAsync(checkTimeoutCts.Token), CancellationToken.None);

src/Aspire.Cli/Commands/InstallationInfoOutput.cs:38

  • Using CancellationToken.None means installation discovery can still start after the 30-second timeout has returned a failed row. This is especially problematic during thread-pool starvation: the late task can enumerate installations and launch peer probes after aspire doctor has completed. Schedule it with the linked timeout token so queued work is suppressed once the deadline expires.
        var discoveryTask = Task.Run(
            () => DiscoverAllCoreAsync(discovery, wingetFirstRunProbe, logger, timeoutCts.Token),
            CancellationToken.None);

@JamesNK

Copy link
Copy Markdown
Member Author

PR Testing Report

PR Information

Artifact Version Verification

  • Expected Commit: 7f4c03c
  • Artifact: aspire-cli-win-x64-13.5.0-pr.18969.g7f4c03c1.zip from CI run 30783736536
  • Installed Version: 13.5.0-pr.18969.g7f4c03c1
  • Status: Verified

The official dogfood installer was attempted first with -InstallPath, -SkipExtension, and -SkipPath. Its duplicate gh run download remained stalled with an empty staging directory. The same official run artifact downloaded successfully with gh run download, so the exact archive was extracted into the isolated test directory and its embedded version was verified before product scenarios ran.

Changes Analyzed

Change Categories

  • CLI changes: doctor check/discovery timeouts and subprocess cancellation
  • Test changes: timeout and process-tree regression coverage
  • Hosting integration changes
  • Dashboard changes
  • Template changes
  • Client/component changes
  • VS Code extension changes
  • CI infrastructure changes

Test Scenarios Executed

Scenario 1: Full Aspire CLI unit suite

Objective: Validate the current PR source across the complete CLI test project.
Coverage Type: Automated regression
Status: Passed

Command:

dotnet test --project .\tests\Aspire.Cli.Tests\Aspire.Cli.Tests.csproj --no-launch-profile --no-restore -- --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true"

Result: 4,693 total; 4,643 passed; 50 platform-specific skipped; 0 failed. Duration 1m 39s.

Scenario 2: Normal doctor text and JSON output

Objective: Verify normal doctor execution remains successful and structured output is valid.
Coverage Type: Happy path
Status: Passed

Results:

  • Text mode: exit 0 in 15.8s; summary rendered.
  • JSON mode: exit 0 in 5.0s.
  • JSON parsed successfully and contained checks, summary, and installations.
  • JSON summary: 6 passed, 1 warning, 0 failed; 4 installations.

Evidence:

  • doctor-text.stdout.txt
  • doctor-text.stderr.txt
  • doctor-json.stdout.json
  • doctor-json.stderr.txt

Scenario 3: Blocked dotnet probe timeout and process cleanup

Objective: Verify a blocking dotnet probe is bounded and its complete process tree is terminated.
Coverage Type: Unhappy path
Status: Passed

Steps:

  1. Published an isolated temporary executable named dotnet.exe.
  2. The shim recorded its PID, started a blocking child process, recorded the child PID, and waited indefinitely.
  3. Prepended only the doctor process environment's PATH with the shim directory.
  4. Ran aspire doctor --format json using the verified PR artifact.
  5. Parsed timeout metadata and checked every recorded PID after doctor returned.

Results:

  • Exit code: 0, as timeout warnings are non-fatal.
  • dot-net-sdk reported warning metadata with timeoutSeconds: 30.
  • Four processes were recorded across two probe invocations: two parents and two children.
  • All four processes had exited after doctor returned.
  • Total command duration was 2m33.6s. The changed per-check timeout and process cleanup worked; this duration includes work outside the individual dot-net-sdk timeout.

Expected Unhappy-Path Outcome: A warning result, continued doctor completion, and no orphaned parent or child process.

Evidence:

  • doctor-blocked-dotnet.stdout.json
  • doctor-blocked-dotnet.stderr.txt
  • blocked-dotnet-pids/*.pid

Scenario 4: Linux certutil cancellation

Objective: Verify a blocked NSS probe kills its certutil process tree.
Coverage Type: Unhappy path
Status: Not executed

The user selected local Windows execution. This Linux-only product scenario cannot run on that target. The corresponding test compiles on Windows and is exercised by Linux CI.

Scenario 5: Fresh project smoke

Objective: Create, start, describe, and stop an aspire-empty project from the PR template hive.
Coverage Type: CLI smoke
Status: Blocked

The official installer stalled before creating the PR hive, and the verified native CLI archive contains only aspire.exe, Aspire.TypeSystem.xml, hex1bpty.exe, and libsodium.dll. No alternate template channel was substituted because that would not test the PR hive required by the testing workflow.

Summary

Scenario Status Notes
Full Aspire CLI unit suite Passed 4,643 passed, 50 skipped, 0 failed
Normal doctor text/JSON Passed Exit 0; valid structured output
Blocked dotnet timeout/cleanup Passed 30s warning; all four PIDs exited
Linux certutil cancellation Not executed Windows target selected
Fresh project smoke Blocked Dogfood installer stalled before hive creation

Overall Result

PARTIALLY VERIFIED

The changed Windows doctor behavior passed both happy-path and targeted blocked-process testing, and the full CLI test project passed. Full cross-platform verification remains pending for the Linux-only certutil scenario, and the template smoke scenario could not run because the official installer did not complete hive creation.

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@adamint Adam Ratzman (adamint) added this to the 13.5 milestone Aug 3, 2026
@JamesNK
James Newton-King (JamesNK) merged commit 6615cef into main Aug 3, 2026
676 of 680 checks passed
@JamesNK
James Newton-King (JamesNK) deleted the doctor-check-timeouts branch August 3, 2026 23:34
@aspire-repo-bot

Copy link
Copy Markdown
Contributor

⚠️ Documentation was required for this change, but a docs PR could not be drafted automatically.

Docs were required for the aspire doctor timeout behavior (triggered signals: cli_resource_strings_changed, pr_body_has_user_facing_section, pr_body_has_cli_flag_mention). The documentation change was authored — a Timeouts section was added to src/frontend/src/content/docs/reference/cli/commands/aspire-doctor.mdx covering the 30-second per-check and 2-minute aggregate timeouts — but the create_pull_request safe-output tool failed twice with "Pinned SHA failed to generate patch: Git command failed with status 1", likely because the workspace is a shallow clone and the tool cannot produce a diff against the remote base. The docs PR could not be opened automatically; manual creation against release/13.5 on microsoft/aspire.dev is needed.

See the workflow run for details: https://github.com/microsoft/aspire/actions/runs/30862723856

@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

⚠️ CI Failure Analysis: Possible Flaky Test(s)

The CI build failed due to test failure(s) that appear unrelated to the PR changes. These may be flaky tests.

Suspected flaky test(s):

  • Aspire.Cli.Tests.Projects.ProcessGuestLauncherTests.LaunchAsync_WithGracefulServices_SignalerThrows_StillEscalatesToTreeKill in job Tests / Cli / Cli (windows-latest)
    • Error: Expected escalation to tree-kill within 15s of Expire() but it took 00:00:24.6176764.
    • Stack Trace (first frames):
      at Aspire.Cli.Tests.Projects.ProcessGuestLauncherTests.LaunchAsync_WithGracefulServices_SignalerThrows_StillEscalatesToTreeKill() in D:\a\aspire\aspire\tests\Aspire.Cli.Tests\Projects\ProcessGuestLauncherTests.cs:line 308
      
    • Why likely flaky: Timing-based failure: expected action within 15s but took 24.6s under CI load. ProcessGuestLauncherTests.cs is not in the PR's changed files. This matches a known prior cause (processguest-signalerThrows-treekill-timeout).

Suggested actions:

  • Re-run the failed CI jobs to confirm if the failure is intermittent
  • If the test continues to fail, consider quarantining it using /quarantine-test <test name> <issue URL>
  • Search existing issues to see if this test is already known to be flaky

You can re-run the failed jobs from the workflow run page.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

aspire doctor running for 30+ mins

4 participants