Skip to content

Flow main to feature/watch-prototype - #14959

Merged
Tomáš Matoušek (tmat) merged 280 commits into
microsoft:feature/watch-prototypefrom
tmat:main-to-feature-watch
Mar 5, 2026
Merged

Flow main to feature/watch-prototype#14959
Tomáš Matoušek (tmat) merged 280 commits into
microsoft:feature/watch-prototypefrom
tmat:main-to-feature-watch

Conversation

@tmat

Copy link
Copy Markdown
Member

No description provided.

github-actionsBotand others added 30 commits February 3, 2026 14:16
…and_SkipsBuild_WhenExtensionDevKitCapabilityIsAvailable (microsoft#14322)
* [automated] Disable Aspire.Cli.Tests.Commands.RunCommandTests.RunCommand_SkipsBuild_WhenExtensionDevKitCapabilityIsAvailable
* Update tests/Aspire.Cli.Tests/Commands/RunCommandTests.cs
---------
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: David Fowler <davidfowl@gmail.com>
Co-authored-by: sebastienros <sebastienros@users.noreply.github.com>
…rosoft#14278)
* Refactor endpoint resolution logic so that `EndpointReferenceExpression.GetValueAsync()` can be context aware.
To make this work, DCP now always allocates a `DefaultAspireContainerNetwork` endpoint when a container is created alongside the existing `LocalhostNetwork` endpoint.
* PR Review + fix broken test.
* Fix `WithEnvironmentTests.EnvironmentVariableExpressions()`
* - Fix Broken Tests
- Add some DebuggerDisplay attributes to `ValueSnapshot`, and `NetworkEndpointSnapshotList` to make debugging easier
- Explcitly use `*.dev.internal` alias for container networks
- Don't allocate endpoints on custom networks
* Fix test changed by previous commit removing support for custom networks.
* One more failing test
* Remove redundant comment.
* Update dependencies from https://github.com/microsoft/dcp build 0.22.3
On relative base path root
Microsoft.DeveloperControlPlane.darwin-amd64 , Microsoft.DeveloperControlPlane.darwin-arm64 , Microsoft.DeveloperControlPlane.linux-amd64 , Microsoft.DeveloperControlPlane.linux-arm64 , Microsoft.DeveloperControlPlane.linux-musl-amd64 , Microsoft.DeveloperControlPlane.windows-amd64 , Microsoft.DeveloperControlPlane.windows-arm64 From Version 0.22.2 -> To Version 0.22.3
* Quarantine the tunnel test
---------
Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
Co-authored-by: Karol Zadora-Przylecki <karolz@microsoft.com>
* Update MCP error to suggest 'aspire run --detach'
* Add test assertions for --detach in MCP error message
* Show help when aspire is invoked without arguments
* Return InvalidCommand exit code for consistency with other parent commands
* Add tests for parent command exit codes to prevent regression
Co-authored-by: Shilpi Rachna <shilpir@microsoft.com>
…n to public method (microsoft#14319)
* Initial plan
* Change GetHostAddressExpression implementations to public methods
Co-authored-by: eerhardt <8291187+eerhardt@users.noreply.github.com>
* Add Experimental attribute to GetHostAddressExpression methods
Co-authored-by: eerhardt <8291187+eerhardt@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: eerhardt <8291187+eerhardt@users.noreply.github.com>
…microsoft#14326)
* Add E2E deployment test for React + ASP.NET Core to Azure App Service
This adds a new deployment test that:
- Creates a project using the Starter App (ASP.NET Core/React) template
- Deploys to Azure App Service (instead of Container Apps)
- Verifies the deployed endpoints are accessible
The test follows the established patterns from AcaStarterDeploymentTests
and PythonFastApiDeploymentTests.
* Fix prompt sequence for React template
The React template (aspire-ts-cs-starter) has different prompts than the
Blazor starter template:
- Does NOT have a 'test project' prompt
- Output path prompt includes the default path
Updated to match the working JsReactTemplateTests pattern.
* Increase deployment timeouts to 30 min and fix cleanup workflow
- Increase pipeline wait timeout from 10-20 min to 30 min across all deployment tests
- Increase overall test timeout to 40 min to accommodate longer deployments
- Fix cleanup workflow to target both e2e-* (current) and rg-aspire-* (legacy) prefixes
* Add endpoint verification retry logic to deployment tests
Each endpoint is now retried up to 18 times (10 second intervals) for a total
of ~3 minutes before failing. This handles cases where deployed apps need
time to become responsive after deployment completes.
* Fix deployment test command to link to actual workflow run
Move the 'starting' comment from deployment-test-command.yml to
deployment-tests.yml where it has direct access to github.run_id.
The notify-start job only runs when pr_number is provided, matching
the existing post_pr_comment job pattern.
* Add Azure quota requirements to deployment test README
Document the required Azure subscription quotas for running deployment
E2E tests, including Container Apps managed environments (150+) and
App Service PremiumV3 vCPUs (10+). Also updated timeout documentation
and cleanup commands.
* Add Python FastAPI to Azure App Service deployment test
New test case AppServicePythonDeploymentTests that deploys the
FastAPI/React template to Azure App Service instead of Container Apps.
This mirrors PythonFastApiDeploymentTests but targets App Service.
* Enhance PR comment to show passed/failed tests separately
- Query individual matrix job results to determine per-test outcomes
- Display passed, failed, and cancelled tests in separate sections
- Show summary counts (X passed, Y failed, Z cancelled)
- Include recordings only for tests that have them
* Add Azure resource deployment E2E tests (Phase 1)
Add 7 new E2E deployment tests for Azure resources using aspire init:
Simple/Low-cost resources:
- AzureStorageDeploymentTests - Azure Storage Account
- AzureKeyVaultDeploymentTests - Azure Key Vault
- AzureAppConfigDeploymentTests - Azure App Configuration
- AzureLogAnalyticsDeploymentTests - Azure Log Analytics Workspace
- AzureContainerRegistryDeploymentTests - Azure Container Registry
Messaging resources:
- AzureServiceBusDeploymentTests - Azure Service Bus
- AzureEventHubsDeploymentTests - Azure Event Hubs
Each test:
1. Uses 'aspire init' to create a single-file AppHost
2. Adds the Azure hosting package via 'aspire add'
3. Injects resource code into apphost.cs
4. Deploys to Azure using 'aspire deploy'
5. Verifies the resource was created
6. Cleans up the resource group
* Fix duplicate heading in deployment tests README
* Fix Azure location for deployment tests - use westus3
The subscription has quota limits in eastus (only 1 Container App environment).
We have expanded quota in westus3, so change the workflow to deploy there.
* Fix Azure resource tests to handle NuGet.config prompt
The aspire init command now prompts for 'Create NuGet.config for selected channels?'
before creating the AppHost. Updated all 7 Azure resource tests to:
1. Handle the new NuGet.config prompt (press Enter for Yes)
2. Remove language selection handling (only appears with polyglot enabled)
* Fix aspire init pattern matching for CI environment
In CI, aspire init:
1. Auto-creates NuGet.config without prompting (no interactive prompt)
2. Shows 'Aspire initialization complete' instead of 'Created apphost.cs'
Updated all 7 Azure resource tests to:
- Wait for 'Aspire initialization complete' pattern
- Remove the NuGet.config prompt handling (not needed in CI)
* Handle NuGet.config prompt that may or may not appear in CI
The NuGet.config prompt behavior is inconsistent in CI - sometimes it appears
interactively, sometimes it auto-accepts. Updated tests to:
1. Wait 5 seconds after running aspire init
2. Press Enter (dismisses prompt if present, no-op if auto-accepted)
3. Then wait for 'Aspire initialization complete'
This handles both interactive and non-interactive cases.
* Add Azure Container App Environment for role assignment support
Azure resources that require role assignments (Storage, KeyVault, AppConfig,
ServiceBus, EventHubs) need a managed identity principal. The Container App
Environment provides this. Updated 5 failing tests to include:
builder.AddAzureContainerAppEnvironment("env")
This provides the principal required for provisioning role assignments.
* Add Aspire.Hosting.Azure.ContainerApps package for CAE support
AddAzureContainerAppEnvironment() requires the ContainerApps hosting package.
Updated 5 tests to add this package before adding the specific Azure resource
package. Flow is now:
1. aspire init
2. aspire add Aspire.Hosting.Azure.ContainerApps
3. aspire add Aspire.Hosting.Azure.{Resource}
4. modify apphost.cs to use AddAzureContainerAppEnvironment + AddAzure{Resource}
* Fix aspire add integration selection prompt handling
Add pattern searcher for 'Select an integration to add:' prompt
and wait for it before pressing Enter to select the first match.
This handles the fuzzy matching that shows multiple options.
* Fix aspire add prompt handling - use combined pattern searcher
aspire add may show either:
- Integration selection prompt if multiple matches
- Version selection prompt if unique match
The combined searcher waits for either prompt type.
* Fix aspire add to handle TWO prompts for ContainerApps
aspire add Aspire.Hosting.Azure.ContainerApps triggers:
1. Integration selection prompt (matches multiple Azure packages)
2. Version selection prompt (in CI)
Need to wait for and handle both prompts sequentially.
* Address code review feedback
- Use discard pattern (_) instead of unused variable for AddAzureContainerAppEnvironment
- Update README.md Test Structure section to include new Azure resource test files
* Skip App Service deployment tests due to infrastructure timeouts
App Service provisioning takes longer than 30 minutes, causing test
timeouts. Skipped until infrastructure issues are resolved.
---------
Co-authored-by: Mitch Denny <mitch@mitchdeny.com>
- Add step in run-tests.yml to copy .cast files and upload as
'cli-e2e-recordings-{TestName}' artifacts
- Simplify cli-e2e-recording-comment.yml to filter by artifact name prefix
- Removes need for hardcoded test class name list
Co-authored-by: Mitch Denny <mitch@mitchdeny.com>
* Add Kubernetes/Helm E2E test for CLI publishing
- Add KubernetesPublishTests.cs to correct project (Aspire.Cli.EndToEnd.Tests)
- Delete orphaned tests/Aspire.Cli.EndToEndTests folder (misnamed, no csproj)
* Address PR feedback: improve test reliability and cleanup
- Add .WithDimensions(160, 48) to terminal builder for consistency
- Make KinD/Helm versions configurable via environment variables
- Use unique cluster names (GUID-based) for parallel test execution
- Add kubectl wait --for=condition=Ready for proper pod verification
- Wrap test in try/finally with best-effort cleanup via Process API
- Improve comment explaining port override rationale
* Pass CancellationToken to WaitForExitAsync in cleanup
---------
Co-authored-by: Mitch Denny <mitch@mitchdeny.com>
* Add initial Aspire.Hosting.Azure.Network integration
This is the first round of supporting Azure virtual networks in Aspire. Currently it supports:
Creating a virtual network
Creating subnets
Creating private endpoints to Storage blobs and queues
Future PRs will enable:
More private endpoint support. This is just the core / first resource.
Being able to add NAT Gateways and public IPs.
This pull request introduces a new Azure Virtual Network end-to-end sample to the repository, demonstrating how to configure a virtual network, subnets, private endpoints, and secure storage access for containerized applications. It also adds support for Azure Network and Private DNS provisioning packages, and makes minor improvements to existing storage modules.
* Get some stuff working
* Don't add VNet resources in run mode.
Add a delegation annotation so things like ACA can delegate subnets.
* Initial support for private endpoints.
* Add Azure.Provisioning.PrivateDns and update to latest
* Remove unncessary workaround
* Finish implementing private endpoints.
Gets AzureStorageEndToEnd working with a vnet and private endpoints.
* Make new Aspire.Hosting.Azure APIs experimental
* Add unit tests.
Remove NatGateway (for now). This will come in a separate PR.
Clean up some code.
* More clean up
* Move to a new playground app specific to VNets
* Fix AddSubnet API
* Rename AddAzurePrivateEndpoint and hang it off of AzureSubnetResource.
* Don't add PrivateEndpointTargetAnnotation in run mode. Also walk the hierarchy until you reach the root resource.
* Add WithSubnet API for ACA environments and improve delegation naming
- Add IAzureDelegatedSubnetResource interface and DelegatedSubnetAnnotation to Aspire.Hosting.Azure
- Implement IAzureDelegatedSubnetResource on AzureContainerAppEnvironmentResource
- Add WithSubnet<T> extension method in Network package for configuring subnet delegation
- Update ACA Bicep generation to read DelegatedSubnetAnnotation and configure VnetConfiguration
- Use serviceName for delegation name in Bicep output (e.g., 'Microsoft.App/environments')
- Mark new public APIs with [Experimental("ASPIREAZURE003")]
- Add unit test verifying ACA and VNet Bicep output with subnet delegation
* Separate and reuse Private DNS Zones across private endpoints
- Add AzurePrivateDnsZoneResource for shared DNS Zone management
- Add AzurePrivateDnsZoneVNetLinkResource for VNet-to-zone linking
- DNS Zones are cached at builder level and reused per zone name
- VNet Links tracked on DNS Zone to avoid duplicates
- PE Bicep now references existing DNS Zone instead of creating inline
- Add tests for DNS Zone reuse scenarios
- Add InternalsVisibleTo for test access to internal types
* Address PR feedback
…: Build ID 2896470 (microsoft#14349)
* Localized file check-in by OneLocBuild Task: Build definition ID 1309: Build ID 2895925
* Localized file check-in by OneLocBuild Task: Build definition ID 1309: Build ID 2895925
* Localized file check-in by OneLocBuild Task: Build definition ID 1309: Build ID 2895925
* Localized file check-in by OneLocBuild Task: Build definition ID 1309: Build ID 2895925
* Localized file check-in by OneLocBuild Task: Build definition ID 1309: Build ID 2895925
* Localized file check-in by OneLocBuild Task: Build definition ID 1309: Build ID 2895925
* Localized file check-in by OneLocBuild Task: Build definition ID 1309: Build ID 2895925
* Localized file check-in by OneLocBuild Task: Build definition ID 1309: Build ID 2896434
* Localized file check-in by OneLocBuild Task: Build definition ID 1309: Build ID 2896434
* Localized file check-in by OneLocBuild Task: Build definition ID 1309: Build ID 2896434
* Allow subnet addressprefix to be a parameter.
Follow-up feedback from microsoft#13108
* Add parameter to virtual network
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: radical <1472+radical@users.noreply.github.com>
Co-authored-by: James Newton-King <james@newtonking.com>
* Add AKS starter deployment E2E test (Phase 1)
This adds a new end-to-end deployment test that validates Azure Kubernetes Service (AKS) infrastructure creation:
- Creates resource group, ACR, and AKS cluster
- Configures kubectl credentials
- Verifies cluster connectivity
- Cleans up resources after test
Phase 1 focuses on infrastructure only - Aspire deployment will be added in subsequent phases.
* Fix AKS test: register required resource providers
Add step to register Microsoft.ContainerService and Microsoft.ContainerRegistry
resource providers before attempting to create AKS resources. This fixes the
MissingSubscriptionRegistration error when the subscription hasn't been
configured for AKS usage.
* Fix AKS test: use Standard_B2s_v2 VM size
The subscription in westus3 doesn't have access to Standard_B2s, only
the v2 series VMs. Changed to Standard_B2s_v2 which is available.
* Fix AKS test: use Standard_D2s_v3 VM size
The subscription has zero quota for B-series VMs in westus3. Changed to
Standard_D2s_v3 which is a widely-available D-series VM with typical quota.
* Add Phase 2 & 3: Aspire project creation, Helm chart generation, and AKS deployment
Phase 2 additions:
- Create Aspire starter project using 'aspire new'
- Add Aspire.Hosting.Kubernetes package via 'aspire add'
- Modify AppHost.cs to call AddKubernetesEnvironment() with ACR config
- Login to ACR for Docker image push
- Run 'aspire publish' to generate Helm charts and push images
Phase 3 additions:
- Deploy Helm chart to AKS using 'helm install'
- Verify pods are running with kubectl
- Verify deployments are healthy
This completes the full end-to-end flow: AKS cluster creation -> Aspire project
creation -> Helm chart generation -> Deployment to Kubernetes
* Fix Kubernetes deployment: Add container build/push step
Changes:
- Remove invalid ContainerRegistry property from AddKubernetesEnvironment
- Add pragma warning disable for experimental ASPIREPIPELINES001
- Add container build step using dotnet publish /t:PublishContainer
- Push container images to ACR before Helm deployment
- Override Helm image values with ACR image references
The Kubernetes publisher generates Helm charts but doesn't build containers.
We need to build and push containers separately using dotnet publish.
* Fix duplicate Service ports in Kubernetes publisher
When multiple endpoints resolve to the same port number, the Service
manifest generator was creating duplicate port entries, which Kubernetes
rejects as invalid. This fix deduplicates ports by (port, protocol)
before adding them to the Service spec.
Fixes the error:
Service 'xxx-service' is invalid: spec.ports[1]: Duplicate value
* Add explicit AKS-ACR attachment verification step
Added Step 6 to explicitly run 'az aks update --attach-acr' after AKS
cluster creation to ensure the AcrPull role assignment has properly
propagated. This addresses potential image pull permission issues where
AKS cannot pull images from the attached ACR.
Also renumbered all subsequent steps to maintain proper ordering.
* Fix AKS image pull: correct Helm value paths and add ACR check
* Fix duplicate Service/container ports: compare underlying values not Helm expressions
* Re-enable AppService deployment tests
* Add endpoint verification via kubectl port-forward to AKS test
* Wait for pods to be ready before port-forward verification
* Use retry loop for health endpoint verification and log HTTP status codes
* Use real app endpoints: /weatherforecast and / instead of /health
* Improve comments explaining duplicate port dedup rationale
* Refactor cleanup to async pattern matching other deployment tests
* Fix duplicate K8s ports: skip DefaultHttpsEndpoint in ProcessEndpoints
The Kubernetes publisher was generating duplicate Service/container ports
(both 8080/TCP) for ProjectResources with default http+https endpoints.
The root cause is that GenerateDefaultProjectEndpointMapping assigns the
same default port 8080 to every endpoint with None target port.
The proper fix mirrors the core framework's SetBothPortsEnvVariables()
behavior: skip the DefaultHttpsEndpoint (which the container won't listen
on — TLS termination happens at ingress/service mesh). The https endpoint
still gets an EndpointMapping (for service discovery) but reuses the http
endpoint's HelmValue, so no duplicate K8s port is generated.
Added Aspire.Hosting.Kubernetes to InternalsVisibleTo to access
ProjectResource.DefaultHttpsEndpoint. The downstream dedup in ToService()
and WithContainerPorts() remains as defense-in-depth.
Fixesmicrosoft#14029
* Add AKS + Redis E2E deployment test
Validates the Aspire starter template with Redis cache enabled deploys
correctly to AKS. Exercises the full pipeline: webfrontend → apiservice
→ Redis by hitting the /weather page (SSR, uses Redis output caching).
Key differences from the base AKS test:
- Selects 'Yes' for Redis Cache in aspire new prompts
- Redis uses public container image (no ACR push needed)
- Verifies /weather page content (confirms Redis integration works)
* Fix ACR name collision between parallel AKS tests
Both AKS tests generated the same ACR name from RunId+RunAttempt.
Use different prefixes (acrs/acrr) to ensure uniqueness.
* Fix Redis Helm deployment: provide missing cross-resource secret value
Work around K8s publisher bug where cross-resource secret references create
Helm value paths under the consuming resource instead of referencing the
owning resource's secret. The webfrontend template expects
secrets.webfrontend.cache_password but values.yaml only has
secrets.cache.REDIS_PASSWORD. Provide the missing value via --set.
---------
Co-authored-by: Mitch Denny <mitch@mitchdeny.com>
- when a Verify test fails, it auto-accepts the changes, so you can see the diff
- It fails the test (throwException: true)
- It doesn't do this on "build servers"
- https://github.com/VerifyTests/DiffEngine/blob/fef0776f63f0cfa1ac070f16d0925dee89faf9de/src/DiffEngine/BuildServerDetector.cs is the checks for what is considered a "build server"
…es (microsoft#14335)
- Add Channel-based async FileLoggerProvider writing to ~/.aspire/logs/
- Add --debug-level (-v) option for console log verbosity
- Show 'See logs at {path}' instead of raw stack traces on console
- Centralize child process option forwarding via RootCommand.GetChildProcessArgs()
- Suppress Microsoft.Hosting.Lifetime logs from file logger
- Log backchannel socket errors at Debug level when AppHost has exited
- Add log cleanup to 'aspire cache clear'
- Make CliExecutionContext.LogFilePath a required constructor parameter
Fixesmicrosoft#13787
…oft#14372)
* Initial plan
* Fix CLI stop command description to mention resource stopping
Updated description from "Stop a running Aspire apphost." to
"Stop a running apphost or the specified resource." in the resx
file and all XLF localization files.
Co-authored-by: JamesNK <303201+JamesNK@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: JamesNK <303201+JamesNK@users.noreply.github.com>
…ummary (microsoft#14367)
* Initial plan
* Add deployed compute resources and endpoints to pipeline deployment summary
For both Azure Container Apps and Azure App Service deployments, the pipeline
summary now includes each compute resource name and its public endpoint URL
(or "No public endpoints" if none are configured). This makes it immediately
visible to users whether their services are publicly accessible after deployment.
Co-authored-by: davidfowl <95136+davidfowl@users.noreply.github.com>
* Remove emoji from summary keys and add Docker Compose endpoint summary
Remove the emoji prefix (🖥️) from pipeline summary keys in
AzureContainerAppResource and AzureAppServiceWebSiteResource.
Add ctx.Summary.Add() calls to DockerComposeServiceResource.PrintEndpointsAsync()
so Docker Compose deployments also show compute resources and their endpoints
(or "No public endpoints") in the deployment summary.
Co-authored-by: davidfowl <95136+davidfowl@users.noreply.github.com>
* Address PR review feedback: move endpoint check inside step lambda and simplify App Service
Move the anyPublicEndpoints check inside the step Action lambda in
AzureContainerAppResource so endpoints are evaluated at execution time,
not step creation time (addresses @eerhardt's feedback).
For AzureAppServiceWebSiteResource, remove the conditional entirely since
App Service always has a public endpoint at its .azurewebsites.net URL.
This restores the original always-show-URL behavior, avoids unnecessary
async resolution when there are no public endpoints, and addresses both
@eerhardt's and Copilot code review's feedback.
Co-authored-by: davidfowl <95136+davidfowl@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: davidfowl <95136+davidfowl@users.noreply.github.com>
…oft#14360)
* Implement IAzurePrivateEndpointTarget on more Azure resources
Follow up to microsoft#13108
Contributes to microsoft#13750
* Fix tests
* Fix Redis private dns zone name.
* Fix package signature verification and publishing commands to use dotnet.cmd
* Add .NET 10 SDK installation and update package verification commands
* Improve error handling in NuGet package verification and publishing steps
microsoft#14381)
On relative base path root
Microsoft.DeveloperControlPlane.darwin-amd64 , Microsoft.DeveloperControlPlane.darwin-arm64 , Microsoft.DeveloperControlPlane.linux-amd64 , Microsoft.DeveloperControlPlane.linux-arm64 , Microsoft.DeveloperControlPlane.linux-musl-amd64 , Microsoft.DeveloperControlPlane.windows-amd64 , Microsoft.DeveloperControlPlane.windows-arm64 From Version 0.22.3 -> To Version 0.22.4
Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
Adam Ratzman (adamint)and others added 22 commits March 2, 2026 16:31
…14556)
Add PromptForFilePathAsync to IInteractionService that uses native OS file
pickers when the VS Code extension supports the file-pickers.v1 capability.
Falls back to PromptForStringAsync for older extensions or console mode.
Call sites updated: AgentInitCommand, NewCommand, ProjectUpdater.
Fixesmicrosoft#12758
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Pass open AppHost to CLI commands via --project flag
When the user has an AppHost file open in the editor or configured in
.aspire/settings.json, the extension now passes --project <path> to CLI
commands that support it (deploy, publish, add, update).
Fixesmicrosoft#11024
* Address review feedback: proper arg escaping, raw tokens, tighter AppHost heuristic
* Fix --project to --apphost and update tests for sync getAspireCliExecutablePath
- Change CLI flag from --project to --apphost to match current CLI interface
- Rename getProjectArgs to getAppHostArgs for consistency
- Tests already updated to stub vscode.workspace.getConfiguration instead of resolveCliPath
…0-405e-ad5c-9e112be93d9a
[main] Update dependencies from microsoft/dcp
…e view (microsoft#14848)
* Add Aspire Activity Bar panel with running apphosts tree view
- Add Aspire sidebar panel in VS Code with running AppHosts tree view
- Extend 'aspire ps --format json --resources' to include per-AppHost resource data
- Show resources (with state, type, endpoints) as collapsible tree items
- Backward-compatible: falls back gracefully if CLI doesn't support --resources
- Visibility-based polling (only fetches when panel is visible)
- Add SVG icon, localized strings, and unit tests
* Add error welcome view, updateSelf command, initial visibility polling, and spawn error handling
- Show welcome view with upgrade prompt when CLI is missing or too old
- Add 'Update Aspire CLI' command (aspire update --self)
- Start polling immediately if tree view is already visible on creation
- Handle spawn errors (ENOENT) to prevent polling from getting stuck
- Change dashboard icon to link-external for clickable items
- Remove unused InfoMessageItem in favor of viewsWelcome-based error display
* Add Stop and View Logs context menu actions for AppHosts and Resources
- Stop AppHost: right-click context menu runs 'aspire stop --project <path>'
- Stop Resource: right-click context menu runs 'aspire stop <name> --project <path>'
- View Logs: right-click context menu runs 'aspire logs <name> --project <path> --follow'
- All commands hidden from command palette (tree-only actions)
- Localized all new command titles
* Add resource management commands and fix RPC race condition
- Add Start, Restart, Stop resource and Stop apphost context menu actions
- Add View logs context menu for streaming resource logs
- Add Execute command... context menu with quick pick for resource commands
- Fix RPC race condition: register interaction service endpoints before
connection.listen() to prevent unhandled 'displayEmptyLine' errors
- Fix RPC client factory to use lazy debugSessionId reference
- Use --apphost flag (primary) instead of --project (legacy alias)
- Normalize casing: 'apphost' (lowercase h) in user-facing strings
* Remove unused string constants from strings.ts
* Add Aspire brand purple and semantic colors to tree view icons
- Register custom 'aspire.brandPurple' color (#512BD4 light, #7455DD dark)
- Color apphost and resources group icons with Aspire purple
- Color resource state icons: green for success, yellow for warning,
red for error, purple for other active states
* Simplify tree provider, fix resource state icons and conditional commands
- Merge duplicate detail item classes into single DetailItem
- Extract _runResourceCommand helper for stop/start/restart/logs
- Store appHostPid directly on ResourceItem instead of parsing ID string
- Remove no-op resourceEndpointLabel wrapper
- Fix resource state icons to use exact PascalCase state values from KnownResourceStates
- Respect stateStyle overrides for health check warnings/errors on Running resources
- Show Start/Stop/Restart context menus only when resource has those commands available
- Reduce polling interval from 5s to 3s
* Display status in more places in CLI
* Update
* Update
* Update
* Update
* Add status to templates
* Fix emoji
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Include --disableProductStyleUrl in Azurite command line when running Azure Storage as an emulator. This is necessary because when a Container resource references the Storage emulator it gets a URL like storage.dev.internal:10000. Using a URL like this conflicts between the Storage SDK and the emulator because the Storage SDK sees port 10000 and uses path-style URLs. But the emulator rejects them because it expects "product-style" URLs.
Fixmicrosoft#14044
… file (microsoft#14748)
* feat: add CI trigger patterns file
Extract the CI-skip glob patterns into eng/testing/github-ci-trigger-patterns.txt
so that pattern maintenance is decoupled from the workflow definition.
Changing this file alone will not trigger CI, avoiding the chicken-and-egg
problem of the patterns being inlined in ci.yml.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* refactor: read glob patterns from file in check-changed-files action
Replace the inline regex patterns input with a patterns_file input that
points to a file of glob patterns. Add a glob_to_regex() function that
converts glob syntax (**, *, literal dot) to anchored ERE regexes.
The action now:
- reads patterns from a file, skipping comments and blank lines
- converts each glob to an anchored regex before matching
- escapes regex metacharacters (. + ? [ ] ( ) |) in glob literals
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* chore: use patterns_file in CI workflow
Replace the inline regex patterns block in ci.yml with a single
patterns_file reference to eng/testing/github-ci-trigger-patterns.txt.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: add CI trigger patterns documentation
Explain the patterns file, its glob syntax, how to add new patterns,
and how the check-changed-files action converts globs to ERE regexes.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Ankit Jain <radical@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Initial plan
* Unquarantine stable tests
Co-authored-by: radical <1472+radical@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: radical <1472+radical@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…lelization (microsoft#14858)
* Add ExtractTestPartitions tool and CI test matrix scripts
Add tooling for automated CI test splitting and matrix generation:
- ExtractTestPartitions: .NET tool that scans test assemblies for
[Trait("Partition", "N")] attributes to discover test partitions
- split-test-projects-for-ci.ps1: discovers partitions from assemblies
and generates per-project partition JSON files
- build-test-matrix.ps1: builds a canonical test matrix JSON from
per-project metadata files
- expand-test-matrix-github.ps1: expands the canonical matrix into
GitHub Actions format with per-OS job entries
- split-test-matrix-by-deps.ps1: splits the expanded matrix by
dependency type (no-nugets, requires-nugets, requires-cli-archive)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Replace TestRunsheetBuilder with TestEnumerationRunsheetBuilder
Replace the old per-OS runsheet generation with a new metadata-driven
approach:
- Add TestEnumerationRunsheetBuilder.targets: generates per-project
.tests-metadata.json files during build, containing project metadata
(supported OSes, timeouts, dependencies, split configuration)
- Update AfterSolutionBuild.targets: add _GenerateCanonicalMatrixJson
target that invokes build-test-matrix.ps1 to produce a canonical
test matrix from the metadata files
- Update Testing.props: add default timeout values and _ShortName
computation for CI display names
- Update tests/Directory.Build.targets: replace ExtractTestClassNames
with GenerateTestPartitionsForCI target, add _ShouldArchiveTests
logic after Testing.targets import
- Remove TestRunsheetBuilder.targets and GetTestProjects.proj
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Configure test projects for unified CI splitting infrastructure
Update test project files to use the new TestEnumerationRunsheetBuilder:
- Aspire.Hosting.Tests: enable SplitTestsOnCI with partition-based
splitting via TestClassNamePrefixForCI
- Aspire.Cli.EndToEnd.Tests: migrate from ExtractTestClassNamesForHelix
to SplitTestsOnCI, add RequiresCliArchive property
- Aspire.Deployment.EndToEnd.Tests: migrate to SplitTestsOnCI, enable
RunOnGithubActionsLinux (controlled by OnlyDeploymentTests filter)
- Aspire.EndToEnd.Tests: add RequiresNugets property
- Aspire.Templates.Tests: migrate to SplitTestsOnCI, add RequiresNugets,
RequiresTestSdk, EnablePlaywrightInstall, and timeout properties
- Aspire.Playground.Tests: remove obsolete TestRunnerPreCommand
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Simplify CI workflows to use unified test matrix
Rework the CI test orchestration to use a single, unified test matrix:
- enumerate-tests action: replace per-category build steps with a
single build using TestEnumerationRunsheetBuilder, then expand via
expand-test-matrix-github.ps1. Output a single all_tests matrix.
- tests.yml: collapse 3 per-OS setup jobs into 1, replace 9
category×OS job groups with 4 dependency-based groups (no-nugets,
no-nugets-overflow, requires-nugets, requires-cli-archive)
- deployment-tests.yml: use the unified enumerate-tests action with
OnlyDeploymentTests=true, consume all_tests output
- run-tests.yml: pass through testProjectPath, timeouts, and
extraTestArgs from matrix entries
- Remove tests-runner.yml (superseded by run-tests.yml)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update Helix targets to consume new partitions JSON format
Update send-to-helix-templatestests.targets to read test class names
from the new .tests-partitions.json format (produced by
GenerateTestPartitionsForCI) instead of the old .tests.list format.
Strip the 'class:' prefix from partition entries for compatibility
with the existing Helix work item generation.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add Infrastructure.Tests for CI tooling validation
Add a new test project that validates the CI test splitting
infrastructure:
- ExtractTestPartitionsTests: tests the ExtractTestPartitions tool
using dynamically-generated mock assemblies with various trait
and attribute configurations
- BuildTestMatrixTests: validates build-test-matrix.ps1 canonical
matrix generation from metadata files
- ExpandTestMatrixGitHubTests: validates expand-test-matrix-github.ps1
GitHub Actions matrix expansion
- SplitTestMatrixByDepsTests: validates split-test-matrix-by-deps.ps1
dependency-based matrix splitting
- SplitTestProjectsTests: validates split-test-projects-for-ci.ps1
partition discovery
- Shared TestDataBuilder and PowerShellCommand helpers
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add CI testing documentation and rebalance-tests skill
- docs/ci/TestingOnCI.md: comprehensive documentation covering the
test splitting architecture, MSBuild properties, matrix generation
pipeline, and how to add/rebalance test partitions
- .github/skills/rebalance-tests/SKILL.md: agent skill for analyzing
CI build timings, downloading TRX files, computing optimal partition
assignments via greedy bin-packing, and applying changes
- Update CLI E2E testing SKILL.md and README.md to reference the
unified TestEnumerationRunsheetBuilder infrastructure
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add partition traits to Aspire.Hosting.Tests for CI parallelization
Add [Trait("Partition", "N")] attributes to 118 test classes in
Aspire.Hosting.Tests, distributing them across 6 partitions. This
enables the CI infrastructure to split this large test project into
parallel jobs, reducing wall-clock test time.
Partition assignments are balanced by estimated test duration using
greedy bin-packing across the partitions.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Remove rebalance-tests skill
Will be developed separately.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix ExtractTestPartitions race condition and remove silent fallback
- Make build/run failures of ExtractTestPartitions hard errors instead of
silently falling back to class-based splitting
- Pre-build the tool in enumerate-tests action before parallel test matrix
generation to eliminate file locking race condition
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix CLI E2E tests: add missing PR env vars to nuget-dependent test steps
The GITHUB_PR_NUMBER, GITHUB_PR_HEAD_SHA, and GH_TOKEN environment
variables were only set on the non-nuget test steps, but CLI E2E tests
have requiresNugets=true and always run via the nuget-dependent path.
This caused 'aspire: command not found' because the install script
could not authenticate or identify the PR to download artifacts from.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix GenerateTestPartitionsForCI running during GitHub Actions test execution
The GenerateTestPartitionsForCI target was firing during test execution jobs
in run-tests.yml because PrepareForHelix=true (passed for archiving) combined
with RunOnAzdoHelix=true (default) satisfied the condition. This caused
split-test-projects-for-ci.ps1 to run and fail since ExtractTestPartitions
wasn't built in that job.
Add IsGitHubActionsRunner!=true to the PrepareForHelix branch so partition
generation only runs via GenerateCIPartitions=true on GitHub Actions
(set by the enumerate-tests action) and via PrepareForHelix on AzDo Helix.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix RepoRoot path quoting for Windows in GenerateTestPartitionsForCI
On Windows, RepoRoot ends with backslash (e.g. D:\a\_work\1\s\). When
wrapped in quotes for the PowerShell command, the trailing backslash
escapes the closing quote, embedding a literal quote character in the
path. TrimEnd the backslash before quoting to fix this.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update eng/TestEnumerationRunsheetBuilder/TestEnumerationRunsheetBuilder.targets
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update eng/TestEnumerationRunsheetBuilder/TestEnumerationRunsheetBuilder.targets
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…ft#14868)
* chore: trigger CI build for issue microsoft#14819 investigation
Whitespace change to trigger CI pipeline and E2E test execution
for reproducing the flaky DetachFormatJsonProducesValidJson test.
Fixesmicrosoft#14819
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix flaky E2E test: retry MSBuild evaluation on empty output
When dotnet msbuild -getProperty/-getItem returns exit code 0 but
produces no stdout output (likely due to MSBuild server contention
when another AppHost process is running), JsonDocument.Parse would
throw 'The input does not contain any JSON tokens', crashing the
aspire run --detach --format json command.
This fix adds retry logic (up to 3 attempts with increasing delay)
for this specific case, making the project discovery more resilient
to concurrent MSBuild operations.
Fixesmicrosoft#14819
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Mitch Denny <mitch@mitchdeny.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add polyglot exports for AppContainers
* Update exports
* Fix tests
* Add test for new behaviors
* Fix cancellation token wrappers in polyglot SDKs
Avoid generating/ registering CancellationToken as a handle wrapper in Go, Java, and Rust generators, and update snapshots.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…soft#14569)
* Replace Playwright MCP server with Playwright CLI installation
Replace the Playwright MCP server configuration in `aspire agent init` with a
secure Playwright CLI installation workflow. Instead of writing MCP server
configuration to each agent environment's config file, the new approach:
- Resolves the @playwright/cli package version from npm registry
- Downloads the package tarball via `npm pack`
- Verifies supply chain integrity (SHA-512 SRI hash comparison)
- Runs `npm audit signatures` for provenance verification
- Installs globally from the verified tarball
- Runs `playwright-cli install --skills` to generate skill files
New abstractions:
- INpmRunner/NpmRunner: npm CLI command runner (resolve, pack, audit, install)
- IPlaywrightCliRunner/PlaywrightCliRunner: playwright-cli command runner
- PlaywrightCliInstaller: orchestrates the secure install flow
This removes ~400 lines of per-scanner MCP config writing code (different JSON
formats for VS Code, Claude Code, Copilot CLI, and OpenCode) and replaces it
with a single global CLI install.
Fixesmicrosoft#14430
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Pin Playwright CLI version range to 0.1.1
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add npm provenance verification and break-glass config
- Add INpmProvenanceChecker/NpmProvenanceChecker for SLSA attestation verification
- Return rich ProvenanceVerificationResult with gate-specific outcome enum
- Fix AuditSignaturesAsync with temp-project approach for global tools
- Add disablePlaywrightCliPackageValidation break-glass config option
- Add security design document (docs/specs/safe-npm-tool-install.md)
- Verify SRI integrity, Sigstore attestations, and source repository provenance
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix markdownlint: add language to fenced code block
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Improve version resolution and provenance verification
- Change version range from exact 0.1.1 to >=0.1.1 for future versions
- Add playwrightCliVersion config override for pinning specific versions
- Verify workflow path (.github/workflows/publish.yml) in provenance
- Verify SLSA build type (GitHub Actions) to confirm OIDC token issuer
- Add BuildType to NpmProvenanceData, WorkflowMismatch and
BuildTypeMismatch outcomes
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add tests for version pinning and default version range
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add E2E test for Playwright CLI installation via agent init
Verifies the full lifecycle: project creation, aspire agent init with
Claude Code environment, Playwright CLI installation with npm provenance
verification, and skill file generation.
Marked as OuterloopTest since it requires npm and network access.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Show status spinner during Playwright CLI installation
Wrap the installation work in IInteractionService.ShowStatusAsync to
display a spinner with 'Installing Playwright CLI...' status text while
the npm operations are in progress.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Mirror playwright-cli skill files to all detected agent environments
After playwright-cli install --skills creates files in .claude/skills/,
the installer now mirrors the playwright-cli skill directory to all
other detected agent environment skill directories (.github/skills/,
.opencode/skill/, etc.) so every configured environment has identical
skill files. Stale files in target directories are also removed.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update security design doc to match implementation
- Step 4 now documents all three provenance gates: source repository,
workflow path, and build type (with OIDC issuer implication)
- Added table of verified fields with expected values
- Updated implementation constants to include new fields
- Added configuration section documenting break-glass keys
- Updated verification diagram with workflow/build type checks
- Step 7 now documents skill file mirroring across environments
- Future improvements reflects experimental Sigstore branch status
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Verify workflow ref matches package version in provenance
Add Gate 6 to provenance verification: check that the workflow ref
(git tag) in the SLSA attestation matches refs/tags/v{version}. This
ensures the build was triggered from the expected release tag, not
an arbitrary branch or commit.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Use callback-based workflow ref validation in provenance checker
Make the workflow ref validation configurable per-package by accepting a
Func<WorkflowRefInfo, bool> callback instead of hardcoding the
refs/tags/v{version} format. The ref is parsed into a WorkflowRefInfo
record (Raw, Kind, Name) and the caller decides what's valid.
PlaywrightCliInstaller validates Kind=tags and Name=v{version}.
Other packages can use different tag conventions without modifying
the provenance checker.
Addresses review feedback from DamianEdwards.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Replace npm provenance checking with Sigstore verification
Use the Sigstore and Tuf NuGet packages (0.2.0) to cryptographically
verify npm attestation bundles in-process, replacing the previous
approach of shelling out to 'npm audit signatures'.
- Add SigstoreNpmProvenanceChecker implementing INpmProvenanceChecker
using SigstoreVerifier with CertificateIdentity.ForGitHubActions
- Remove the npm audit signatures step from PlaywrightCliInstaller
- Keep existing NpmProvenanceChecker but no longer register in DI
- Add optional sriIntegrity parameter to INpmProvenanceChecker for
digest-based bundle verification
- Update safe-npm-tool-install.md spec to reflect new verification flow
- Temporarily add nuget.org to NuGet.config for Sigstore/Tuf packages
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Refactor SigstoreNpmProvenanceChecker for clarity
Break the monolithic VerifyProvenanceAsync method into focused methods:
- FetchAttestationJsonAsync: fetches attestation JSON from npm registry
- ParseAttestation: parses JSON in a single pass, extracting both the
Sigstore bundle and provenance data (eliminates duplicate JSON parsing)
- ParseProvenanceFromStatement: extracts provenance fields from in-toto statement
- VerifySigstoreBundleAsync: cryptographic Sigstore verification
- VerifyProvenanceFields: field-level provenance checks (source repo,
workflow, build type, workflow ref)
Removes dependency on NpmProvenanceChecker.ParseProvenance() which was
re-parsing the same JSON and iterating attestations a second time.
Adds NpmAttestationParseResult type to carry both bundle and provenance
data from a single parse pass.
Adds comprehensive unit tests for ParseAttestation, ParseProvenanceFromStatement,
and VerifyProvenanceFields covering success and failure cases.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add libsodium to nuget-org package source mapping
libsodium is a transitive dependency of NSec.Cryptography (used by Sigstore)
and needs to be mapped to the nuget-org source for CI restore to succeed.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Mitch Denny <mitch@mitchdeny.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
NOTE: Merging to unblock build.
* Remove temporary nuget.org feed from NuGet.config
Remove the temporary nuget-org package source and its package source
mapping entries (Sigstore, Tuf, NSec.Cryptography, libsodium). These
packages will be resolved from the normal internal feeds (dotnet-public,
dotnet-eng) which have wildcard pattern mappings.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update Sigstore and Tuf packages to 0.3.0
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Mitch Denny <mitch@mitchdeny.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…osoft#14920)
Replace bare 'new HttpClient()' with 'app.CreateHttpClient()' which uses
IHttpClientFactory with AddStandardResilienceHandler() already configured
by TestDistributedApplicationBuilder. This adds automatic retries for
transient failures (502 BadGateway) caused by Docker inter-container
networking not being fully established when the test makes its HTTP request.
Fixesmicrosoft#9344
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Watch fork for prototyping
* Single file programs
* Move WatchPrototype dependencies into their own Directory.Packages.props
This means WatchPrototype dependencies won't affect the rest of the repo.
---------
Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com>
@tmat
Tomáš Matoušek (tmat) merged commit ba030e9 into microsoft:feature/watch-prototypeMar 5, 2026
7 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 4, 2026
Sign up for freeto 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.

20 participants

@tmat@afscrome@davidfowl@ShilpiRach@mitchdenny@dotnet-bot@JamesNK@eerhardt@wicksipedia@spboyer@joperezr@DamianEdwards@karolz-ms@sebastienros@danegsta@rynowak@adamint@wtgodbe@mitchcapper