Add ACA deployment E2E tests for custom and existing ACR#14510
Add ACA deployment E2E tests for custom and existing ACR#14510mitchdenny merged 4 commits intorelease/13.2from
Conversation
Add two new deployment E2E tests: - AcaCustomRegistryDeploymentTests: Deploys a starter app to ACA using AddAzureContainerRegistry + WithAzureContainerRegistry to create and attach a custom registry instead of relying on the default ACR. - AcaExistingRegistryDeploymentTests: Pre-creates an ACR via az CLI, then deploys a starter app to ACA referencing the existing ACR via AsExisting() with parameters. Both tests follow the established AcaStarterDeploymentTests pattern with Hex1b terminal automation, endpoint verification, and cleanup. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 14510Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 14510" |
There was a problem hiding this comment.
Pull request overview
This PR adds two new E2E deployment tests that validate Azure Container Apps deployments with explicit Azure Container Registry configuration, exercising different ACR provisioning patterns.
Changes:
- Added
AcaCustomRegistryDeploymentTeststo test ACA deployment with a custom ACR created viaAddAzureContainerRegistryandWithAzureContainerRegistryAPIs - Added
AcaExistingRegistryDeploymentTeststo test ACA deployment with a pre-existing ACR referenced viaAsExistingAPI - Both tests follow the established E2E test pattern with step-by-step terminal automation, deployment verification, and resource cleanup
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| tests/Aspire.Deployment.EndToEnd.Tests/AcaCustomRegistryDeploymentTests.cs | New E2E test class that validates ACA deployment with custom ACR creation using AddAzureContainerRegistry and WithAzureContainerRegistry APIs |
| tests/Aspire.Deployment.EndToEnd.Tests/AcaExistingRegistryDeploymentTests.cs | New E2E test class that validates ACA deployment with pre-existing ACR using AsExisting API, including ACR pre-creation via az CLI |
| /// <summary> | ||
| /// Triggers cleanup of a specific resource group. | ||
| /// This is fire-and-forget - the hourly cleanup workflow handles any missed resources. | ||
| /// </summary> | ||
| private static void TriggerCleanupResourceGroup(string resourceGroupName, ITestOutputHelper output) | ||
| { | ||
| var process = new System.Diagnostics.Process | ||
| { | ||
| StartInfo = new System.Diagnostics.ProcessStartInfo | ||
| { | ||
| FileName = "az", | ||
| Arguments = $"group delete --name {resourceGroupName} --yes --no-wait", | ||
| RedirectStandardOutput = true, | ||
| RedirectStandardError = true, | ||
| UseShellExecute = false, | ||
| CreateNoWindow = true | ||
| } | ||
| }; | ||
|
|
||
| try | ||
| { | ||
| process.Start(); | ||
| output.WriteLine($"Cleanup triggered for resource group: {resourceGroupName}"); | ||
| } | ||
| catch (Exception ex) | ||
| { | ||
| output.WriteLine($"Failed to trigger cleanup: {ex.Message}"); | ||
| } | ||
| } |
There was a problem hiding this comment.
The TriggerCleanupResourceGroup method is duplicated across multiple test files (at least 10 test classes have identical implementations). Consider extracting this to a shared helper class (e.g., DeploymentE2ETestHelpers or a new ResourceGroupCleanupHelper) to improve maintainability and reduce code duplication.
| var process = new System.Diagnostics.Process | ||
| { | ||
| StartInfo = new System.Diagnostics.ProcessStartInfo | ||
| { | ||
| FileName = "az", | ||
| Arguments = $"group delete --name {resourceGroupName} --yes --no-wait", | ||
| RedirectStandardOutput = true, | ||
| RedirectStandardError = true, | ||
| UseShellExecute = false, | ||
| CreateNoWindow = true | ||
| } | ||
| }; | ||
|
|
||
| try | ||
| { | ||
| process.Start(); | ||
| output.WriteLine($"Cleanup triggered for resource group: {resourceGroupName}"); | ||
| } | ||
| catch (Exception ex) | ||
| { | ||
| output.WriteLine($"Failed to trigger cleanup: {ex.Message}"); | ||
| } |
There was a problem hiding this comment.
The TriggerCleanupResourceGroup method is duplicated across multiple test files (at least 10 test classes have identical implementations). Consider extracting this to a shared helper class (e.g., DeploymentE2ETestHelpers or a new ResourceGroupCleanupHelper) to improve maintainability and reduce code duplication.
| var process = new System.Diagnostics.Process | |
| { | |
| StartInfo = new System.Diagnostics.ProcessStartInfo | |
| { | |
| FileName = "az", | |
| Arguments = $"group delete --name {resourceGroupName} --yes --no-wait", | |
| RedirectStandardOutput = true, | |
| RedirectStandardError = true, | |
| UseShellExecute = false, | |
| CreateNoWindow = true | |
| } | |
| }; | |
| try | |
| { | |
| process.Start(); | |
| output.WriteLine($"Cleanup triggered for resource group: {resourceGroupName}"); | |
| } | |
| catch (Exception ex) | |
| { | |
| output.WriteLine($"Failed to trigger cleanup: {ex.Message}"); | |
| } | |
| DeploymentE2ETestHelpers.TriggerCleanupResourceGroup(resourceGroupName, output); |
|
/deployment-test |
|
🚀 Deployment tests starting on PR #14510... This will deploy to real Azure infrastructure. Results will be posted here when complete. |
🎬 CLI E2E Test RecordingsThe following terminal recordings are available for commit
📹 Recordings uploaded automatically from CI run #22051649689 |
|
✅ Deployment E2E Tests passed Summary: 21 passed, 0 failed, 0 cancelled Passed Tests
🎬 Terminal Recordings
|
The comment said 'only for failed tests' but the code uploads recordings for all tests regardless of pass/fail status. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
| var replacement = """ | ||
| // Reference existing Azure Container Registry via parameter | ||
| var acrName = builder.AddParameter("acrName"); | ||
| var acr = builder.AddAzureContainerRegistry("existingacr").AsExisting(acrName, null); |
There was a problem hiding this comment.
Why is this not passing in the resource group?
| sequenceBuilder.Type("aspire new") | ||
| .Enter() | ||
| .WaitUntil(s => waitingForTemplateSelectionPrompt.Search(s).Count > 0, TimeSpan.FromSeconds(60)) | ||
| .Enter() // Select first template (Starter App ASP.NET Core/Blazor) | ||
| .WaitUntil(s => waitingForProjectNamePrompt.Search(s).Count > 0, TimeSpan.FromSeconds(30)) | ||
| .Type(projectName) | ||
| .Enter() | ||
| .WaitUntil(s => waitingForOutputPathPrompt.Search(s).Count > 0, TimeSpan.FromSeconds(10)) | ||
| .Enter() // Accept default output path | ||
| .WaitUntil(s => waitingForUrlsPrompt.Search(s).Count > 0, TimeSpan.FromSeconds(10)) | ||
| .Enter() // Select "No" for localhost URLs (default) | ||
| .WaitUntil(s => waitingForRedisPrompt.Search(s).Count > 0, TimeSpan.FromSeconds(10)) | ||
| // For Redis prompt, default is "Yes" so we need to select "No" by pressing Down | ||
| .Key(Hex1b.Input.Hex1bKey.DownArrow) | ||
| .Enter() // Select "No" for Redis Cache | ||
| .WaitUntil(s => waitingForTestPrompt.Search(s).Count > 0, TimeSpan.FromSeconds(10)) | ||
| .Enter() // Select "No" for test project (default) | ||
| .WaitForSuccessPrompt(counter, TimeSpan.FromMinutes(5)); |
There was a problem hiding this comment.
Can't we specify all these options on the single command line? that way we don't have to be so fragile if we change any of this flow, or add a new option.
| // Step 6: Add Aspire.Hosting.Azure.ContainerRegistry package | ||
| output.WriteLine("Step 6: Adding Azure Container Registry hosting package..."); | ||
| sequenceBuilder.Type("aspire add Aspire.Hosting.Azure.ContainerRegistry") | ||
| .Enter(); | ||
|
|
There was a problem hiding this comment.
This isn't necessary since Aspire.Hosting.Azure.AppContainers already references it.
| .WaitForSuccessPrompt(counter); | ||
|
|
||
| // Step 9: Set environment variables for deployment | ||
| sequenceBuilder.Type($"unset ASPIRE_PLAYGROUND && export AZURE__LOCATION=westus3 && export AZURE__RESOURCEGROUP={resourceGroupName}") |
There was a problem hiding this comment.
Formatting this line like we did in the other test would make it more readable
// Step 10: Set environment variables for deployment including ACR parameter
sequenceBuilder.Type(
$"unset ASPIRE_PLAYGROUND && " +
$"export AZURE__LOCATION=westus3 && " +
$"export AZURE__RESOURCEGROUP={resourceGroupName}")
.Enter()
.WaitForSuccessPrompt(counter);
| .Type($"RG_NAME=\"{resourceGroupName}\" && " + | ||
| "echo \"Resource group: $RG_NAME\" && " + | ||
| "if ! az group show -n \"$RG_NAME\" &>/dev/null; then echo \"❌ Resource group not found\"; exit 1; fi && " + | ||
| // Get external endpoints only (exclude .internal. which are not publicly accessible) | ||
| "urls=$(az containerapp list -g \"$RG_NAME\" --query \"[].properties.configuration.ingress.fqdn\" -o tsv 2>/dev/null | grep -v '\\.internal\\.') && " + | ||
| "if [ -z \"$urls\" ]; then echo \"❌ No external container app endpoints found\"; exit 1; fi && " + | ||
| "failed=0 && " + | ||
| "for url in $urls; do " + | ||
| "echo \"Checking https://$url...\"; " + | ||
| "success=0; " + | ||
| "for i in $(seq 1 18); do " + | ||
| "STATUS=$(curl -s -o /dev/null -w \"%{http_code}\" \"https://$url\" --max-time 10 2>/dev/null); " + | ||
| "if [ \"$STATUS\" = \"200\" ] || [ \"$STATUS\" = \"302\" ]; then echo \" ✅ $STATUS (attempt $i)\"; success=1; break; fi; " + | ||
| "echo \" Attempt $i: $STATUS, retrying in 10s...\"; sleep 10; " + | ||
| "done; " + | ||
| "if [ \"$success\" -eq 0 ]; then echo \" ❌ Failed after 18 attempts\"; failed=1; fi; " + | ||
| "done && " + | ||
| "if [ \"$failed\" -ne 0 ]; then echo \"❌ One or more endpoint checks failed\"; exit 1; fi") |
There was a problem hiding this comment.
this isn't really that readable.
One thought would be to use """ raw strings.
Honestly, writing some C# code to do this (in a helper method) would be much easier to read / maintain.
* Fix CopilotCliRunner version parsing for 'GitHub Copilot CLI X.X.X' format (#14568) * Fix CopilotCliRunner version parsing for 'GitHub Copilot CLI X.X.X' format Extract version parsing into a testable TryParseVersionOutput method that handles prefixed version strings like 'GitHub Copilot CLI 0.0.397' by taking the last space-separated token before parsing. Fixes #14174 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address PR feedback: handle trailing punctuation in version string Trim trailing period and other punctuation before parsing, to handle output like 'GitHub Copilot CLI 0.0.397.' from the issue report. Add test case for the trailing period format. 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> * Suppress update notification when running with --detach (#14571) * Suppress update notification when running with --detach When running 'aspire run --detach', the parent process no longer displays the update notification message before exiting. The update check is not useful in detach mode since the parent exits immediately after spawning the child process. Fixes part of #14238 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add unit tests for update notification suppression in detach mode Validates that the update notification is not shown when --detach is used, and that it is shown for normal (non-detach) runs. Uses a tracking ICliUpdateNotifier to verify the behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Move TestCliUpdateNotifier to shared TestServices folder Consolidate duplicate ICliUpdateNotifier test implementations from RunCommandTests and UpdateCommandTests into a single shared TestCliUpdateNotifier in TestServices, combining tracking and callback capabilities. 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 ACA deployment E2E tests for custom and existing ACR (#14510) * Add ACA deployment E2E tests for custom and existing ACR Add two new deployment E2E tests: - AcaCustomRegistryDeploymentTests: Deploys a starter app to ACA using AddAzureContainerRegistry + WithAzureContainerRegistry to create and attach a custom registry instead of relying on the default ACR. - AcaExistingRegistryDeploymentTests: Pre-creates an ACR via az CLI, then deploys a starter app to ACA referencing the existing ACR via AsExisting() with parameters. Both tests follow the established AcaStarterDeploymentTests pattern with Hex1b terminal automation, endpoint verification, and cleanup. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix deployment test failures - Custom Registry: Increase deploy wait to 35 min, detect PIPELINE FAILED to fail fast instead of timing out, bump test timeout to 45 min - Existing Registry: Use null for resourceGroup param in AsExisting() since ACR is in the same resource group as the deployment, avoiding cross-RG Bicep scope that caused compilation errors. Add same pipeline failure detection. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Verify container images exist in ACR after deployment Replace simple ACR existence checks with comprehensive image verification: - Discover the ACR name in the resource group - List all repositories in the ACR - Verify each repository has at least one tagged image - Fail the test if no images are found This ensures the deployment actually pushed container images to the custom/existing registry, not just that the ACR resource exists. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix misleading comment: recordings are uploaded for all tests The comment said 'only for failed tests' but the code uploads recordings for all tests regardless of pass/fail status. 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> * Fix NU1009 error for CPM projects during aspire update (#14585) * Fix NU1009 error for CPM projects during aspire update When a project uses Central Package Management (CPM) and has a PackageVersion entry for Aspire.Hosting.AppHost in Directory.Packages.props, running 'aspire update' would leave the PackageVersion orphaned after removing the PackageReference from the csproj. The new SDK format adds an implicit PackageReference with IsImplicitlyDefined=true, and NuGet rejects PackageVersion entries for implicitly-defined packages (NU1009). The fix removes the orphaned PackageVersion entry from Directory.Packages.props during the SDK migration in aspire update. Fixes #14550 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Handle NuGet.config prompts in CPM e2e test The aspire update flow prompts for NuGet.config directory and confirmation when the project doesn't have an existing NuGet.config. The test now handles both prompts by accepting the defaults. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Update external NuGet dependencies to latest versions (#14549) * Update external NuGet dependencies and enhance dependency update skill Update 38 external dependencies to their latest versions: - Confluent.Kafka 2.12.0 -> 2.13.0 - Google.Protobuf 3.33.0 -> 3.33.5 - Grpc.AspNetCore/ClientFactory 2.71.0 -> 2.76.0 - Grpc.Tools 2.72.0 -> 2.78.0 - Hex1b/McpServer/Tool 0.78.0 -> 0.90.0 - Humanizer.Core 2.14.1 -> 3.0.1 - JsonPatch.Net 3.3.0 -> 5.0.0 - KubernetesClient 18.0.5 -> 18.0.13 - Markdig 0.43.0 -> 0.45.0 - Microsoft.Data.SqlClient 6.1.2 -> 6.1.4 - Microsoft.DevTunnels.Connections 1.3.6 -> 1.3.12 - Microsoft.FluentUI.AspNetCore.Components 4.13.2 -> 4.14.0 - ModelContextProtocol 0.4.0-preview.3 -> 0.8.0-preview.1 - MongoDB.Driver 3.5.0 -> 3.6.0 - MongoDB.Driver.Core.Extensions.DiagnosticSources 2.1.0 -> 3.0.0 - MySqlConnector.DependencyInjection 2.4.0 -> 2.5.0 - NATS.Net 2.6.11 -> 2.7.2 - Npgsql.DependencyInjection/OpenTelemetry 10.0.0 -> 10.0.1 - OpenAI 2.7.0 -> 2.8.0 - OpenTelemetry.Exporter.Console/InMemory 1.14.0 -> 1.15.0 - OpenTelemetry.Instrumentation.GrpcNetClient 1.14.0-beta.1 -> 1.15.0-beta.1 - Oracle.ManagedDataAccess.OpenTelemetry 23.26.0 -> 23.26.100 - Polly.Core/Extensions 8.6.4 -> 8.6.5 - Pomelo.EntityFrameworkCore.MySql 8.0.3 -> 9.0.0 - Qdrant.Client 1.15.1 -> 1.16.1 - RabbitMQ.Client 7.1.2 -> 7.2.0 - Spectre.Console 0.52.1-preview.0.5 -> 0.54.1-alpha.0.37 - StackExchange.Redis 2.9.32 -> 2.11.0 - StreamJsonRpc 2.22.23 -> 2.24.84 - System.IO.Hashing 9.0.10 -> 10.0.3 Move Microsoft.Extensions.Caching.Memory to the common section (no longer TFM-conditional) to support Pomelo 9.0.0's transitive dependency on it. Also enhance the dependency-update skill with: - Bulk update workflow (update-then-verify-then-mirror) - Transitive pinning conflict guidance (NU1109) - Broken transitive dep metadata guidance (NU1603) - Known special-handling packages - Azure CLI fallback for Windows (az.cmd) - Hex1b.Tool added to package family list Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix build errors from dependency updates - MCP SDK 0.8.0: Convert IDictionary to Dictionary for IReadOnlyDictionary compatibility in AgentMcpCommand.cs, suppress MCPEXP001 experimental warning - Humanizer 3.0: Fully qualify Resources references in ResourceDetails.razor to avoid ambiguity with Humanizer.Resources namespace - MySqlConnector 2.5.0: Migrate from obsolete MySqlConnectorLogManager.Provider to DbContextOptionsBuilder.UseLoggerFactory(), remove unused MySqlConnector.Logging.Microsoft.Extensions.Logging package reference - RabbitMQ.Client 7.2.0: Suppress SYSLIB0026/0027/0028 warnings from source-generated configuration binder code touching obsolete X509Certificate2 APIs, regenerate ConfigurationSchema.json - FluentUI 4.14.0: Implement new IMessageService.ShowMessageBar/Async MarkupString overloads in test mock - Revert OpenAI to 2.7.0 (needs coordinated update with Microsoft.Extensions.AI.OpenAI) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix test failures from dependency updates - Revert JsonPatch.Net to 3.3.0: Updating to 5.0.0 caused TypeLoadException due to incompatible JsonPointer.Net value type change vs pinned JsonSchema.Net 7.4.0. Both packages need to be updated together in a separate PR. - Update Microsoft.Azure.StackExchangeRedis 3.2.1 -> 3.3.1 and Microsoft.Extensions.Azure 1.13.0 -> 1.13.1: Required for StackExchange.Redis 2.11.0 compatibility. The AMR refactor split Azure auth into AzureManagedRedisOptionsProvider; updated tests to check for the new type instead of IAzureCacheTokenEvents. - Revert Pomelo MySqlConnector logging to MySqlConnectorLogManager.Provider with #pragma CS0618 suppression: UseLoggerFactory only configures EF Core logging, not MySqlConnector's internal categories (ConnectionPool, etc.). There is no non-obsolete alternative when using Pomelo without MySqlDataSource. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Exclude incompatible analyzers from transitive flow to consuming projects Humanizer.Core 3.x and StreamJsonRpc 2.24.x ship Roslyn analyzers that are incompatible with older SDK versions (net8): - Humanizer.Analyzers requires System.Collections.Immutable 9.0.0 (CS8032) - StreamJsonRpc.Analyzers targets Roslyn 4.14.0 (CS9057) These analyzers flow transitively to template projects, causing build failures when template tests verify backward compatibility with older SDKs. Add PrivateAssets="analyzers" to prevent these analyzers from flowing to consuming projects while keeping them available for our own builds. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Revert Humanizer.Core and StreamJsonRpc to previous versions Humanizer.Core 3.0.1 and StreamJsonRpc 2.24.84 ship Roslyn analyzers that are incompatible with older SDKs (net8) used by template tests: - Humanizer.Analyzers requires System.Collections.Immutable 9.0.0 (CS8032) - StreamJsonRpc.Analyzers targets Roslyn 4.14.0 (CS9057) PrivateAssets="analyzers" does not prevent these from flowing to template projects since the analyzers are resolved from the NuGet package cache at build time. Reverting to compatible versions: - Humanizer.Core: 3.0.1 -> 2.14.1 - StreamJsonRpc: 2.24.84 -> 2.22.23 Also reverts the Humanizer namespace ambiguity fix in ResourceDetails.razor since 2.14.1 does not introduce the Humanizer.Resources collision. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Revert Spectre.Console to 0.52.1-preview.0.5 Spectre.Console 0.54.1-alpha.0.37 changed hyperlink rendering behavior: the [link=url] markup no longer emits ANSI OSC 8 hyperlink escape sequences in the same way, breaking the ConsoleActivityLoggerTests that verify clickable link rendering. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix up RabbitMQ * Fix Azure Redis break from StackExchange/StackExchange.Redis#2986 The Azure Managed Redis endpoints were split out into another class, so we need to check both classes. * Alphabetize Caching.Memory and update remaining OTel packages to 1.15.0 - Move Microsoft.Extensions.Caching.Memory to alphabetical position in the common section of Directory.Packages.props - Update OpenTelemetry version properties in eng/Versions.props: - Instrumentation.AspNetCore: 1.14.0 -> 1.15.0 - Instrumentation.Http: 1.14.0 -> 1.15.0 - Extensions.Hosting: 1.14.0 -> 1.15.0 - Instrumentation.Runtime: 1.14.0 -> 1.15.0 - Exporter.OpenTelemetryProtocol: 1.14.0 -> 1.15.0 - Azure.Monitor.OpenTelemetry.Exporter: 1.5.0 -> 1.6.0 - Regenerate Aspire.Seq ConfigurationSchema.json for OTel changes Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Revert Azure.Monitor.OpenTelemetry.Exporter update due to AOT warning * Update dependency skill to document OTel packages in eng/Versions.props - Document that OTel packages are split across Directory.Packages.props (hardcoded versions) and eng/Versions.props (MSBuild properties), and both must be updated together to keep OTel in sync - Add guidance to check eng/Versions.props when identifying packages - Add Humanizer.Core, StreamJsonRpc, and Azure.Monitor.OpenTelemetry.Exporter to the special handling section with upstream issue links Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com> * Update container image tags to latest versions (#14555) * Update container image tags to latest versions Update 17 Docker container image tags across 12 hosting integrations: - EventHubs Emulator: 2.1.0 → 2.2.0 - ServiceBus SQL Server: 2022-latest → 2025-latest - Kafka (Confluent): 8.1.0 → 8.1.1 - Kafka UI: v1.3.0 → v1.4.2 - Keycloak: 26.4 → 26.5 - Milvus: v2.5.17 → v2.5.27 - MySQL: 9.5 → 9.6 - Oracle: 23.26.0.0 → 23.26.1.0 - Postgres: 17.6 → 18.2 - pgAdmin: 9.9.0 → 9.12.0 - pgWeb: 0.16.2 → 0.17.0 - Qdrant: v1.15.5 → v1.16.3 - Redis: 8.2 → 8.6 - RedisInsight: 2.70 → 3.0 - SQL Server: 2022-latest → 2025-latest - YARP: 2.3.0-preview.4 → 2.3.0-preview.5 Also adds an agent skill (.github/skills/update-container-images/) with a companion C# script to automate future container image tag updates. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix test snapshots and Postgres test assumptions for updated image tags - Update 5 YARP snapshot files: 2.3.0-preview.4 → 2.3.0-preview.5 - Update aspire-manifest.json: 2022-latest → 2025-latest - Fix Postgres v17 data path tests to explicitly set v17 image tag since the default image is now v18 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix hardcoded YARP tag in Dockerfile assertion test Update Assert.Contains for YARP image tag: 2.3.0-preview.4 → 2.3.0-preview.5 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address PR feedback: revert SQL Server, Postgres, and use rolling YARP tag - Revert SQL Server back to 2022-latest (Mac ARM incompatibility) - Revert Postgres back to 17.6 (data checksums concern, will do separately) - Change YARP to rolling tag 2.3-preview instead of pinned 2.3.0-preview.5 - Update all affected test snapshots and assertions Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Document stdout/stderr conventions in UpdateImageTags.cs Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Mitch Denny <midenn@microsoft.com> Co-authored-by: Mitch Denny <mitch@mitchdeny.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Jose Perez Rodriguez <joperezr@microsoft.com> Co-authored-by: Eric Erhardt <eric.erhardt@microsoft.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Summary
Add two new deployment E2E tests that validate Azure Container Apps deployments with explicit Azure Container Registry configuration.
New Tests
AcaCustomRegistryDeploymentTests — Tests deploying a starter app to ACA using
AddAzureContainerRegistry+WithAzureContainerRegistryto create and attach a custom registry, instead of relying on the default ACR created byAddAzureContainerAppEnvironment.AcaExistingRegistryDeploymentTests — Tests deploying a starter app to ACA using a pre-existing ACR. The test pre-creates an ACR via
az acr create, then references it in the AppHost viaAsExisting()with parameters passed through environment variables.Test Flow
Both tests follow the established
AcaStarterDeploymentTestspattern:aspire newAspire.Hosting.Azure.AppContainersandAspire.Hosting.Azure.ContainerRegistrypackagesaspire deploy --clear-cacheKey APIs Exercised
AddAzureContainerRegistry("myacr")— custom registry creationWithAzureContainerRegistry(acr)— attach registry to ACA environmentAsExisting(nameParam, rgParam)— reference pre-existing ACR