Skip to content

Support AppHost startup timeout env var - #16686

Merged
Mitch Denny (mitchdenny) merged 8 commits into
mainfrom
sebros/start-timeout
May 25, 2026
Merged

Support AppHost startup timeout env var#16686
Mitch Denny (mitchdenny) merged 8 commits into
mainfrom
sebros/start-timeout

Conversation

@sebastienros

@sebastienros Sébastien Ros (sebastienros) commented May 1, 2026

Copy link
Copy Markdown
Contributor

Description

AppHost builds or startups can take longer than the CLI's default wait, causing aspire start and aspire run to fail without a clear escape hatch for slow machines or CI environments. This adds the ASPIRE_CLI_START_TIMEOUT environment variable for aspire start and aspire run, including detached launches, while keeping aspire wait --timeout as the explicit wait-command option.

The timeout guidance now tells users to set ASPIRE_CLI_START_TIMEOUT to a higher value, and invalid values produce a clear error. This also keeps the process cleanup fixes from the earlier review feedback so a timed-out aspire run does not leave a build or AppHost process running after the CLI exits.

Fixes # (issue)
N/A

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
  • Does the change require an update in our Aspire docs?

Reuse the wait timeout option for start and run so slow AppHost builds or startups can wait longer than the default and show actionable timeout guidance.

Cover start, run, detached startup, invalid timeout validation, and canceled process cleanup with CLI tests.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

github-actions Bot commented May 1, 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 -- 16686

Or

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

Replace the custom advancing time provider with Microsoft.Extensions.Time.Testing.FakeTimeProvider configured with AutoAdvanceAmount.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

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

This PR extends the Aspire CLI startup experience by adding configurable startup timeouts to aspire run and aspire start, aligning them with existing aspire wait --timeout semantics and improving timeout guidance. It also refactors detached launching to be testable and updates process-wait cancellation behavior to reduce the risk of orphaned processes.

Changes:

  • Add --timeout support (and validation) to aspire run and aspire start, and propagate the configured timeout into detached AppHost launch waiting logic.
  • Introduce an IDetachedProcessLauncher abstraction to make detached launching testable and injectable.
  • Improve timeout messaging (including localization resources) and add process cancellation coverage to ensure spawned processes are terminated when waits are canceled.

Reviewed changes

Copilot reviewed 26 out of 26 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
tests/Aspire.Cli.Tests/Utils/CliTestHelper.cs Registers the default detached process launcher in the test DI container.
tests/Aspire.Cli.Tests/TestServices/TestDetachedProcessLauncher.cs Adds a test double for detached process launching plus a test TimeProvider.
tests/Aspire.Cli.Tests/DotNet/ProcessExecutionTests.cs Adds a regression test ensuring cancellation kills the spawned process.
tests/Aspire.Cli.Tests/Commands/StartCommandTests.cs Adds coverage for start --timeout parsing/validation and timeout behavior in detached launch.
tests/Aspire.Cli.Tests/Commands/RunCommandTests.cs Adds coverage for run --timeout parsing/validation and detached timeout behavior.
src/Aspire.Cli/Resources/xlf/RunCommandStrings.zh-Hant.xlf Updates localized resource entry for the new formatted timeout guidance string.
src/Aspire.Cli/Resources/xlf/RunCommandStrings.zh-Hans.xlf Updates localized resource entry for the new formatted timeout guidance string.
src/Aspire.Cli/Resources/xlf/RunCommandStrings.tr.xlf Updates localized resource entry for the new formatted timeout guidance string.
src/Aspire.Cli/Resources/xlf/RunCommandStrings.ru.xlf Updates localized resource entry for the new formatted timeout guidance string.
src/Aspire.Cli/Resources/xlf/RunCommandStrings.pt-BR.xlf Updates localized resource entry for the new formatted timeout guidance string.
src/Aspire.Cli/Resources/xlf/RunCommandStrings.pl.xlf Updates localized resource entry for the new formatted timeout guidance string.
src/Aspire.Cli/Resources/xlf/RunCommandStrings.ko.xlf Updates localized resource entry for the new formatted timeout guidance string.
src/Aspire.Cli/Resources/xlf/RunCommandStrings.ja.xlf Updates localized resource entry for the new formatted timeout guidance string.
src/Aspire.Cli/Resources/xlf/RunCommandStrings.it.xlf Updates localized resource entry for the new formatted timeout guidance string.
src/Aspire.Cli/Resources/xlf/RunCommandStrings.fr.xlf Updates localized resource entry for the new formatted timeout guidance string.
src/Aspire.Cli/Resources/xlf/RunCommandStrings.es.xlf Updates localized resource entry for the new formatted timeout guidance string.
src/Aspire.Cli/Resources/xlf/RunCommandStrings.de.xlf Updates localized resource entry for the new formatted timeout guidance string.
src/Aspire.Cli/Resources/xlf/RunCommandStrings.cs.xlf Updates localized resource entry for the new formatted timeout guidance string.
src/Aspire.Cli/Resources/RunCommandStrings.resx Updates the timeout message to include the configured seconds and guidance to retry with higher --timeout.
src/Aspire.Cli/Program.cs Registers IDetachedProcessLauncher in the CLI host DI container.
src/Aspire.Cli/Processes/IDetachedProcessLauncher.cs Introduces the detached process launcher/process abstractions and a default implementation.
src/Aspire.Cli/DotNet/ProcessExecution.cs Ensures cancellation of WaitForExitAsync kills the process tree.
src/Aspire.Cli/Commands/WaitCommand.cs Centralizes timeout option creation and timeout validation for reuse.
src/Aspire.Cli/Commands/StartCommand.cs Adds --timeout support to start and forwards it to detached launch waiting.
src/Aspire.Cli/Commands/RunCommand.cs Adds --timeout support to run, applies it to build/backchannel waits, and threads it through detached launch.
src/Aspire.Cli/Commands/AppHostLauncher.cs Adds optional --timeout to shared launch options and uses it for detached backchannel wait; uses injectable detached launcher.
Comments suppressed due to low confidence (1)

src/Aspire.Cli/Commands/AppHostLauncher.cs:350

  • On timeout, this kills only the detached child CLI process. Since the child may have already spawned the AppHost (grandchild), killing just the parent process can leave the AppHost running. Consider ensuring the kill operation terminates the entire process tree (consistent with other CLI process shutdown paths) so a timed-out start/detached run doesn’t orphan an AppHost/build process.
            if (!result.ChildProcess.HasExited)
            {
                try
                {
                    result.ChildProcess.Kill();

Comment thread src/Aspire.Cli/Commands/RunCommand.cs Outdated
Comment thread src/Aspire.Cli/Commands/RunCommand.cs Outdated
Comment thread src/Aspire.Cli/Processes/IDetachedProcessLauncher.cs Outdated
Comment thread src/Aspire.Cli/DotNet/ProcessExecution.cs Outdated
Use a single timeout budget for run startup, observe pending AppHost runs during timeout cleanup, and make detached process termination explicit about process-tree cleanup.

Keep cancellation propagation reliable when process-tree termination fails.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@davidfowl

Copy link
Copy Markdown
Collaborator

This should be an env variable not an argument.

Replace the run/start timeout options with ASPIRE_CLI_START_TIMEOUT_SECONDS while keeping aspire wait --timeout unchanged.

Update timeout guidance and validation to point users at the environment variable.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@sebastienros Sébastien Ros (sebastienros) changed the title Add startup timeout options to Aspire CLI Support AppHost startup timeout env var May 4, 2026
Use ASPIRE_CLI_START_TIMEOUT to match existing Aspire timeout environment variable naming.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@sebastienros

Copy link
Copy Markdown
Contributor Author

Changed to using an ENV as it makes more sense

Comment thread src/Aspire.Cli/Commands/RunCommand.cs Outdated
@IEvangelist

Copy link
Copy Markdown
Member

Code-review only — no fresh CI artifacts on the current head, so I read the diff.

Walked the env-var path end to end:

  • Name (ASPIRE_CLI_START_TIMEOUT) — matches the ASPIRE_CLI_* convention used by other CLI knobs.
  • Parsingint.TryParse with NumberStyles.None (rejects negatives at parse time) + CultureInfo.InvariantCulture. Clean.
  • Bounds — explicit parsedTimeout > 0 rejects zero and negative; clear error message on bad input.
  • DefaultWaitCommand.DefaultTimeoutSeconds (120s) matches the previous hardcoded TimeSpan.FromSeconds(120). No silent default regression.
  • Overflowint.MaxValue seconds → TimeSpan.FromSeconds is fine (~68 years).
  • CTS lifecycleusing var runCancellationTokenSource, properly disposed on every path.
  • Process cleanupKill(entireProcessTree: true) on timeout; the secondary 5s cancellation timeout avoids hangs on cancellation, with the fire-and-forget observation catching exceptions.
  • Cross-platform — standard env-var semantics (case-sensitive on Linux, case-insensitive on Windows), nothing surprising.
  • Telemetry/logging — timeout integer isn't sensitive, no privacy issue.

Tests cover boundary cases (empty, malformed, zero, negative) cleanly. No bugs to flag.

LGTM.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@mitchdenny

Copy link
Copy Markdown
Member

🧪 PR Test Results

Tested locally on macOS arm64 against the PR-built CLI 13.4.0-pr.16686.gec0437e8 (matches head ec0437e8).

Scenarios

# Scenario Result Evidence
1 Baseline aspire start + ps + stop (no env var, default 120s) Started, listed, stopped cleanly. No leftover processes.
2 Invalid ASPIRE_CLI_START_TIMEOUT values (0, -1, abc, 1.5) on run and start Each rejected with InvalidAppHostStartupTimeoutEnvironmentVariable, exit 1. aspire wait --help unaffected (uses its own --timeout).
3 Forced timeout in attached aspire run with ASPIRE_CLI_START_TIMEOUT=1 Exit 2 (FailedToDotnetRunAppHost), error reads "Timed out waiting 1s for AppHost to start. If the AppHost is still building or starting, set ASPIRE_CLI_START_TIMEOUT to a higher value and try again." No leftover apphost.dll / dotnet run processes — confirms the process-tree-kill fix in ProcessExecution.
4 Forced timeout in detached aspire start with ASPIRE_CLI_START_TIMEOUT=1 Same message + exit 2. aspire ps confirms no leftover detached AppHost.
5 Generous ASPIRE_CLI_START_TIMEOUT=300 Normal startup in ~5s, no regression at larger values.

Observations

  • Empty/whitespace env var (e.g. ) is treated as unset and falls back to the 120s default — matches the IsNullOrWhiteSpace check, intentional.
  • Detached-mode timeout error composes cleanly with the existing ❌ Failed to start the AppHost. header from AppHostLauncher.

Overall: ✅ PR verified. The configurable startup timeout, validation, error messaging, and process-tree cleanup all behave as expected in both attached and detached modes.

@mitchdenny Mitch Denny (mitchdenny) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Approving — the configurable startup timeout works correctly in both attached and detached modes; validation, error messaging, and process-tree cleanup all behave as expected (see test report comment above for the full scenario matrix).

Leaving three small findings inline (none blocking):

  1. A wall-clock bound in a FakeTimeProvider-driven test that risks CI flakiness.
  2. Default-timeout coupling to WaitCommand.DefaultTimeoutSeconds (semantically distinct timeout).
  3. Linked-CTS lifetime mismatch with the fire-and-forget pendingRun observer in the >5s cleanup edge case.

stopwatch.Stop();

Assert.Equal(CliExitCodes.FailedToDotnetRunAppHost, exitCode);
Assert.True(stopwatch.Elapsed < TimeSpan.FromSeconds(1), $"Expected startup timeout to use the remaining budget, but the command took {stopwatch.Elapsed}.");

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Wall-clock assertion stopwatch.Elapsed < TimeSpan.FromSeconds(1) re-introduces a real-time dependency in a test that otherwise uses FakeTimeProvider. Under CI contention (cold JIT, GC pause, host scheduling) the harness can take >1s just to spin up the host and tear down. The exit-code and error-message assertions already prove the budget was shared across both waits; consider dropping the wall-clock bound or significantly loosening it (e.g. 30s) to avoid contention-only flakiness.

{
public static bool TryGetTimeoutSeconds(IConfiguration configuration, IInteractionService interactionService, out int timeoutSeconds)
{
timeoutSeconds = WaitCommand.DefaultTimeoutSeconds;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The default for AppHost startup is coupled to WaitCommand.DefaultTimeoutSeconds, but these are semantically distinct timeouts: WaitCommand.DefaultTimeoutSeconds is the default for aspire wait --timeout (waiting for a resource to reach a state), whereas this one controls how long aspire run / aspire start will wait for the AppHost to build + connect the backchannel. A future change to the wait command's default would silently shift AppHost startup behavior across the CLI. Consider a dedicated AppHostStartupTimeout.DefaultTimeoutSeconds so the two defaults can evolve independently.

Task<int> pendingRun;
var startupTimeout = TimeSpan.FromSeconds(timeoutSeconds);
var startupStartTimestamp = _timeProvider.GetTimestamp();
using var runCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

In the timeout path, if CancelAppHostStartupAsync exceeds its 5s grace it kicks off ObserveAppHostRunFailureAsync(pendingRun) as fire-and-forget and ExecuteAsync returns. The using var here then disposes the linked CTS while pendingRun is still running on a background task holding runCancellationTokenSource.Token. Operations against a disposed CTS's token (e.g. Register) throw ObjectDisposedException, which the observer will swallow at debug level — but the lifetime mismatch is worth either fixing (defer disposal until the observer completes) or annotating with a comment. Low-impact, lower confidence than the other two.

@davidfowl

Copy link
Copy Markdown
Collaborator

We should not timeout if the build is taking a long time. We probably need better error handling here.

Resolved conflicts in AppHostLauncher.cs and RunCommand.cs by integrating
main's WaitForAppHostStartupAsync/RunStartupHappyPathAsync refactor with
this PR's startup timeout enforcement, and tightened the outer OCE catch
so post-startup OCEs with unrelated tokens are not silently treated as
user cancellation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

CLI E2E Tests unknown — 96 passed, 0 failed, 5 unknown (commit 32af322)

View all recordings
Status Test Recording
AddPackageInteractiveWhileAppHostRunningDetached ▶️ View recording
AddPackageWhileAppHostRunningDetached ▶️ View recording
AgentCommands_AllHelpOutputs_AreCorrect ▶️ View recording
AgentInitCommand_DefaultSelection_InstallsDefaultSkills ▶️ View recording
AgentInitCommand_MigratesDeprecatedConfig ▶️ View recording
AgentMcpListStructuredLogsFromStarterAppCore ▶️ View recording
AllPublishMethodsBuildDockerImages ▶️ View recording
AspireAddPackageVersionToDirectoryPackagesProps ▶️ View recording
AspireInitSingleFileAppHostRunsViaDotnetRunAppHost ▶️ View recording
AspireInitWithExistingAppHostDirRecreatesMissingNuGetConfigAndPreservesFiles ▶️ View recording
AspireInitWithSolutionFileGeneratesAppHostThatBuildsAgainstChannelHive ▶️ View recording
AspireStartUpdatesStaleTypeScriptAppHostPath ▶️ View recording
AspireUpdateRemovesAppHostPackageVersionFromDirectoryPackagesProps ▶️ View recording
AspireUpdateRemovesOrphanAppHostPackageVersionWhenSdkAlreadyCurrent ▶️ View recording
Banner_DisplayedOnFirstRun ▶️ View recording
Banner_DisplayedWithExplicitFlag ▶️ View recording
Banner_NotDisplayedWithNoLogoFlag ▶️ View recording
CertificatesClean_RemovesCertificates ▶️ View recording
CertificatesTrust_WithNoCert_CreatesAndTrustsCertificate ▶️ View recording
CertificatesTrust_WithUntrustedCert_TrustsCertificate ▶️ View recording
ConfigSetGet_CreatesNestedJsonFormat ▶️ View recording
CreateAndRunAspireStarterProject ▶️ View recording
CreateAndRunAspireStarterProjectWithBundle ▶️ View recording
CreateAndRunEmptyAppHostProject ▶️ View recording
CreateAndRunJavaEmptyAppHostProject ▶️ View recording
CreateAndRunJsReactProject ▶️ View recording
CreateAndRunPythonReactProject ▶️ View recording
CreateAndRunTypeScriptEmptyAppHostProject ▶️ View recording
CreateAndRunTypeScriptStarterProject ▶️ View recording
CreateJavaAppHostWithViteApp ▶️ View recording
CreateTypeScriptAppHostWithViteApp_UsesConfiguredToolchain ▶️ View recording
DashboardRunWithAgentMcpCore ▶️ View recording
DashboardRunWithOtelTracesReturnsNoTracesCore ▶️ View recording
DeployK8sBasicApiService ▶️ View recording
DeployK8sWithExternalHelmChart ▶️ View recording
DeployK8sWithGarnet ▶️ View recording
DeployK8sWithMongoDB ▶️ View recording
DeployK8sWithMySql ▶️ View recording
DeployK8sWithPostgres ▶️ View recording
DeployK8sWithRabbitMQ ▶️ View recording
DeployK8sWithRedis ▶️ View recording
DeployK8sWithSqlServer ▶️ View recording
DeployK8sWithValkey ▶️ View recording
DeployTypeScriptAppToKubernetes ▶️ View recording
DescribeCommandResolvesReplicaNames ▶️ View recording
DescribeCommandShowsRunningResources ▶️ View recording
DetachFormatJsonProducesValidJson ▶️ View recording
DetachFormatJsonProducesValidJsonWhenRestartingExistingInstance ▶️ View recording
DoListStepsShowsPipelineSteps ▶️ View recording
DocsCommand_RendersInteractiveMarkdownFromLocalSource ▶️ View recording
DoctorCommand_DetectsDeprecatedAgentConfig ▶️ View recording
DoctorCommand_TypeScriptAppHostReportsMissingConfiguredToolchain ▶️ View recording
DoctorCommand_WithSslCertDir_ShowsTrusted ▶️ View recording
DoctorCommand_WithoutSslCertDir_ShowsPartiallyTrusted ▶️ View recording
GeneratedAspireDevScript_StartsWatchMode_WithConfiguredToolchain ▶️ View recording
GlobalMigration_HandlesCommentsAndTrailingCommas ▶️ View recording
GlobalMigration_HandlesMalformedLegacyJson ▶️ View recording
GlobalMigration_PreservesAllValueTypes ▶️ View recording
GlobalMigration_SkipsWhenNewConfigExists ▶️ View recording
GlobalSettings_MigratedFromLegacyFormat ▶️ View recording
InitTypeScriptAppHost_AugmentsExistingViteRepoAtRoot ▶️ View recording
InteractiveCSharpInitCreatesExpectedFiles ▶️ View recording
InvalidAppHostPathWithComments_IsHealedOnRun ▶️ View recording
JavaScriptHostingApisRunFromTypeScriptAppHost ▶️ View recording
LatestCliCanStartStableChannelAppHost ▶️ View recording
LatestCliCanStartStableChannelTypeScriptAppHost ▶️ View recording
LegacySettingsMigration_AdjustsRelativeAppHostPath ▶️ View recording
LogLevelTrace_ProducesTraceEntriesInCliLogFile ▶️ View recording
LogsCommandShowsResourceLogs ▶️ View recording
OtelLogsReturnsStructuredLogsFromStarterApp ▶️ View recording
OtelLogsReturnsStructuredLogsFromStarterAppIsolated ▶️ View recording
PsCommandListsRunningAppHost ▶️ View recording
PsFormatJsonOutputsOnlyJsonToStdout ▶️ View recording
PublishJavaScriptPatternsGeneratesExpectedDockerComposeArtifacts ▶️ View recording
PublishWithConfigureEnvFileUpdatesEnvOutput ▶️ View recording
PublishWithDockerComposeServiceCallbackSucceeds ▶️ View recording
PublishWithoutOutputPathUsesAppHostDirectoryDefault ▶️ View recording
ResourceCommand_FailedExecution_DisplaysAppHostLogPathAndLogContainsEntries ▶️ View recording
ResourceCommand_FailsWhenInteractionServiceIsRequired ▶️ View recording
ResourceCommand_SetAndDeleteParameterUpdatesDescribeOutput ▶️ View recording
RestoreGeneratesSdkFiles ▶️ View recording
RestoreGeneratesSdkFiles_WithConfiguredToolchain ▶️ View recording
RestoreRefreshesGeneratedSdkAfterAddingIntegration ▶️ View recording
RestoreSupportsConfigOnlyHelperPackageAndCrossPackageTypes ▶️ View recording
RunFromParentDirectory_UsesExistingConfigNearAppHost ▶️ View recording
RunPublishFailureScenarioAsync ▶️ View recording
RunReportsSyntaxErrorsForDotNetAppHost ▶️ View recording
RunReportsSyntaxErrorsForTypeScriptAppHost ▶️ View recording
SecretCrudOnDotNetAppHost ▶️ View recording
SecretCrudOnTypeScriptAppHost ▶️ View recording
StagingChannel_ConfigureAndVerifySettings_ThenSwitchChannels ▶️ View recording
StartAndWaitForTypeScriptSqlServerAppHostWithNativeAssets ▶️ View recording
StartReportsSyntaxErrorsForDotNetAppHost ▶️ View recording
StartReportsSyntaxErrorsForTypeScriptAppHost ▶️ View recording
StopAllAppHostsFromAppHostDirectory ▶️ View recording
StopJavaPolyglotAppHostUsingApphostDirectory ▶️ View recording
StopNonInteractiveSingleAppHost ▶️ View recording
StopTypeScriptPolyglotAppHostUsingApphostDirectory ▶️ View recording
StopWithNoRunningAppHostExitsSuccessfully ▶️ View recording
UnAwaitedChainsCompileWithAutoResolvePromises ▶️ View recording
UpdateProjectChannelToStable_TypeScript_PicksUpStablePackages ▶️ View recording

📹 Recordings uploaded automatically from CI run #26391854835

@mitchdenny
Mitch Denny (mitchdenny) merged commit 853656a into main May 25, 2026
311 checks passed
@aspire-repo-bot

Copy link
Copy Markdown
Contributor

✅ No documentation update needed.

docs_required → PR creation failed due to infrastructure issue. Triggered signals: cli_command_file_changed (RunCommand.cs, StartCommand.cs, WaitCommand.cs), cli_resource_strings_changed (RunCommandStrings.resx), pr_body_has_cli_flag_mention ("aspire wait --timeout").

Documentation changes were prepared for aspire-run.mdx and aspire-start.mdx on release/13.4 to document the new --timeout <seconds> option and ASPIRE_CLI_START_TIMEOUT environment variable, but the draft PR could not be created due to a workspace configuration issue (the safeoutputs create_pull_request tool reports "No commits found" in every configuration attempted). Manual PR creation on microsoft/aspire.dev targeting release/13.4 is needed.

@berezovskyi

Copy link
Copy Markdown

A few comments/questions:

  • https://aspire.dev/ search returns nothing when searching for ASPIRE_CLI_START_TIMEOUT, although the last comment points to a bot failing to create the PR that would address this.
  • There is apparently no way to configure this via VS Code extensions settings or aspire.config.json, making it hard to control when using non-CLI flows (other than setting global env vars).
  • The build time is apparently included in the timeout budget, making it impossible to start Aspire hosts involving builds longer than 120s?

@davidfowl

Copy link
Copy Markdown
Collaborator

We need to fix that build time is included. That’s a bug

@sebastienros

Copy link
Copy Markdown
Contributor Author

We need to fix that build time is included. That’s a bug

That's by design, that the timeout include the build time, even called out in the PR title.

making it impossible to start Aspire hosts involving builds longer than 120s

I am confused, because since the build time is included in this value, then you can definitly increase the allowance, that's the goal of this feature

@github-actions github-actions Bot locked and limited conversation to collaborators Jul 6, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants