Skip to content

Add portable volume path environment variables - #19404

Open
Mitch Denny (mitchdenny) wants to merge 9 commits into
mainfrom
mitchdenny-persistent-volume-convention
Open

Add portable volume path environment variables#19404
Mitch Denny (mitchdenny) wants to merge 9 commits into
mainfrom
mitchdenny-persistent-volume-convention

Conversation

@mitchdenny

@mitchdenny Mitch Denny (mitchdenny) commented Aug 15, 2026

Copy link
Copy Markdown
Member

Description

Volume mount paths often differ between local process execution and deployed containers. Projects and executables need a host filesystem path during the inner loop, while Docker Compose, Kubernetes, and Azure Container Apps need the in-container mount path.

This change adds an environment-variable convention so applications can consume one path setting in both modes:

  • WithVolume(..., env: "DATA_PATH") now supports projects, executables, and containers.
  • Local projects and executables receive a deterministic, workload-scoped directory under IAspireStore.
  • Local containers and published workloads receive the configured container mount path.
  • Kubernetes WithPersistentVolume(..., env: "DATA_PATH") composes the generic behavior while retaining shared PVC identity, capacity, storage class, access modes, and cross-environment validation.
  • Docker Compose, Kubernetes, and Azure Container Apps publish the volume and environment variable through their existing target-specific storage models.
  • Local path identities use stable non-cryptographic hashes and containment checks to avoid collisions and path traversal.

User-facing usage

C# AppHost:

builder.AddProject<Projects.Api>("api")
    .WithVolume("data", "/data", env: "DATA_PATH");

var k8s = builder.AddKubernetesEnvironment("k8s");
var persistentData = k8s.AddPersistentVolume("persistent-data")
    .WithCapacity("20Gi");

builder.AddProject<Projects.Worker>("worker")
    .WithPersistentVolume(persistentData, "/data", env: "DATA_PATH");

TypeScript AppHost:

await api.withVolume("/data", { name: "data", env: "DATA_PATH" });
await worker.withKubernetesPersistentVolumeMount(
    persistentData,
    "/data",
    { env: "DATA_PATH" });

Validation

  • Aspire.Hosting.Kubernetes.Tests: 297 passed
  • Aspire.Hosting.Azure.Kubernetes.Tests: 91 passed
  • Aspire.Hosting.Docker.Tests: 100 passed, 1 platform-specific skip
  • Aspire.Hosting.CodeGeneration.TypeScript.Tests: 100 passed
  • Aspire.Hosting.Tests focused volume tests: 9 passed
  • Azure Container Apps volume publisher tests: 2 passed
  • Aspire.Deployment.EndToEnd.Tests builds successfully
  • The local KinD E2E was attempted but stopped before app creation when the test environment timed out downloading kubectl

End-to-end deployment coverage

Docker Compose is covered by DockerComposeDeployWithVolumeTests, the Compose counterpart to the Kubernetes project persistent-volume test. Neither needs a cloud subscription, so both run on every PR. It deploys a project that learns its mount path only from DATA_PATH, then asserts the generated compose file and the running container — DATA_PATH=/data plus a real named volume mounted there (volume|aspire-compose-<hash>_serverdata|/data), since generation alone cannot show the wiring reaches the deployed workload. Verified locally, passes in ~1m20s.

The durability round-trip (write -> force-recreate -> read back) is deliberately omitted because it cannot pass today: .NET images run as a non-root user while a fresh Docker named volume is created root-owned, so a project cannot write to its own volume. Kubernetes avoids this by setting fsGroup; Compose has no equivalent. Filed as #19422 with a verified fix proposal, and the round-trip should be added once that lands.

This PR also re-enables the two pre-existing Compose deployment tests in DockerDeploymentTests, which had been disabled by a stale [ActiveIssue] (#15930) and [QuarantinedTest] (#15882 / #15871) — neither cause still applies. Both attributes had to be removed together: eng/scripts/split-test-projects-for-ci.ps1 enumerates test classes with --filter-not-trait quarantined=true, so removing only [ActiveIssue] would have left the class with no CI job at all.

Fixes # (issue)

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

Copilot AI balanced review requested due to automatic review settings August 15, 2026 02:22
@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 -- 19404

Or

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

@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

Adds portable volume-path environment variables across local execution and container deployment targets.

Changes:

  • Adds workload-scoped local volume paths for projects and executables.
  • Extends Kubernetes persistent-volume handling and validation.
  • Updates Docker Compose, Kubernetes, Azure Container Apps, TypeScript generation, documentation, and tests.
Show a summary per file
File Description
tests/Aspire.Hosting.Tests/WithVolumeTests.cs Tests core volume-path behavior.
tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithPersistentVolumeEnvironment_OnContainerAndExecutable#06.verified.yaml Verifies published environment values.
tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithPersistentVolumeEnvironment_OnContainerAndExecutable#05.verified.yaml Verifies executable PVC.
tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithPersistentVolumeEnvironment_OnContainerAndExecutable#04.verified.yaml Verifies executable StatefulSet.
tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithPersistentVolumeEnvironment_OnContainerAndExecutable#03.verified.yaml Verifies executable configuration.
tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithPersistentVolumeEnvironment_OnContainerAndExecutable#02.verified.yaml Verifies container PVC.
tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithPersistentVolumeEnvironment_OnContainerAndExecutable#01.verified.yaml Verifies container StatefulSet.
tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithPersistentVolumeEnvironment_OnContainerAndExecutable#00.verified.yaml Verifies container configuration.
tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithFirstClassPersistentVolume_EnvironmentUsesDeploymentMountPath#03.verified.yaml Verifies deployment path value.
tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithFirstClassPersistentVolume_EnvironmentUsesDeploymentMountPath#02.verified.yaml Verifies customized PVC.
tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithFirstClassPersistentVolume_EnvironmentUsesDeploymentMountPath#01.verified.yaml Verifies project StatefulSet.
tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithFirstClassPersistentVolume_EnvironmentUsesDeploymentMountPath#00.verified.yaml Verifies project configuration.
tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ProjectAndExecutableVolumesUseDefaultStorageAndEnvironmentPaths#04.verified.yaml Verifies published path values.
tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ProjectAndExecutableVolumesUseDefaultStorageAndEnvironmentPaths#03.verified.yaml Verifies executable deployment.
tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ProjectAndExecutableVolumesUseDefaultStorageAndEnvironmentPaths#02.verified.yaml Verifies executable configuration.
tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ProjectAndExecutableVolumesUseDefaultStorageAndEnvironmentPaths#01.verified.yaml Verifies project deployment.
tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ProjectAndExecutableVolumesUseDefaultStorageAndEnvironmentPaths#00.verified.yaml Verifies project configuration.
tests/Aspire.Hosting.Kubernetes.Tests/KubernetesPublisherTests.cs Adds Kubernetes publishing tests.
tests/Aspire.Hosting.Kubernetes.Tests/KubernetesPersistentVolumeRunModeTests.cs Tests local persistent-volume behavior.
tests/Aspire.Hosting.Kubernetes.Tests/KubernetesEnvironmentResourceTests.cs Tests cross-environment validation.
tests/Aspire.Hosting.Docker.Tests/Snapshots/DockerComposePublisherTests.PublishAsync_ProjectAndExecutableVolumesIncludeEnvironmentPaths.verified.yaml Verifies Compose volume paths.
tests/Aspire.Hosting.Docker.Tests/Snapshots/DockerComposePublisherTests.PublishAsync_MixedBindMountsAndVolumes.verified.yaml Verifies container environment output.
tests/Aspire.Hosting.Docker.Tests/DockerComposePublisherTests.cs Adds Docker Compose coverage.
tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.ts Updates generated TypeScript API.
tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/HostingContainerResourceCapabilities.verified.txt Updates capability target metadata.
tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/AtsTypeScriptCodeGeneratorTests.cs Tests generated volume options.
tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests.csproj References Kubernetes for generation tests.
tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureContainerAppsTests.VolumesAndBindMountsAreTranslation.verified.bicep Verifies ACA environment output.
tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureContainerAppsTests.ProjectAndExecutableVolumesIncludeEnvironmentPaths#01.verified.json Verifies project manifest.
tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureContainerAppsTests.ProjectAndExecutableVolumesIncludeEnvironmentPaths#01.verified.bicep Verifies project Bicep.
tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureContainerAppsTests.ProjectAndExecutableVolumesIncludeEnvironmentPaths#00.verified.json Verifies executable manifest.
tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureContainerAppsTests.ProjectAndExecutableVolumesIncludeEnvironmentPaths#00.verified.bicep Verifies executable Bicep.
tests/Aspire.Hosting.Azure.Tests/AzureContainerAppsTests.cs Adds ACA publishing coverage.
tests/Aspire.Hosting.Azure.Kubernetes.Tests/AzureKubernetesPersistentVolumeTests.cs Tests AKS local path resolution.
tests/Aspire.Deployment.EndToEnd.Tests/AksPersistentVolumeDeploymentTests.cs Uses portable paths in AKS E2E.
tests/Aspire.Cli.EndToEnd.Tests/KubernetesDeployWithProjectPersistentVolumeTests.cs Updates C# Kubernetes E2E.
tests/Aspire.Cli.EndToEnd.Tests/KubernetesDeployTypeScriptWithPersistentVolumeTests.cs Updates TypeScript Kubernetes E2E.
src/Aspire.Hosting/VolumeResourceBuilderExtensions.cs Implements portable volume environments.
src/Aspire.Hosting/VolumeMountPathResolver.cs Generates safe local paths.
src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs Delegates existing volume overloads.
src/Aspire.Hosting/Ats/CoreExports.cs Exports volume support for compute resources.
src/Aspire.Hosting/ApplicationModel/VolumeMountPathResolverAnnotation.cs Stores target-specific path resolvers.
src/Aspire.Hosting.Kubernetes/README.md Documents Kubernetes volume usage.
src/Aspire.Hosting.Kubernetes/KubernetesPersistentVolumeResource.cs Updates persistent-volume documentation.
src/Aspire.Hosting.Kubernetes/KubernetesPersistentVolumeLocalStorage.cs Resolves shared local PV storage.
src/Aspire.Hosting.Kubernetes/KubernetesPersistentVolumeExtensions.cs Adds environment-enabled PV overloads.
src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentResource.cs Moves binding validation globally.
src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentExtensions.cs Validates and finalizes PV bindings.
src/Aspire.Hosting.Kubernetes/Annotations/KubernetesPersistentVolumeBindingAnnotation.cs Tracks environment and local-volume metadata.
src/Aspire.Hosting.Docker/README.md Documents Compose volume paths.
src/Aspire.Hosting.Azure.Kubernetes/README.md Documents AKS portable paths.
src/Aspire.Hosting.Azure.Kubernetes/AzureKubernetesPersistentVolumeExtensions.cs Updates AKS API example.

Review details

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

Suppressed comments (1)

src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentExtensions.cs:173

  • This publish-time configuration error is thrown inside validate-kubernetes as InvalidOperationException, so the pipeline wraps it with a step-failure prefix. Throw DistributedApplicationException to preserve the clean, actionable cross-environment message; update the test's expected exception type accordingly.
                throw new InvalidOperationException(
                    $"Resource '{resource.Name}' is assigned to compute environment '{targetName}' but binds " +
                    $"Kubernetes persistent volume '{annotation.Volume.Name}' which belongs to environment " +
                    $"'{volumeEnvironment.Name}'. A workload can only bind persistent volumes declared on its " +
                    $"Kubernetes compute environment. Declare the volume on the workload's Kubernetes environment, " +
                    $"or assign the workload to '{supportedTargetName}' with WithComputeEnvironment.");
  • Files reviewed: 52/52 changed files
  • Comments generated: 3
  • Review effort level: Balanced

Comment thread src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentExtensions.cs Outdated
Comment thread src/Aspire.Hosting.Kubernetes/README.md
Copilot AI review requested due to automatic review settings August 15, 2026 02:40

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.

Review details

Suppressed comments (1)

Previously missed (1) — in code that hasn't changed since the last review.

src/Aspire.Hosting/VolumeResourceBuilderExtensions.cs:65

  • Reject an empty target here. The new project/executable API otherwise accepts "", sets the published environment variable to an empty value, and emits a mount with an empty destination, which Docker/Kubernetes cannot deploy. Validate this at the public API boundary rather than deferring the failure to a target publisher.
        ArgumentNullException.ThrowIfNull(target);
  • Files reviewed: 52/52 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

@github-actions

This comment has been minimized.

@github-actions

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.

@github-actions

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.

@github-actions

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.

@mitchdenny

Copy link
Copy Markdown
Member Author

PR Testing Report

PR Information

  • PR Number: Add portable volume path environment variables #19404
  • Title: Add portable volume path environment variables
  • Head Commit: 1f54a6b431fcc407fae4be2b1d600a0abd94e72e
  • Tested At: 2026-08-15T03:53:12Z
  • Execution Target: Repo-local Linux ARM64 container runner with host Docker socket

Artifact Version Verification

  • Expected Commit: 1f54a6b431fcc407fae4be2b1d600a0abd94e72e
  • Installed Version: 13.6.0-pr.19404.g1f54a6b4
  • Status: ✅ Verified

Changes Analyzed

Change Categories

  • CLI changes
  • Hosting core/public API changes
  • Kubernetes and AKS integration changes
  • Docker Compose publisher behavior
  • Azure Container Apps publisher behavior
  • TypeScript generated SDK changes
  • Dashboard changes
  • Client/component changes
  • Template changes
  • VS Code extension changes
  • CI infrastructure changes
  • Unit, snapshot, deployment, and CLI E2E test changes

Main Changed Surfaces

  • src/Aspire.Hosting/VolumeResourceBuilderExtensions.cs — env-aware volumes for compute resources
  • src/Aspire.Hosting/VolumeMountPathResolver.cs — deterministic local store paths
  • src/Aspire.Hosting.Kubernetes/KubernetesPersistentVolumeExtensions.cs — Kubernetes persistent-volume path injection
  • src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentExtensions.cs — binding validation and run-mode finalization
  • src/Aspire.Hosting.Docker/** — Compose documentation/publisher validation
  • src/Aspire.Hosting.Azure.AppContainers consumers — ACA Azure Files projection
  • ATS/code-generation snapshots — TypeScript options-object APIs

Test Scenarios Executed

Scenario 1: PR Artifact Version Verification

Objective: Verify testing uses the CLI artifact built from the current PR head.
Coverage Type: Artifact integrity
Status: ✅ Passed

Steps:

  1. Installed PR Add portable volume path environment variables #19404 through the dogfood installer in the repo container runner.
  2. Invoked the installed binary directly.
  3. Re-read the PR head after testing.

Evidence:

  • install.log
  • version.txt

Observations:

  • The installed version includes short head SHA 1f54a6b4.
  • PR head remained unchanged throughout testing.

Scenario 2: Executable Inner-Loop Path and Data Reuse

Objective: Verify a local executable receives an IAspireStore path and reuses the same data in a separate AppHost run.
Coverage Type: Happy path / persistence boundary
Status: ✅ Passed

Steps:

  1. Created a fresh C# file-based AppHost from the PR hive.
  2. Added /bin/sh as an executable with .WithVolume("data", "/data", env: "DATA_PATH").
  3. First AppHost run wrote persisted to $DATA_PATH/marker.txt.
  4. Stopped the AppHost normally.
  5. Started a second AppHost run and read the marker.

Evidence:

  • scenario-innerloop-run.log

Observations:

  • DATA_PATH resolved under obj/.aspire/volumes/<resource-hash>/<volume-hash>.
  • The second run reported REUSED_VALUE=persisted.

Scenario 3: Project Inner-Loop Path and Data Reuse

Objective: Verify a real .NET project resource receives and reuses its workload-scoped local path.
Coverage Type: Happy path / process-entrypoint coverage
Status: ✅ Passed

Steps:

  1. Added a fresh .NET 10 console project to a PR-hive AppHost.
  2. Configured the project with .WithVolume("data", "/data", env: "DATA_PATH").
  3. The first completed run created marker.txt.
  4. A subsequent AppHost run read the same file.

Evidence:

  • scenario-innerloop-project-evidence.log
  • scenario-innerloop-project-reuse.log

Observations:

  • The project received a distinct workload-scoped path.
  • The later run reported PROJECT_REUSED_VALUE=project-persisted.

Scenario 4: Named Container Volume Reuse

Objective: Verify container env injection and named runtime-volume persistence across session container recreation.
Coverage Type: Happy path / container lifetime boundary
Status: ✅ Passed

Steps:

  1. Created a fresh AppHost with an Alpine container.
  2. Configured .WithVolume("pr19404-volume-reuse", "/data", env: "DATA_PATH").
  3. First run wrote a marker into /data.
  4. Stopped the session AppHost and inspected the Docker volume.
  5. Started a second run, which created a new container and read the original marker.

Evidence:

  • scenario-container-run.log

Observations:

  • Resource description reported DATA_PATH=/data.
  • Docker retained pr19404-volume-reuse after AppHost stop.
  • The container ID changed, while the second run reported REUSED_VALUE=persisted.

Scenario 5: Docker Compose Publish

Objective: Verify project, executable, and container volumes project into Compose consistently.
Coverage Type: Generated artifact
Status: ✅ Passed

Steps:

  1. Created a fresh C# AppHost from the PR hive.
  2. Added Aspire.Hosting.Docker.
  3. Added project, executable, and container workloads with env-aware volumes.
  4. Published to an isolated output directory.

Evidence:

  • scenario-compose-publish-clean.log
  • scenario-compose-artifacts.log
  • Generated scenario-compose/output/docker-compose.yaml

Observations:

  • All three services contain the configured DATA_PATH.
  • Each service has the expected named volume and target.
  • All named volumes appear in the top-level volumes section.

Scenario 6: Kubernetes Generic and First-Class Persistent Volume Publish

Objective: Verify generic and first-class volume semantics for project, executable, and container workloads.
Coverage Type: Generated artifact
Status: ✅ Passed

Steps:

  1. Created a fresh C# AppHost and added Aspire.Hosting.Kubernetes.
  2. Added a generic project volume and first-class persistent volumes.
  3. Published the Helm chart.
  4. Inspected values.yaml, Deployment, StatefulSet, and PVC templates.

Evidence:

  • scenario-kubernetes-publish.log
  • Generated files under scenario-kubernetes/output/

Observations:

  • Generic project storage emitted emptyDir and DATA_PATH=/srv/generic.
  • Persistent project/executable/container resources emitted StatefulSets and PVC references.
  • PVC capacity was 256Mi.
  • Persistent workloads emitted fsGroup: 2000 and OnRootMismatch.

Scenario 7: TypeScript Generated SDK

Objective: Verify the PR-generated TypeScript API shape compiles and publishes.
Coverage Type: Polyglot API / generated SDK
Status: ✅ Passed

Steps:

  1. Created a fresh aspire-ts-empty AppHost from the PR hive.
  2. Added Kubernetes and restored generated SDK code.
  3. Used:
    • withVolume("/srv/generic", { name: "generic-data", env: "DATA_PATH" })
    • withKubernetesPersistentVolumeMount(..., { env: "DATA_PATH" })
  4. Ran ESLint and TypeScript compilation.
  5. Published the Kubernetes chart.

Evidence:

  • scenario-typescript-create.log
  • scenario-typescript-build.log
  • scenario-typescript-publish.log

Observations:

  • Generated options-object signatures compiled without casts or workarounds.
  • Published values and workload manifests contained the expected environment paths and volume types.

Scenario 8: Live KinD Deploy and Pod Restart

Objective: Verify real-cluster acceptance and persistent data after pod replacement.
Coverage Type: Live deployment / durability
Status: ✅ Passed

Steps:

  1. Installed ARM64 KinD v0.31.0, Helm v4.2.0, and kubectl v1.34.3.
  2. Created a KinD v1.35.0 cluster with the default standard local-path StorageClass.
  3. Deployed the TypeScript AppHost through aspire deploy.
  4. Waited for generic and persistent pods to become Ready.
  5. Verified environment variables, PVC status, and pod security context.
  6. Wrote a marker to the PVC, deleted the StatefulSet pod, waited for replacement, and read the marker.

Evidence:

  • kube-tools-install.log
  • kind-create.log
  • scenario-kind-deploy.log
  • scenario-kind-persistence.log

Observations:

  • All 19 deploy pipeline steps passed.
  • PVC persistent-data reached Bound.
  • Generic pod reported /srv/generic; persistent pod reported /srv/persistent.
  • StatefulSet used fsGroup 2000 and OnRootMismatch.
  • Pod UID changed after deletion.
  • Replacement pod read persisted from the mounted PVC.

Scenario 9: Azure Container Apps Publish

Objective: Verify ACA projects all compute resource types to Azure Files-backed storage and matching env paths.
Coverage Type: Generated Bicep artifact
Status: ✅ Passed

Steps:

  1. Created a fresh AppHost and added Aspire.Hosting.Azure.AppContainers.
  2. Added project, executable, and container workloads with env-aware volumes.
  3. Published Bicep without requiring live Azure credentials.
  4. Searched all deployment modules for env and storage projection.

Evidence:

  • scenario-aca-create.log
  • scenario-aca-publish.log
  • Generated files under scenario-aca/output/

Observations:

  • Project, executable, and container modules all contain DATA_PATH.
  • Each module has the expected mountPath.
  • Each volume uses storageType: 'AzureFile' and a managed-environment storage output.

Scenario 10: Missing env on Project Volume

Objective: Verify project/executable volumes cannot silently lack a usable local path.
Coverage Type: Negative / compile-time validation
Status: ✅ Passed

Steps:

  1. Created a fresh C# AppHost and .NET project.
  2. Called .WithVolume("data", "/data") on the project without env.
  3. Attempted to start the AppHost.

Evidence:

  • scenario-negative-noenv.log

Expected Outcome:

  • Build fails because the no-env overload is container-only.

Observed Outcome:

  • Non-zero exit with CS0311, identifying ProjectResource as invalid for the container-only overload.

Scenario 11: Kubernetes PV Assigned to Docker Compose

Objective: Verify a Kubernetes-owned PVC cannot be silently translated as a Docker Compose volume.
Coverage Type: Negative / target ownership validation
Status: ✅ Passed

Steps:

  1. Created a fresh AppHost with Docker Compose and Kubernetes environments.
  2. Bound a Docker-targeted container to a Kubernetes persistent volume.
  3. Attempted publish.

Evidence:

  • scenario-negative-target.log

Expected Outcome:

  • Clear non-zero validation failure.

Observed Outcome:

  • Validation named the workload, Docker environment, Kubernetes volume/environment, and remediation via WithComputeEnvironment.

Scenario 12: Mixed Host-Process and Container Consumers

Objective: Verify one local Kubernetes PV cannot split into unrelated process-directory and container-volume backings.
Coverage Type: Negative / backing-store consistency
Status: ✅ Passed

Steps:

  1. Created a fresh Kubernetes AppHost.
  2. Bound one persistent volume to a local executable and a local container.
  3. Attempted to start the AppHost.

Evidence:

  • scenario-negative-mixed.log

Expected Outcome:

  • Clear non-zero validation failure before workloads start.

Observed Outcome:

  • Validation named both resources and explained that run mode cannot provide one shared backing store across execution types.

Environment Notes

  • The repo runner image did not include .NET or Node. Workspace-local .NET SDK 10.0.201 and Node 22.14.0 were installed as test prerequisites.
  • An initial C# startup attempt failed only because .NET was absent; the unchanged scenario passed after installing the required SDK.
  • No product failure was observed.

Current CI Status

The manual scenarios above passed, but PR CI is not green. Failures are concentrated in the polyglot validation surface:

  • TypeScript API Compatibility
  • Hosting.CodeGeneration.Go on Ubuntu and Windows
  • Hosting.CodeGeneration.Python on Ubuntu and Windows
  • Hosting.CodeGeneration.Java on Ubuntu
  • Hosting.CodeGeneration.Rust on Ubuntu and Windows
  • Aggregate Tests / Final Test Results and Final Results

These failures still require follow-up; this report verifies runtime and generated-artifact behavior but does not claim the PR is merge-ready.

Summary

Scenario Status Notes
PR artifact/version ✅ Passed Installed CLI matches PR head
Executable inner-loop reuse ✅ Passed Same path/data across AppHost runs
Project inner-loop reuse ✅ Passed Real .NET project reused marker
Named container-volume reuse ✅ Passed New container reused persistent named volume
Docker Compose publish ✅ Passed Project/executable/container env + mounts
Kubernetes publish ✅ Passed Generic + PVC semantics verified
TypeScript generated SDK ✅ Passed Lint, type-check, publish
Live KinD deployment ✅ Passed PVC survives pod replacement
ACA Bicep publish ✅ Passed Azure Files + env for all compute shapes
Project volume without env ✅ Passed Expected compile-time rejection
Kubernetes PV targeting Docker ✅ Passed Expected ownership validation
Mixed host/container PV ✅ Passed Expected backing-store validation

Overall Result

⚠️ MANUAL SCENARIOS VERIFIED; POLYGLOT CI FAILING

Recommendations

  • The PR behavior is consistent across local processes, local containers, Docker Compose, Kubernetes, KinD deployment, Azure Container Apps, and TypeScript AppHosts.
  • Investigate and resolve the failing polyglot code-generation/API-compatibility checks before merge.

Copilot AI review requested due to automatic review settings August 15, 2026 04:59
@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.

Review details

Suppressed comments (1)

src/Aspire.Hosting/Ats/CoreExports.cs:126

  • name and env are documented as required but exposed as optional, while the implementation throws whenever either is omitted. This makes generated executable APIs such as withVolume(target) compile successfully and then fail only during capability invocation. Make these members required in the executable export contract, or define usable defaults.
        string? name = null,
        bool isReadOnly = false,
        string? env = null)
  • Files reviewed: 55/55 changed files
  • Comments generated: 3
  • Review effort level: Balanced

Comment thread src/Aspire.Hosting/Ats/CoreExports.cs Outdated
Comment thread src/Aspire.Hosting/Ats/CoreExports.cs Outdated
@mitchdenny

Copy link
Copy Markdown
Member Author

/deployment-test

@github-actions

Copy link
Copy Markdown
Contributor

🚀 Deployment tests starting on PR #19404...

This will deploy to real Azure infrastructure. Results will be posted here when complete.

View workflow run

@github-actions
github-actions Bot temporarily deployed to deployment-testing August 15, 2026 05:30 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing August 15, 2026 05:56 Inactive
@mitchdenny

Copy link
Copy Markdown
Member Author

/deployment-test

@github-actions

Copy link
Copy Markdown
Contributor

🚀 Deployment tests starting on PR #19404...

This will deploy to real Azure infrastructure. Results will be posted here when complete.

View workflow run

@github-actions
github-actions Bot temporarily deployed to deployment-testing August 16, 2026 00:34 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing August 16, 2026 00:41 Inactive
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: c14c394f-3a84-4e28-a6a6-9faceabbb7fa
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: c14c394f-3a84-4e28-a6a6-9faceabbb7fa
Remove-then-Add relocated the renamed mount to the end of the annotation
collection, and because ContainerMountAnnotation is a record the Remove
matched by value and could drop a value-identical sibling. Assigning
through the indexer preserves position and swaps atomically.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: c14c394f-3a84-4e28-a6a6-9faceabbb7fa

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.

Review details

  • Files reviewed: 55/55 changed files
  • Comments generated: 2
  • Review effort level: Balanced

Comment thread src/Aspire.Hosting.Docker/README.md Outdated
Comment thread src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentExtensions.cs
@github-actions

This comment has been minimized.

The Docker README TypeScript sample still passed name and env through the
options bag. They became required positional parameters when the polyglot
exports were tightened, so the documented call no longer type-checked.

Also adds a publish-mode regression test for a workload that binds an AKS
persistent volume without calling WithComputeEnvironment. AKS is the sole
compute environment in that case, and the implicit binding must survive the
publish-mode validation.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: c14c394f-3a84-4e28-a6a6-9faceabbb7fa
Copilot AI review requested due to automatic review settings August 16, 2026 04:22
@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.

Review details

Suppressed comments (1)

Previously missed (1) — in code that hasn't changed since the last review.

src/Aspire.Hosting/Ats/CoreExports.cs:116

  • The PR's user-facing TypeScript example still calls api.withVolume("/data", { name: "data", env: "DATA_PATH" }), but this exported contract requires target, name, and env as positional arguments; the generated TypeScript signature is withVolume(target, name, env, options?). Update the PR description to use api.withVolume("/data", "data", "DATA_PATH") so the advertised example type-checks.
    [AspireExport("withProjectVolume", MethodName = "withVolume")]
    public static IResourceBuilder<ProjectResource> WithProjectVolumeForPolyglot(
        this IResourceBuilder<ProjectResource> resource,
        string target,
        string name,
        string env,
        bool isReadOnly = false)
  • Files reviewed: 55/55 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

…nt tests

Adds DockerComposeDeployWithVolumeTests, the Compose counterpart to the
Kubernetes project persistent-volume test. It deploys a project that learns its
mount path only from DATA_PATH, then asserts both the generated compose file and
the running container (env var present, named volume mounted at that path).
Generation alone cannot show the wiring reaches the deployed workload.

The durability round-trip (write, force-recreate, read back) is deliberately
omitted: .NET images run non-root while a fresh Docker named volume is created
root-owned, so the app cannot write to its own volume. Kubernetes avoids this via
fsGroup; Compose has no equivalent. Tracked by #19422.

Also re-enables the two existing Compose deployment tests. Both were disabled
twice over and neither reason still applies: the QuarantinedTest traced to a
CS1705 assembly version mismatch on release branches (#15511), and the
ActiveIssue (#15930) was correct when applied — the tests then used a bare
terminal with no CI install fallback — but went stale once harness unification
moved them to CreateDockerTestTerminal and added that fallback.

Both attributes had to go: split-test-projects-for-ci.ps1 enumerates classes with
--filter-not-trait quarantined=true, so removing only ActiveIssue would have left
the class with no CI job at all.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: c14c394f-3a84-4e28-a6a6-9faceabbb7fa
Copilot AI review requested due to automatic review settings August 16, 2026 22:35
@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.

Review details

Suppressed comments (2)

Previously missed (1) — in code that hasn't changed since the last review.

src/Aspire.Hosting/Ats/CoreExports.cs:116

  • The PR description's TypeScript example still calls api.withVolume("/data", { name: "data", env: "DATA_PATH" }), but this exported contract generates withVolume(target, name, env, options?); the documented call does not type-check. Update the PR's user-facing example to pass "data" and "DATA_PATH" positionally, matching the generated API and the updated READMEs.
        string target,
        string name,
        string env,
        bool isReadOnly = false)

tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.py:11358

  • ExecutableResourceKwargs.volume reuses VolumeParameters, whose TypedDict omits env and treats name as optional, but the constructor unconditionally reads both fields. This advertises dictionary inputs that fail with KeyError and rejects the actual required shape during static checking. Generate an executable-specific parameter TypedDict with required target, name, and env fields (or otherwise disambiguate it from the container capability).
    volume: tuple[str, str, str] | VolumeParameters
  • Files reviewed: 57/57 changed files
  • Comments generated: 1
  • Review effort level: Balanced

@github-actions

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.

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.

I found three compatibility/extensibility issues that should be addressed before merge: existing mixed Kubernetes bindings now fail in run mode without using the new env feature, existing name-match containers switch to a different persisted local volume, and custom compute resources are accepted by the public API but fail during environment evaluation.

Focused proof passed for core volume behavior (11 tests), Kubernetes run-mode behavior (11 tests), the cross-environment negative case (1 test), and Docker publisher output (2 tests). Live Docker Compose proof was not completed because building the source-matched LocalHive archive exceeded the 15-minute test budget; the publisher output was the strongest completed substitute.

Comment thread src/Aspire.Hosting/VolumeResourceBuilderExtensions.cs Outdated
Comment thread src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentExtensions.cs Outdated
Comment thread src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentExtensions.cs
Fixes three issues raised in review of the volume env-path convention.

Capability-scoped polyglot parameter types. Three exports project to the
method name `withVolume` but accept different parameter shapes: the container
form takes an optional `name` and no `env`, while the project and executable
forms require both `name` and `env`. The Python and TypeScript generators
derived the parameter carrier from the projected method name, so the container
shape won and the other two silently reused it. Generated Python declared no
`env` key yet indexed it unconditionally, making the dict form raise KeyError
for the shape that type-checked and reject the shape that worked. Generated
TypeScript let callers pass `name` to an implementation that only reads
`isReadOnly`. Both generators now fall back to the capability ID when a shared
method name carries a different shape, and Python throws rather than silently
reusing an incompatible carrier. Go, Java, and Rust already disambiguated.

Run-mode backing-store check no longer rejects publish-only bindings. Only host
processes that requested the environment path materialize an IAspireStore
directory, so a project bound to a publish-only persistent volume cannot
conflict with a container's named runtime volume. The check previously
considered every binding and failed `aspire run` for AppHosts that predate the
env overload.

Generic store fallback for custom compute resources. The public WithVolume
overload accepts any IComputeResource, but resolution threw for anything that
was not a project, executable, or container. Containers and publish mode return
earlier, so the remaining resources all run as host processes and can use the
existing store path instead of failing during environment evaluation.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: c14c394f-3a84-4e28-a6a6-9faceabbb7fa
@github-actions

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.

51 / 101 test projects · 6 jobs, from 56 changed files.

Selected test projects (51 / 101)

Aspire.Cli.EndToEnd.Tests, Aspire.Deployment.EndToEnd.Tests, Aspire.EndToEnd.Tests, Aspire.Hosting.Analyzers.Tests, Aspire.Hosting.Azure.Kubernetes.Tests, Aspire.Hosting.Azure.Kusto.Tests, Aspire.Hosting.Azure.Tests, Aspire.Hosting.Blazor.Tests, Aspire.Hosting.Browsers.Tests, Aspire.Hosting.CodeGeneration.Go.Tests, Aspire.Hosting.CodeGeneration.Java.Tests, Aspire.Hosting.CodeGeneration.Python.Tests, Aspire.Hosting.CodeGeneration.Rust.Tests, Aspire.Hosting.CodeGeneration.TypeScript.Tests, Aspire.Hosting.Containers.Tests, Aspire.Hosting.DevTunnels.Tests, Aspire.Hosting.Docker.Tests, Aspire.Hosting.Dotnet.Tests, Aspire.Hosting.DotnetTool.Tests, Aspire.Hosting.EntityFrameworkCore.Tests, Aspire.Hosting.Foundry.Tests, Aspire.Hosting.Garnet.Tests, Aspire.Hosting.GitHub.Models.Tests, Aspire.Hosting.Go.Tests, Aspire.Hosting.JavaScript.Tests, Aspire.Hosting.Kafka.Tests, Aspire.Hosting.Keycloak.Tests, Aspire.Hosting.Kubernetes.Tests, Aspire.Hosting.Maui.Tests, Aspire.Hosting.Milvus.Tests, Aspire.Hosting.MongoDB.Tests, Aspire.Hosting.MySql.Tests, Aspire.Hosting.Nats.Tests, Aspire.Hosting.OpenAI.Tests, Aspire.Hosting.Oracle.Tests, Aspire.Hosting.Orleans.Tests, Aspire.Hosting.PostgreSQL.Tests, Aspire.Hosting.Python.Tests, Aspire.Hosting.Qdrant.Tests, Aspire.Hosting.RabbitMQ.Tests, Aspire.Hosting.Radius.Tests, Aspire.Hosting.Redis.Tests, Aspire.Hosting.RemoteHost.Tests, Aspire.Hosting.Rust.Tests, Aspire.Hosting.Seq.Tests, Aspire.Hosting.SqlServer.Tests, Aspire.Hosting.Testing.Tests, Aspire.Hosting.Tests, Aspire.Hosting.Valkey.Tests, Aspire.Hosting.Yarp.Tests, Aspire.Playground.Tests

Selected jobs (6)

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


How these were chosen — grouped by what changed

⚠️ 34 of the 51 selected test projects come from a single change — src/Aspire.Hosting/ApplicationModel/VolumeMountPathResolverAnnotation.cs.

🔧 src/Aspire.Hosting/ApplicationModel/VolumeMountPathResolverAnnotation.cs (changed source)
34 via the project graph

show 34

Aspire.Hosting.Analyzers.Tests (2 hops), Aspire.Hosting.Azure.Kusto.Tests (2 hops), Aspire.Hosting.Browsers.Tests (2 hops), Aspire.Hosting.Containers.Tests (2 hops), Aspire.Hosting.DevTunnels.Tests (2 hops), Aspire.Hosting.DotnetTool.Tests (2 hops), Aspire.Hosting.EntityFrameworkCore.Tests (2 hops), Aspire.Hosting.Foundry.Tests (2 hops), Aspire.Hosting.Garnet.Tests (2 hops), Aspire.Hosting.GitHub.Models.Tests (2 hops), Aspire.Hosting.Go.Tests (2 hops), Aspire.Hosting.JavaScript.Tests (2 hops), Aspire.Hosting.Kafka.Tests (2 hops), Aspire.Hosting.Keycloak.Tests (2 hops), Aspire.Hosting.Maui.Tests, Aspire.Hosting.Milvus.Tests (2 hops), Aspire.Hosting.MongoDB.Tests (2 hops), Aspire.Hosting.MySql.Tests (2 hops), Aspire.Hosting.Nats.Tests (2 hops), Aspire.Hosting.OpenAI.Tests (2 hops), Aspire.Hosting.Oracle.Tests (2 hops), Aspire.Hosting.Orleans.Tests (2 hops), Aspire.Hosting.PostgreSQL.Tests (2 hops), Aspire.Hosting.Python.Tests (2 hops), Aspire.Hosting.Qdrant.Tests (2 hops), Aspire.Hosting.RabbitMQ.Tests (2 hops), Aspire.Hosting.Redis.Tests (2 hops), Aspire.Hosting.Rust.Tests (2 hops), Aspire.Hosting.Seq.Tests (2 hops), Aspire.Hosting.SqlServer.Tests (2 hops), Aspire.Hosting.Testing.Tests (2 hops), Aspire.Hosting.Valkey.Tests (2 hops), Aspire.Hosting.Yarp.Tests (2 hops), Aspire.Playground.Tests

🧪 tests/Aspire.Hosting.Tests/WithVolumeTests.cs (changed test)
1 directly: Aspire.Hosting.Tests
3 via the project graph: Aspire.Hosting.Blazor.Tests, Aspire.Hosting.Dotnet.Tests, Aspire.Hosting.Radius.Tests

🔧 src/Aspire.Hosting.Azure.Kubernetes/AzureKubernetesPersistentVolumeExtensions.cs (changed source)
2 directly: Aspire.Hosting.Azure.Kubernetes.Tests, Aspire.Hosting.Azure.Tests

🔧 src/Aspire.Hosting.CodeGeneration.Python/AtsPythonCodeGenerator.cs (changed source)
1 directly: Aspire.Hosting.CodeGeneration.Python.Tests
1 via the project graph: Aspire.Hosting.RemoteHost.Tests

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

🔧 src/Aspire.Hosting.CodeGeneration.TypeScript/AtsTypeScriptCodeGenerator.cs (changed source)
1 directly: Aspire.Hosting.CodeGeneration.TypeScript.Tests

🔧 src/Aspire.Hosting.Kubernetes/Annotations/KubernetesPersistentVolumeBindingAnnotation.cs (changed source)
1 directly: Aspire.Hosting.Kubernetes.Tests

🔧 src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentExtensions.cs (changed source)
1 directly: Aspire.Hosting.Kubernetes.Tests

🔧 src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentResource.cs (changed source)
1 directly: Aspire.Hosting.Kubernetes.Tests

🔧 src/Aspire.Hosting.Kubernetes/KubernetesPersistentVolumeExtensions.cs (changed source)
1 directly: Aspire.Hosting.Kubernetes.Tests

🔧 src/Aspire.Hosting.Kubernetes/KubernetesPersistentVolumeLocalStorage.cs (changed source)
1 directly: Aspire.Hosting.Kubernetes.Tests

🔧 src/Aspire.Hosting.Kubernetes/KubernetesPersistentVolumeResource.cs (changed source)
1 directly: Aspire.Hosting.Kubernetes.Tests

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

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

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

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

🧪 tests/Aspire.Deployment.EndToEnd.Tests/AksPersistentVolumeDeploymentTests.cs (changed test)
1 directly: Aspire.Deployment.EndToEnd.Tests

🧪 tests/Aspire.Hosting.Azure.Kubernetes.Tests/AzureKubernetesPersistentVolumeTests.cs (changed test)
1 directly: Aspire.Hosting.Azure.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Azure.Tests/AzureContainerAppsTests.cs (changed test)
1 directly: Aspire.Hosting.Azure.Tests

🧪 tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureContainerAppsTests.ProjectAndExecutableVolumesIncludeEnvironmentPaths#00.verified.bicep (changed test)
1 directly: Aspire.Hosting.Azure.Tests

🧪 tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureContainerAppsTests.ProjectAndExecutableVolumesIncludeEnvironmentPaths#00.verified.json (changed test)
1 directly: Aspire.Hosting.Azure.Tests

🧪 tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureContainerAppsTests.ProjectAndExecutableVolumesIncludeEnvironmentPaths#01.verified.bicep (changed test)
1 directly: Aspire.Hosting.Azure.Tests

🧪 tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureContainerAppsTests.ProjectAndExecutableVolumesIncludeEnvironmentPaths#01.verified.json (changed test)
1 directly: Aspire.Hosting.Azure.Tests

🧪 tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureContainerAppsTests.VolumesAndBindMountsAreTranslation.verified.bicep (changed test)
1 directly: Aspire.Hosting.Azure.Tests

🧪 tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.go (changed test)
1 directly: Aspire.Hosting.CodeGeneration.Go.Tests

🧪 tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.java (changed test)
1 directly: Aspire.Hosting.CodeGeneration.Java.Tests

🧪 tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.py (changed test)
1 directly: Aspire.Hosting.CodeGeneration.Python.Tests

🧪 tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.rs (changed test)
1 directly: Aspire.Hosting.CodeGeneration.Rust.Tests

🧪 tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests.csproj (changed test)
1 directly: Aspire.Hosting.CodeGeneration.TypeScript.Tests

🧪 tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/AtsTypeScriptCodeGeneratorTests.cs (changed test)
1 directly: Aspire.Hosting.CodeGeneration.TypeScript.Tests

🧪 tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.ts (changed test)
1 directly: Aspire.Hosting.CodeGeneration.TypeScript.Tests

🧪 tests/Aspire.Hosting.Docker.Tests/DockerComposePublisherTests.cs (changed test)
1 directly: Aspire.Hosting.Docker.Tests

🧪 tests/Aspire.Hosting.Docker.Tests/Snapshots/DockerComposePublisherTests.PublishAsync_MixedBindMountsAndVolumes.verified.yaml (changed test)
1 directly: Aspire.Hosting.Docker.Tests

🧪 tests/Aspire.Hosting.Docker.Tests/Snapshots/DockerComposePublisherTests.PublishAsync_ProjectAndExecutableVolumesIncludeEnvironmentPaths.verified.yaml (changed test)
1 directly: Aspire.Hosting.Docker.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/KubernetesEnvironmentResourceTests.cs (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/KubernetesPersistentVolumeRunModeTests.cs (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/KubernetesPublisherTests.cs (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ProjectAndExecutableVolumesUseDefaultStorageAndEnvironmentPaths#00.verified.yaml (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ProjectAndExecutableVolumesUseDefaultStorageAndEnvironmentPaths#01.verified.yaml (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ProjectAndExecutableVolumesUseDefaultStorageAndEnvironmentPaths#02.verified.yaml (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ProjectAndExecutableVolumesUseDefaultStorageAndEnvironmentPaths#03.verified.yaml (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ProjectAndExecutableVolumesUseDefaultStorageAndEnvironmentPaths#04.verified.yaml (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithFirstClassPersistentVolume_EnvironmentUsesDeploymentMountPath#00.verified.yaml (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithFirstClassPersistentVolume_EnvironmentUsesDeploymentMountPath#01.verified.yaml (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithFirstClassPersistentVolume_EnvironmentUsesDeploymentMountPath#02.verified.yaml (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithFirstClassPersistentVolume_EnvironmentUsesDeploymentMountPath#03.verified.yaml (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithPersistentVolumeEnvironment_OnContainerAndExecutable#00.verified.yaml (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithPersistentVolumeEnvironment_OnContainerAndExecutable#01.verified.yaml (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithPersistentVolumeEnvironment_OnContainerAndExecutable#02.verified.yaml (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithPersistentVolumeEnvironment_OnContainerAndExecutable#03.verified.yaml (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithPersistentVolumeEnvironment_OnContainerAndExecutable#04.verified.yaml (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithPersistentVolumeEnvironment_OnContainerAndExecutable#05.verified.yaml (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithPersistentVolumeEnvironment_OnContainerAndExecutable#06.verified.yaml (changed test)
1 directly: Aspire.Hosting.Kubernetes.Tests

Job reasons

Job Triggered by
cli-starter selected test Aspire.Cli.EndToEnd.Tests
deployment-e2e tests/Aspire.Deployment.EndToEnd.Tests/AksPersistentVolumeDeploymentTests.cs
• affected project Aspire.Hosting.Azure.Kubernetes
extension-e2e src/Aspire.Hosting.Azure.Kubernetes/AzureKubernetesPersistentVolumeExtensions.cs, src/Aspire.Hosting.CodeGeneration.Python/AtsPythonCodeGenerator.cs, src/Aspire.Hosting.CodeGeneration.TypeScript/AtsTypeScriptCodeGenerator.cs, src/Aspire.Hosting.Kubernetes/Annotations/KubernetesPersistentVolumeBindingAnnotation.cs, src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentExtensions.cs, src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentResource.cs, src/Aspire.Hosting.Kubernetes/KubernetesPersistentVolumeExtensions.cs, src/Aspire.Hosting.Kubernetes/KubernetesPersistentVolumeLocalStorage.cs, src/Aspire.Hosting.Kubernetes/KubernetesPersistentVolumeResource.cs, src/Aspire.Hosting/ApplicationModel/VolumeMountPathResolverAnnotation.cs, src/Aspire.Hosting/Ats/CoreExports.cs, src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs, src/Aspire.Hosting/VolumeMountPathResolver.cs, src/Aspire.Hosting/VolumeResourceBuilderExtensions.cs, tests/Aspire.Cli.EndToEnd.Tests/DockerComposeDeployWithVolumeTests.cs, tests/Aspire.Cli.EndToEnd.Tests/DockerDeploymentTests.cs, tests/Aspire.Cli.EndToEnd.Tests/KubernetesDeployTypeScriptWithPersistentVolumeTests.cs, tests/Aspire.Cli.EndToEnd.Tests/KubernetesDeployWithProjectPersistentVolumeTests.cs
• affected project Aspire.Hosting.Azure.Kubernetes
polyglot affected project Aspire.Hosting.CodeGeneration.Python
typescript-api-compat affected project Aspire.Hosting.Azure.Kubernetes
typescript-sdk affected project Aspire.Hosting.CodeGeneration.TypeScript

Selection computed for commit db56463.

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.

Review details

  • Files reviewed: 59/59 changed files
  • Comments generated: 1
  • Review effort level: Balanced

Comment on lines +40 to +45
public static IResourceBuilder<T> WithVolume<T>(
this IResourceBuilder<T> builder,
string name,
string target,
string env,
bool isReadOnly = false)
@github-actions

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.

@github-actions

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.

@github-actions

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.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants