Skip to content

Upgrade DMT to .NET 10 LTS - #261

Merged
Mark Brown (markjbrown) merged 5 commits into
mainfrom
markjbrown-net-10-upgrade
Oct 31, 2026
Merged

Mark Brown (markjbrown) merged 5 commits into
mainfrom
markjbrown-net-10-upgrade

Conversation

@markjbrown

Copy link
Copy Markdown
Collaborator

Summary

Relates to #258. Do not close that issue on merge: approved publication and rollout verification remain separate completion criteria.

  • Retarget all 26 projects and 11 publish profiles to net10.0; pin stable SDK 10.0.403 and bundled runtime 10.0.14.
  • Align build/test/emulator/release workflows, retained tool-packaging paths and Docker images with .NET 10; explicitly use Ubuntu 24.04 noble images and preserve full-SHA action pins.
  • Resolve the Cosmos Encryption constraint mismatch with Encryption 2.0.5 / Cosmos SDK 3.51.0. Align Microsoft.Extensions/MEF packages and asynchronous LINQ compatibility; remove obsolete explicit System.Text.Json references.
  • Preserve JSON diagnostics, retry/partition-key and HTTP-client lifetime regressions. Use offline credentials in the three merged multi-account RBAC constructor tests and migrate certificate loading without losing existing diagnostics.
  • Include the previously omitted Parquet tests and correct Parquet/PostgreSQL source-build publish profiles.
  • Add six native OS/architecture package smoke jobs and a non-publishing Docker smoke job. Verify embedded runtime metadata, all 15 bundled sources/sinks and synthetic JSON round trips.
  • Update source-build, macOS, extension-authoring, SQL walkthrough, compatibility and servicing documentation. Existing release payloads remain unchanged; optional Legacy/Vector Mongo extensions are not newly bundled.

Validation

The following completed on head 8e60578 before opening this PR:

Validation Result
Full .NET suite 1,353 passed, 0 failed, 9 skipped across ten projects. Skips are seven unconfigured Cosmos cases, one unconfigured live SQL case and the existing empty-current-culture case.
Windows Cosmos emulator 293 passed; no failures or skips. All seven integration cases executed.
Linux Cosmos emulators and guards Stable: 293 passed, no skips. vNext: 291 passed, only the two existing named conformance exclusions. Strict TRX assertions and negative guards passed.
Packages, native execution and Docker All six packages, all six native Windows/Linux/macOS x64/ARM64 smoke jobs and the Docker mounted-data migration passed.

Downloaded TRX results were inspected and independently checked with the repository guards. Local Windows suite: 1,354 passed, eight unconfigured integration skips. Published Windows discovery/migration and isolated matching-version Legacy/Vector Mongo discovery also passed. No live developer Azure credentials were used.

Outstanding risks and rollout gates

These are not silently accepted or suppressed:

  • Production transitive advisories remain in SharpCompress 0.30.1 (GHSA-6c8g-7p36-r338, fixed in 0.48.0), Snappier 1.0.0/1.1.6 (GHSA-pggp-6c3x-2xmx, fixed in 1.3.1), and Pkcs 9.0.0 (high, medium; fixed in 9.0.21 or 10.0.13+). Pkcs changed from the baseline's affected 8.0.1 because SqlClient selects its net9 assets under net10; the other versions are unchanged. Focused remediation is possible without assuming a broad service-SDK rewrite.
  • Test-only SQLitePCLRaw.lib.e_sqlite3 2.1.10 remains affected by GHSA-2m69-gcr7-jv3q. SQLite must be at least 3.50.2; the advisory provides no fixed version for that legacy NuGet ID, and 2.1.11 is also affected.
  • Legacy Mongo retains NU1701. Discovery is not proof of live legacy-server behavior. Live SQL, enterprise proxy/RBAC negotiation and encrypted Cosmos/Key Vault validation require safe environments not supplied for this work.
  • Baseline CodeQL was green; this PR's normal CodeQL/review checks must complete. A passing stable Linux emulator run does not establish that its historical SQLPAL/408 instability is fixed.
  • Maintainers must decide dependency remediation/disposition, the DMT release version and publication approval, then verify actual published archives/image tags and communicate the upgrade. This PR does not publish artifacts or authorize release workflows.

Issue #258 artifact 1 contains the full implementation handoff, baseline dependency comparison and proposed servicing/release notes. docs/runtime-support.md records ongoing requirements.

Retarget all projects and profiles; align runtime packages, SDK and Ubuntu container pins. Resolve Cosmos Encryption constraints, preserve offline RBAC tests, and include Parquet tests in the solution. Add native six-RID and container smoke validation plus compatibility and servicing guidance.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Honor MSBuild platform-specific output paths in the shared action and verify the sidecar matches the actual executable bundle. Keep all six validation targets running for independent diagnostics.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Use the existing profile and configuration-specific net10.0 extension directory so contributor builds include PostgreSQL alongside the other extensions.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Set contents: read at workflow scope so package builds and native/container smoke jobs have an explicit least-privilege token, addressing both CodeQL review threads.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

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.

🟡 Changes recommended

The smoke-test comparisons can falsely pass changed records because they ignore case, coerce types, and do not require the nullable field, leaving serialization regressions undetected.

1 open issue
What changed in this PR

Upgrades DMT’s core, extensions, tests and packaging to .NET 10 LTS as the implementation portion of #258. Publication approval and rollout verification remain separate.

Changes:

  • Retargets projects and publish profiles, pins the SDK/runtime, and aligns dependencies.
  • Updates CI and Docker, adds native package/container smoke checks, and includes Parquet tests in the solution.
  • Preserves offline authentication testing, migrates certificate loading, and documents compatibility and servicing requirements.
File Description
resources/​json-to-sql/​README.md Adds runtime and source-build prerequisites.
README.md Updates installation, build and extension guidance.
Interfaces/​Cosmos.DataTransfer.Interfaces/​Cosmos.DataTransfer.Interfaces.csproj Targets shared interfaces to .NET 10.
Interfaces/​Cosmos.DataTransfer.Common/​Cosmos.DataTransfer.Common.csproj Targets shared utilities to .NET 10.
Interfaces/​Cosmos.DataTransfer.Common.UnitTests/​FileDataSourceTests.cs Adapts async LINQ and passes cancellation.
Interfaces/​Cosmos.DataTransfer.Common.UnitTests/​Cosmos.DataTransfer.Common.UnitTests.csproj Retargets common tests.
global.json Pins stable SDK selection.
Extensions/​SqlServer/​Cosmos.DataTransfer.SqlServerExtension/​Properties/​PublishProfiles/​PublishToExtensionsFolder.pubxml Updates publish targets and paths.
Extensions/​SqlServer/​Cosmos.DataTransfer.SqlServerExtension/​Cosmos.DataTransfer.SqlServerExtension.csproj Retargets SQL Server; removes explicit JSON dependency.
Extensions/​SqlServer/​Cosmos.DataTransfer.SqlServerExtension.UnitTests/​Cosmos.DataTransfer.SqlServerExtension.UnitTests.csproj Retargets SQL Server tests.
Extensions/​PostgreSQL/​Properties/​PublishProfiles/​FolderProfile.pubxml Updates framework and respects build configuration.
Extensions/​PostgreSQL/​Cosmos.DataTransfer.PostgresqlExtension.csproj Retargets PostgreSQL and corrects profile selection.
Extensions/​Parquet/​Cosmos.DataTransfer.ParquetExtension/​Properties/​PublishProfiles/​FolderProfile.pubxml Corrects configuration-aware publish settings.
Extensions/​Parquet/​Cosmos.DataTransfer.ParquetExtension/​Cosmos.DataTransfer.ParquetExtension.csproj Retargets Parquet and corrects profile selection.
Extensions/​Parquet/​Cosmos.DataTransfer.ParquetExtension.UnitTests/​Cosmos.DataTransfer.ParquetExtension.UnitTests.csproj Retargets Parquet tests.
Extensions/​Mongo/​Cosmos.DataTransfer.MongoVectorExtension/​Properties/​PublishProfiles/​PublishToExtensionsFolder.pubxml Updates publish targets and paths.
Extensions/​Mongo/​Cosmos.DataTransfer.MongoVectorExtension/​Cosmos.DataTransfer.MongoVectorExtension.csproj Retargets Vector; removes explicit JSON dependency.
Extensions/​Mongo/​Cosmos.DataTransfer.MongoLegacyExtension/​Properties/​PublishProfiles/​PublishToExtensionsFolder.pubxml Updates legacy publish framework and path.
Extensions/​Mongo/​Cosmos.DataTransfer.MongoLegacyExtension/​Cosmos.DataTransfer.MongoLegacyExtension.csproj Retargets legacy MongoDB.
Extensions/​Mongo/​Cosmos.DataTransfer.MongoExtension/​Properties/​PublishProfiles/​PublishToExtensionsFolder.pubxml Updates publish targets and paths.
Extensions/​Mongo/​Cosmos.DataTransfer.MongoExtension/​Cosmos.DataTransfer.MongoExtension.csproj Retargets MongoDB.
Extensions/​Mongo/​Cosmos.DataTransfer.MongoExtension.UnitTests/​Cosmos.DataTransfer.MongoExtension.UnitTests.csproj Retargets MongoDB tests.
Extensions/​Json/​Cosmos.DataTransfer.JsonExtension/​Properties/​PublishProfiles/​PublishToExtensionsFolder.pubxml Updates publish targets and paths.
Extensions/​Json/​Cosmos.DataTransfer.JsonExtension/​JsonFormatReader.cs Removes version-specific wording from a comment.
Extensions/​Json/​Cosmos.DataTransfer.JsonExtension/​JsonArrayReader.cs Updates serializer implementation comments.
Extensions/​Json/​Cosmos.DataTransfer.JsonExtension/​Cosmos.DataTransfer.JsonExtension.csproj Retargets JSON; removes explicit JSON dependency.
Extensions/​Json/​Cosmos.DataTransfer.JsonExtension.UnitTests/​Cosmos.DataTransfer.JsonExtension.UnitTests.csproj Retargets JSON tests.
Extensions/​Csv/​Cosmos.DataTransfer.CsvExtension/​Properties/​PublishProfiles/​PublishToExtensionsFolder.pubxml Updates publish targets and paths.
Extensions/​Csv/​Cosmos.DataTransfer.CsvExtension/​Cosmos.DataTransfer.CsvExtension.csproj Retargets CSV; removes explicit JSON dependency.
Extensions/​Csv/​Cosmos.DataTransfer.CsvExtension.UnitTests/​Cosmos.DataTransfer.CsvExtension.UnitTests.csproj Retargets CSV tests.
Extensions/​Cosmos/​README.md Makes delay-limit documentation version-neutral.
Extensions/​Cosmos/​Cosmos.DataTransfer.CosmosExtension/​Properties/​PublishProfiles/​PublishToExtensionsFolder.pubxml Updates publish targets and paths.
Extensions/​Cosmos/​Cosmos.DataTransfer.CosmosExtension/​CosmosExtensionServices.cs Migrates certificate loading and disposes rejected certificates.
Extensions/​Cosmos/​Cosmos.DataTransfer.CosmosExtension/​CosmosDataSinkExtension.cs Makes the delay-limit comment version-neutral.
Extensions/​Cosmos/​Cosmos.DataTransfer.CosmosExtension/​Cosmos.DataTransfer.CosmosExtension.csproj Retargets Cosmos; removes explicit JSON dependency.
Extensions/​Cosmos/​Cosmos.DataTransfer.CosmosExtension.UnitTests/​CosmosSinkSettingsTests.cs Adds partition-key configuration binding tests.
Extensions/​Cosmos/​Cosmos.DataTransfer.CosmosExtension.UnitTests/​CosmosMultiAccountSupportTests.cs Injects offline credentials into RBAC clients.
Extensions/​Cosmos/​Cosmos.DataTransfer.CosmosExtension.UnitTests/​CosmosHttpClientLifecycleTests.cs Migrates test certificate loading.
Extensions/​Cosmos/​Cosmos.DataTransfer.CosmosExtension.UnitTests/​Cosmos.DataTransfer.CosmosExtension.UnitTests.csproj Retargets Cosmos tests.
Extensions/​CognitiveSearch/​Cosmos.DataTransfer.CognitiveSearchExtension/​Properties/​PublishProfiles/​PublishToExtensionsFolder.pubxml Updates publish targets and paths.
Extensions/​CognitiveSearch/​Cosmos.DataTransfer.CognitiveSearchExtension/​Cosmos.DataTransfer.CognitiveSearchExtension.csproj Retargets search; removes explicit JSON dependency.
Extensions/​CognitiveSearch/​Cosmos.DataTransfer.CognitiveSearchExtension.UnitTests/​Cosmos.DataTransfer.CognitiveSearchExtension.UnitTests.csproj Retargets search tests and removes JSON reference.
Extensions/​AzureTableAPI/​Cosmos.DataTransfer.AzureTableAPIExtension/​Properties/​PublishProfiles/​PublishToExtensionsFolder.pubxml Updates publish targets and paths.
Extensions/​AzureTableAPI/​Cosmos.DataTransfer.AzureTableAPIExtension/​Cosmos.DataTransfer.AzureTableAPIExtension.csproj Retargets Azure Table; removes JSON reference.
Extensions/​AzureTableAPI/​Cosmos.DataTransfer.AzureTableAPIExtension.UnitTests/​Cosmos.DataTransfer.AzureTableAPIExtension.UnitTests.csproj Retargets Azure Table tests and removes JSON reference.
Extensions/​AzureBlob/​Cosmos.DataTransfer.AzureBlobStorage/​Cosmos.DataTransfer.AzureBlobStorage.csproj Retargets Blob storage and removes JSON reference.
Extensions/​AwsS3/​Cosmos.DataTransfer.AwsS3Storage/​Cosmos.DataTransfer.AwsS3Storage.csproj Retargets S3 storage.
docs/​runtime-support.md Documents platforms, compatibility, servicing and release gates.
Dockerfile Pins .NET 10 Noble images and retains runtime metadata.
Directory.Packages.props Aligns framework, Cosmos and async LINQ dependencies.
Directory.Build.props Pins the bundled runtime version.
CosmosDbDataMigrationTool.sln Includes Parquet tests in solution builds.
Core/​Cosmos.DataTransfer.Core/​Cosmos.DataTransfer.Core.csproj Retargets the host and removes JSON reference.
Core/​Cosmos.DataTransfer.Core.UnitTests/​Cosmos.DataTransfer.Core.UnitTests.csproj Retargets host tests and removes JSON reference.
Contributing.md Adds pinned-SDK and offline-test guidance.
.github/​workflows/​validate.yml Uses the pinned .NET 10 SDK image.
.github/​workflows/​release.yml Updates the release build SDK image.
.github/​workflows/​linux-cosmos-emulator-test.yml Uses SDK pins and watches SDK configuration changes.
.github/​workflows/​internal-test-build.yml Adds six native smoke jobs and Docker validation.
.github/​workflows/​dotnet-build-test.yml Aligns SDK selection, archives TRX results and updates paths.
.github/​workflows/​deploy_tool_nupkg.yml Aligns retained tool-packaging SDK and paths.
.github/​workflows/​cosmos_db_emulator.yml Uses the pinned SDK for Windows emulator tests.
.github/​scripts/​Test-PublishedApp.ps1 Checks runtime metadata, extension discovery and JSON transfers.
.github/​actions/​build-with-plugins/​action.yml Reports SDK selection and retains package runtime metadata.

Review effort: Balanced

Comment thread .github/scripts/Test-PublishedApp.ps1 Resolved
Compare complete JSON trees without PowerShell coercion, explicitly enable null-field preservation in the fixture, and run positive/negative assertion regressions on every native smoke platform.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@markjbrown
Mark Brown (markjbrown) merged commit 81a625b into main Oct 31, 2026
22 of 23 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants