Skip to content

[release/13.4] Restore dotnet watch dashboard auto-launch signal#17653

Merged
davidfowl merged 1 commit into
release/13.4from
backport/pr-17610-to-release/13.4
May 29, 2026
Merged

[release/13.4] Restore dotnet watch dashboard auto-launch signal#17653
davidfowl merged 1 commit into
release/13.4from
backport/pr-17610-to-release/13.4

Conversation

@JamesNK
Copy link
Copy Markdown
Member

@JamesNK JamesNK commented May 29, 2026

Backport of #17610 to release/13.4

/cc @JamesNK

Customer Impact

dotnet watch cannot automatically open the dashboard browser when running an Aspire 13.4 AppHost. This is a regression from 13.3 — the legacy login log line that dotnet watch depends on to detect when the AppHost is serving HTTP traffic was removed in the new dashboard summary refactoring.

Fixes #17591

Testing

Unit tests added/updated covering the shared dashboard logging helper, the dashboard browser token auth integration test, and the AppHost dashboard-ready event handler. All tests pass on the release/13.4 branch.

Risk

Very low. Adds a single additional LogInformation call before the existing dashboard summary output. No behavioral change to any other code path.

Regression?

Yes — regressed in 13.4 when the dashboard summary output was refactored and the legacy login line was dropped.

Copilot AI review requested due to automatic review settings May 29, 2026 07:34
@JamesNK JamesNK requested a review from mitchdenny as a code owner May 29, 2026 07:34
@github-actions
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 -- 17653

Or

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

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This backport restores a legacy dashboard “login” log line that dotnet watch relies on to detect when an Aspire AppHost is serving HTTP traffic and auto-launch the dashboard browser, addressing a regression introduced in 13.4’s dashboard summary refactor.

Changes:

  • Reintroduced an explicit LogInformation compatibility line: Login to the dashboard at {LoginUrl} when a login URL is available.
  • Updated unit/integration tests to expect the additional log entry and validate the structured LoginUrl value.
  • Extended AppHost dashboard-ready event handler test coverage to assert the legacy login log is emitted.

Reviewed changes

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

File Description
src/Shared/LoggingHelpers.cs Emits the legacy “Login to the dashboard…” log line (structured) ahead of the existing dashboard summary output.
tests/Aspire.Dashboard.Tests/LoggingHelpersTests.cs Updates expectations to account for the additional login log entry and validates its structured fields/message.
tests/Aspire.Dashboard.Tests/Integration/FrontendBrowserTokenAuthTests.cs Adjusts log-output sequence assertions to include the restored legacy login log and validates token query presence.
tests/Aspire.Hosting.Tests/Dashboard/DashboardEventHandlersTests.cs Adds assertion that the AppHost dashboard-ready path emits the legacy login log with the expected URL.

@JamesNK JamesNK added the Servicing-consider Issue for next servicing release review label May 29, 2026
@JamesNK JamesNK added this to the 13.4 milestone May 29, 2026
@github-actions
Copy link
Copy Markdown
Contributor

CLI E2E Tests unknown — 107 passed, 0 failed, 2 unknown (commit 19efac1)

View all recordings
Status Test Recording Job Artifacts
AddPackageInteractiveWhileAppHostRunningDetached Recording #78460114267 Logs
AddPackageWhileAppHostRunningDetached Recording #78460114267 Logs
AgentCommands_AllHelpOutputs_AreCorrect Recording #78460114004 Logs
AgentInitCommand_DefaultSelection_InstallsDefaultSkills Recording #78460114004 Logs
AgentInitCommand_MigratesDeprecatedConfig Recording #78460114004 Logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp Recording #78460114613 Logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp_DevLocalhost Recording #78460114613 Logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp_Isolated Recording #78460114613 Logs
AllPublishMethodsBuildDockerImages Recording #78460113956 Logs
AspireAddAndStartWorkAgainstLegacyAppHostTs Recording #78460114556 Logs
AspireAddPackageVersionToDirectoryPackagesProps Recording #78460114547 Logs
AspireInitSingleFileAppHostRunsViaDotnetRunAppHost Recording #78460114058 Logs
AspireInitWithExistingAppHostDirRecreatesMissingNuGetConfigAndPreservesFiles Recording #78460114221 Logs
AspireInitWithSolutionFileGeneratesAppHostThatBuildsAgainstChannelHive Recording #78460114221 Logs
AspireStartUpdatesStaleTypeScriptAppHostPath Recording #78460114684 Logs
AspireUpdateRemovesAppHostPackageVersionFromDirectoryPackagesProps Recording #78460114547 Logs
AspireUpdateRemovesOrphanAppHostPackageVersionWhenSdkAlreadyCurrent Recording #78460114547 Logs
Banner_DisplayedOnFirstRun Recording #78460114201 Logs
Banner_DisplayedWithExplicitFlag Recording #78460114201 Logs
Banner_NotDisplayedWithNoLogoFlag Recording #78460114201 Logs
CertificatesClean_RemovesCertificates Recording #78460114633 Logs
CertificatesTrust_WithNoCert_CreatesAndTrustsCertificate Recording #78460114633 Logs
CertificatesTrust_WithUntrustedCert_TrustsCertificate Recording #78460114633 Logs
ConfigSetGet_CreatesNestedJsonFormat Recording #78460114598 Logs
CreateAndRunAspireStarterProject Recording #78460113855 Logs
CreateAndRunAspireStarterProjectWithBundle Recording #78460114382 Logs
CreateAndRunEmptyAppHostProject Recording #78460114281 Logs
CreateAndRunJavaEmptyAppHostProject Recording #78460114359 Logs
CreateAndRunJsReactProject Recording #78460114576 Logs
CreateAndRunPythonReactProject Recording #78460114082 Logs
CreateAndRunTypeScriptEmptyAppHostProject Recording #78460114424 Logs
CreateAndRunTypeScriptStarterProject Recording #78460114369 Logs
CreateJavaAppHostWithViteApp Recording #78460114651 Logs
CreateTypeScriptAppHostWithViteApp_AllowsGuestAppPackageManagerToDiffer Recording #78460114019 Logs
CreateTypeScriptAppHostWithViteApp_UsesConfiguredToolchain Recording #78460114019 Logs
DashboardRunWithAgentMcpListTracesReturnsNoTraces Recording #78460114624 Logs
DashboardRunWithAgentMcpListTracesReturnsNoTraces_DevLocalhost Recording #78460114624 Logs
DashboardRunWithOtelTracesReturnsNoTraces Recording #78460114624 Logs
DashboardRunWithOtelTracesReturnsNoTraces_DevLocalhost Recording #78460114624 Logs
DeployK8sBasicApiService Recording #78460114460 Logs
DeployK8sWithExternalHelmChart Recording #78460114523 Logs
DeployK8sWithGarnet Recording #78460114036 Logs
DeployK8sWithMongoDB Recording #78460114388 Logs
DeployK8sWithMySql Recording #78460114525 Logs
DeployK8sWithPostgres Recording #78460114129 Logs
DeployK8sWithRabbitMQ Recording #78460114695 Logs
DeployK8sWithRedis Recording #78460114229 Logs
DeployK8sWithSqlServer Recording #78460114223 Logs
DeployK8sWithValkey Recording #78460114668 Logs
DeployTypeScriptAppToKubernetes Recording #78460114716 Logs
DescribeCommandResolvesReplicaNames Recording #78460114616 Logs
DescribeCommandShowsRunningResources Recording #78460114616 Logs
DetachFormatJsonProducesValidJson Recording #78460114097 Logs
DetachFormatJsonProducesValidJsonWhenRestartingExistingInstance Recording #78460114097 Logs
DoPublishAndDeployListStepsWork Recording #78460114076 Logs
DocsCommand_RendersInteractiveMarkdownFromLocalSource Recording #78460114011 Logs
DoctorCommand_DetectsDeprecatedAgentConfig Recording #78460114004 Logs
DoctorCommand_TypeScriptAppHostReportsMissingConfiguredToolchain Recording #78460114379 Logs
DoctorCommand_WithSslCertDir_ShowsTrusted Recording #78460114379 Logs
DoctorCommand_WithoutSslCertDir_ShowsPartiallyTrusted Recording #78460114379 Logs
GatewayWithoutExternalEndpoint_FailsPublishWithGuidance Recording #78460114299 Logs
GeneratedAspireDevScript_StartsWatchMode_WithConfiguredToolchain Recording #78460114019 Logs
GlobalMigration_HandlesCommentsAndTrailingCommas Recording #78460114598 Logs
GlobalMigration_HandlesMalformedLegacyJson Recording #78460114598 Logs
GlobalMigration_PreservesAllValueTypes Recording #78460114598 Logs
GlobalMigration_SkipsWhenNewConfigExists Recording #78460114598 Logs
GlobalSettings_MigratedFromLegacyFormat Recording #78460114598 Logs
IngressWithoutExternalEndpoint_FailsPublishWithGuidance Recording #78460114299 Logs
InitTypeScriptAppHost_AugmentsExistingViteRepoInWorkspaceSubdirectory Recording #78460114019 Logs
InteractiveCSharpInitCreatesExpectedFiles Recording #78460114135 Logs
InvalidAppHostPathWithComments_IsHealedOnRun Recording #78460114100 Logs
JavaScriptHostingApisRunFromTypeScriptAppHost Recording #78460113956 Logs
LatestCliCanStartStableChannelAppHost Recording #78460113855 Logs
LatestCliCanStartStableChannelTypeScriptAppHost Recording #78460113855 Logs
LegacySettingsMigration_AdjustsRelativeAppHostPath Recording #78460114684 Logs
LogsCommandShowsResourceLogs Recording #78460114298 Logs
OtelLogsReturnsStructuredLogsFromStarterApp Recording #78460114528 Logs
OtelLogsReturnsStructuredLogsFromStarterAppIsolated Recording #78460114528 Logs
PsCommandListsRunningAppHost Recording #78460114089 Logs
PsFormatJsonOutputsOnlyJsonToStdout Recording #78460114089 Logs
PublishJavaScriptPatternsGeneratesExpectedDockerComposeArtifacts Recording #78460114413 Logs
PublishWithConfigureEnvFileUpdatesEnvOutput Recording #78460114413 Logs
PublishWithDockerComposeServiceCallbackSucceeds Recording #78460114413 Logs
PublishWithoutOutputPathUsesAppHostDirectoryDefault Recording #78460114413 Logs
ResourceCommand_FailedExecution_DisplaysAppHostLogPathAndLogContainsEntries Recording #78460114493 Logs
ResourceCommand_SetAndDeleteParameterUpdatesDescribeOutput Recording #78460114493 Logs
RestoreGeneratesSdkFiles Recording #78460114062 Logs
RestoreGeneratesSdkFiles_WithConfiguredToolchain Recording #78460114542 Logs
RestoreRefreshesGeneratedSdkAfterAddingIntegration Recording #78460114542 Logs
RestoreSupportsConfigOnlyHelperPackageAndCrossPackageTypes Recording #78460113990 Logs
RunFromParentDirectory_UsesExistingConfigNearAppHost Recording #78460114623 Logs
RunReportsSyntaxErrorsForDotNetAppHost Recording #78460114521 Logs
RunReportsSyntaxErrorsForTypeScriptAppHost Recording #78460114521 Logs
SecretCrudOnDotNetAppHost Recording #78460114268 Logs
SecretCrudOnTypeScriptAppHost Recording #78460114006 Logs
StagingChannel_ConfigureAndVerifySettings_ThenSwitchChannels Recording #78460114477 Logs
StartAndWaitForTypeScriptSqlServerAppHostWithNativeAssets Recording #78460114666 Logs
StartReportsSyntaxErrorsForDotNetAppHost Recording #78460114521 Logs
StartReportsSyntaxErrorsForTypeScriptAppHost Recording #78460114521 Logs
StopAllAppHostsFromAppHostDirectory Recording #78460113916 Logs
StopJavaPolyglotAppHostUsingApphostDirectory Recording #78460114010 Logs
StopNonInteractiveSingleAppHost Recording #78460113916 Logs
StopTypeScriptPolyglotAppHostUsingApphostDirectory Recording #78460114193 Logs
StopWithNoRunningAppHostExitsSuccessfully Recording #78460114267 Logs
UnAwaitedChainsCompileWithAutoResolvePromises Recording #78460114542 Logs
UpdateProjectChannelToStable_CSharpEmptyAppHost_PreservesAspireConfigChannel Recording #78460113899 Logs
UpdateProjectChannelToStable_CSharpSingleFileInit_PreservesAspireConfigChannel Recording #78460113899 Logs
UpdateProjectChannelToStable_TypeScriptSingleFileInit_PreservesAspireConfigChannel Recording #78460113899 Logs
UpdateProjectChannelToStable_TypeScript_PreviewsStablePackagesAndPreservesChannel Recording #78460113899 Logs

📹 Recordings uploaded automatically from CI run #26624564084

@davidfowl davidfowl merged commit 56e6967 into release/13.4 May 29, 2026
313 checks passed
@davidfowl davidfowl deleted the backport/pr-17610-to-release/13.4 branch May 29, 2026 14:15
@microsoft-github-policy-service microsoft-github-policy-service Bot modified the milestone: 13.4 May 29, 2026
@aspire-repo-bot
Copy link
Copy Markdown
Contributor

✅ No documentation update needed.

docs_optional → bug_fix_restores_documented_behavior

No triggered signals (signal_count = 0, recommendation = docs_optional).

This PR is a backport (from #17610) that restores a regression: dotnet watch's ability to auto-launch the dashboard browser was broken in 13.4 when the legacy "Login to the dashboard at {LoginUrl}" log line was dropped during the dashboard summary refactor. The fix re-emits that log line so dotnet watch can detect when the AppHost is ready.

All 4 changed files are implementation (src/Shared/LoggingHelpers.cs) and tests (tests/). The behavior being restored was already present and documented in 13.3 — no new user-facing surface, flags, configuration, or APIs were introduced.

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

Labels

Servicing-consider Issue for next servicing release review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants