Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions .github/workflows/dotnet-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: .NET build and tests
on:
push:
branches: [main]
paths: ['**/*.cs', '**/*.csproj', '**/*.props', '**/*.json', '**/*.sln*', '.github/workflows/dotnet-build.yml']
pull_request:
branches: [main]
permissions:
contents: read
jobs:
build-and-test:
runs-on: ubuntu-latest
timeout-minutes: 25
env:
DOTNET_CLI_TELEMETRY_OPTOUT: '1'
DOTNET_NOLOGO: '1'
steps:
- uses: actions/checkout@v7
with:
persist-credentials: false
- uses: actions/setup-dotnet@v6
with:
global-json-file: global.json
- name: Trust this disposable runner's local development HTTPS certificate
run: |
export SSL_CERT_DIR="$HOME/.aspnet/dev-certs/trust:${SSL_CERT_DIR:-/usr/lib/ssl/certs}"
echo "SSL_CERT_DIR=$SSL_CERT_DIR" >> "$GITHUB_ENV"
dotnet dev-certs https --trust
dotnet dev-certs https --check --trust
- run: dotnet restore dotnet-configuration-in-depth.slnx
- run: dotnet build dotnet-configuration-in-depth.slnx --no-restore --configuration Release -m:2
- name: Configuration unit tests
run: dotnet test 26-configuration-testing/ConfigurationTesting.csproj --no-build --no-restore --configuration Release
- name: Integration tests (including the unchanged timing assertion)
run: dotnet test 27-integration-testing/IntegrationTesting.csproj --no-build --no-restore --configuration Release
- name: Aspire integration tests on the disposable runner's Docker daemon
run: dotnet 28-aspire/AspireSample.Tests/bin/Release/net10.0/AspireSample.Tests.dll --timeout 180s --no-ansi --no-progress
2 changes: 2 additions & 0 deletions 02-generic-host/GenericHost.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" VersionOverride="10.0.12" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" />
<PackageReference Include="Microsoft.Extensions.Hosting" />
</ItemGroup>

Expand Down
2 changes: 2 additions & 0 deletions 12-configuration-precedence/ConfigurationPrecedence.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" />
<PackageReference Include="Microsoft.Extensions.Hosting" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" />
Expand Down
2 changes: 2 additions & 0 deletions 13-dependency-injection/DependencyInjection.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" />
<PackageReference Include="Microsoft.Extensions.Hosting" />
</ItemGroup>

Expand Down
2 changes: 2 additions & 0 deletions 14-array-object-access/ArrayObjectAccess.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" />
<PackageReference Include="Microsoft.Extensions.Hosting" />
</ItemGroup>

Expand Down
2 changes: 2 additions & 0 deletions 15-collections-binding/CollectionsBinding.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" />
<PackageReference Include="Microsoft.Extensions.Hosting" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" />
Expand Down
2 changes: 2 additions & 0 deletions 16-environment-configs/EnvironmentConfigs.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" />
<PackageReference Include="Microsoft.Extensions.Hosting" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" />
Expand Down
1 change: 1 addition & 0 deletions 22-azure-app-configuration/AzureAppConfiguration.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Azure.Identity" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" />
<PackageReference Include="Microsoft.Azure.AppConfiguration.AspNetCore" />
<PackageReference Include="Microsoft.Extensions.Configuration.AzureAppConfiguration" />
Expand Down
2 changes: 2 additions & 0 deletions 24-configuration-reload/ConfigurationReload.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" />
<PackageReference Include="Microsoft.Extensions.Hosting" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" />
Expand Down
2 changes: 2 additions & 0 deletions 25-logging-reload/LoggingReload.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" />
<PackageReference Include="Microsoft.Extensions.Hosting" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" />
</ItemGroup>
Expand Down
1 change: 1 addition & 0 deletions 26-configuration-testing/ConfigurationTesting.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" />
<PackageReference Include="Microsoft.Extensions.Configuration" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" />
<PackageReference Include="Microsoft.Extensions.Hosting" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,10 @@ public async Task ApiData_ShouldRun_FasterWithTestConfiguration()
{
// Arrange
var client = _factory.CreateClient();
// Exercise the real endpoint once before measuring configured request delay.
// Cold-start routing/JIT costs vary by runner and are not the setting under test.
using var warmup = await client.GetAsync("/api/data");
warmup.EnsureSuccessStatusCode();
var stopwatch = System.Diagnostics.Stopwatch.StartNew();

// Act
Expand Down
4 changes: 3 additions & 1 deletion 28-aspire/AspireSample.AppHost/AspireSample.AppHost.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Aspire.AppHost.Sdk/13.2.2">
<Project Sdk="Aspire.AppHost.Sdk/13.4.6">

<PropertyGroup>
<OutputType>Exe</OutputType>
Expand All @@ -15,6 +15,8 @@

<ItemGroup>
<PackageReference Include="Aspire.Hosting.Redis" />
<PackageReference Include="Microsoft.Extensions.Configuration" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" />
</ItemGroup>

</Project>
30 changes: 15 additions & 15 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -15,24 +15,24 @@
<PackageVersion Include="Microsoft.Extensions.Configuration.AzureAppConfiguration" Version="8.5.0" />
<PackageVersion Include="Microsoft.FeatureManagement.AspNetCore" Version="4.4.0" />
<!-- Microsoft.Extensions packages -->
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="10.0.10" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.10" />
<PackageVersion Include="Microsoft.Extensions.Configuration.CommandLine" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="10.0.10" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Configuration.KeyPerFile" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="10.0.12" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.12" />
<PackageVersion Include="Microsoft.Extensions.Configuration.CommandLine" Version="10.0.12" />
<PackageVersion Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="10.0.12" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="10.0.12" />
<PackageVersion Include="Microsoft.Extensions.Configuration.KeyPerFile" Version="10.0.12" />
<PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="10.0.12" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.12" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="10.0.12" />
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="10.4.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="10.0.10" />
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="10.0.10" />
<PackageVersion Include="Microsoft.Extensions.Options.DataAnnotations" Version="10.0.5" />
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="10.0.12" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="10.0.12" />
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="10.0.12" />
<PackageVersion Include="Microsoft.Extensions.Options.DataAnnotations" Version="10.0.12" />
<PackageVersion Include="Microsoft.Extensions.ServiceDiscovery" Version="10.4.0" />
<!-- ASP.NET Core packages -->
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.5" />
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="10.0.10" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.12" />
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="10.0.12" />
<!-- OpenTelemetry packages -->
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.15.2" />
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.15.2" />
Expand Down
10 changes: 10 additions & 0 deletions docs/runtime-validation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Stable .NET runtime validation

All 32 sample projects target .NET 10. `global.json` selects SDK 10.0.401; core Microsoft.Extensions and ASP.NET Core packages are aligned to the 10.0.12 servicing release. The previous Azure.Identity and Aspire SDK alignment fixes are preserved.

The new `.NET build and tests` workflow restores and compiles the full solution, runs the configuration unit tests and integration tests, then executes the native Aspire test runner against Docker on the disposable GitHub-hosted VM. It has read-only repository permissions, no persisted checkout credentials, and no cloud credentials or deployment steps.

The integration test keeps its strict 200 ms assertion. It first warms the real endpoint to exclude variable routing/JIT cold-start overhead from the configured-delay measurement. A validation-only negative control with the default 300 ms delay must still fail that same assertion. Container tests never require a personal machine or Gateway Docker socket. Azure deployment and secret configuration are outside this build workflow.

The CI runner generates/trusts its own local development HTTPS certificate before Aspire starts and checks that trust explicitly. TLS certificate validation remains enabled. No certificate or trust store on the Gateway, a personal machine, or a cloud service is changed.
The SDK-required OpenSSL development trust directory is included in `SSL_CERT_DIR` alongside the existing system roots for this CI job only.
7 changes: 7 additions & 0 deletions global.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"sdk": {
"version": "10.0.401",
"rollForward": "latestPatch",
"allowPrerelease": false
}
}
Loading