Skip to content

Migrate managed targets and CI tooling to .NET 10 - #33618

Draft
eserscor wants to merge 1 commit into
mainfrom
eserscor-dev/erscor/2026/10/26-dotnet-10-migratio
Draft

eserscor wants to merge 1 commit into
mainfrom
eserscor-dev/erscor/2026/10/26-dotnet-10-migratio

Conversation

@eserscor

@eserscor eserscor commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

Description

Layer 2 of 2, stacked on #33617. The lower PR centralizes GitHub Actions and Azure Pipelines SDK setup while retaining 8.x, including the existing Node/WebGPU packaging callers. This PR changes both shared SDK selections to 10.x, adds migration-specific provisioning, and carries the remaining migration from #33592, without repeating those caller refactors.

  • Retarget the managed library/shared tests to netstandard2.0;net10.0, and executable tests, samples, performance tools, API documentation, and plugin consumers to .NET 10. Update framework-specific API guards and preserve the E2E launcher's explicit net462 override and required compilation fixes.
  • Align mobile projects/workloads and native NuGet dependency/asset groups with .NET 10, including Android 36.0, iOS/Mac Catalyst 18.7 library platform versions and all four target-folder file renames. Keep previously disabled MAUI test targets disabled.
  • Use the lower PR's shared Azure setup template at SDK10 and add provisioning to migration-specific packaging/test jobs. Route managed packaging through SDK MSBuild while preserving CPU/CUDA arguments and the Node architecture override. Install SDK10 without a separate runtime8 installation in Linux provisioning and explicitly invoke it in all four cached-base packaging Dockerfiles.
  • Update BrowserStack.TestAdapter to 0.47.1 and its tool to 1.51.1 with explicit restore/runtime roll-forward; enable DocFX roll-forward. Include packaging regression tests and directly related documentation.

Compatibility: netstandard2.0 remains available for older desktop consumers. Framework-specific assets and tensor interop APIs formerly supplied by net8.0 now require .NET 10; mobile assets require .NET 10 workloads. Independent dependency versions such as SourceLink 8.0.0 are not runtime8 requirements and remain unchanged.

Fresh split verification (passed):

  • node <parent-session-artifacts>\verify-dotnet-azure-stack.cjs 0bbb7fb2f97cc7887ae93c024f31dd734b3fb72b 9ff9dd3782876d840ce514fecccd4befc8a28ac5 passed: the lower layer changes 14 files and keeps both helpers at SDK8.x; the upper is one direct child commit changing 51 files and selects SDK10.x in both helpers. The moved Node/WebGPU callers are absent from the upper diff.
  • node <session-artifacts>\verify-net10-rebase.cjs <expected-remote-upper-sha> passed before/after the lease-protected push: the complete tree differs from the previously validated upper 81d7f41e6f7077996c8371d1a37285536f10503b only by the Azure template's inherited neutral Install .NET SDK display label. All functional migration code, four mobile renames, and newer main Next.js changes are retained byte-for-byte. Live branch refs, native stack33619 order33617/33618, ready/draft states, and disabled auto-merge were checked.
  • git rev-parse HEAD^{tree} is 7711b9062826649e365a1dd4ad45e24a4f49a8ee. The previous fixed tree/count checks were superseded by the user-directed Azure centralization move; the new tree changes no functional source.
  • node <parent-session-artifacts>\validate-net10-full.cjs passed YAML/JSON checks, all 12 GitHub setup callers, Azure template paths, preservation of CPU MSBuild arguments, cached Linux image provisioning, and BrowserStack configuration. Its historical baseline remains appropriate for those checks. The Linux E2E template's pre-existing strict YAML errors are unchanged, not repaired or reported as a strict parse success.
  • Full tracked-source git grep -I -n -E 'net[89]\.0|NET[89]_0|dotnet-(sdk|runtime)-8' -- . returned no matches; git diff --check HEAD^ HEAD passed.

Prior validation on these identical migrated files (not freshly rerun for this split):

The original migration used fresh isolated SDK 10.0.403/runtime 10.0.14 installations on Windows and Ubuntu 24.04/WSL with no runtime8. Isolated installations were subsequently cleaned up; this PR does not reinstall them solely to repackage unchanged source.

  • dotnet restore <NetCoreApp-test-project> --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/index.json <isolated-output-properties> and dotnet test <NetCoreApp-test-project> --no-restore --configuration Release <isolated-output-properties> -p:UseSharedCompilation=false --filter 'FullyQualifiedName~Microsoft.ML.OnnxRuntime.Tensors.Tests' --logger trx --verbosity minimal --disable-build-servers passed on each OS: 150 tests each, zero failures/skips. Exact platform-specific commands and properties are recorded in #33592.
  • python -m unittest discover -s tools\ci_build -p test_build_nuget.py -v passed (1 test); python -m unittest discover -s tools\nuget -p test_generate_nuspec_for_native_nuget.py -v passed (2 tests); python -m unittest discover -s plugin-ep-webgpu\csharp\test -p test_pack_nuget.py -v passed (8 tests, no skips) with the isolated SDK and ORT_WEBGPU_TEST_REQUIRE_DOTNET_SDK=1, exercising the real SDK layout fixture rather than GPU inference.
  • Repository-pinned Ruff 0.12.12 lint/format checks passed on all five changed Python files. Both library/shared-test TFMs built; managed NuGet inspection confirmed exactly netstandard2.0/net10.0 assets. Freshly packed managed assemblies compiled in net10.0 and net462 E2E consumers.
  • Both mobile automation hosts built; BrowserStack restore/instrumentation passed with runtime10 only. API docs built and DocFX 2.81.0 metadata generation passed with roll-forward, existing warnings, and zero errors. XML/package and executable-shim launcher checks passed, including TFM override and restore/test failure propagation.
  • bash -n tools/ci_build/github/linux/docker/scripts/install_dotnet.sh, shellcheck tools/ci_build/github/linux/docker/scripts/install_dotnet.sh, and apt-get --simulate install dotnet-sdk-10.0 passed under WSL; SDK10 RPM availability was confirmed for AlmaLinux 8 x86_64/aarch64.

Limits: no claim of hosted CI success, native/GPU inference, signed native package validation, MAUI workload/device deployment, or complete Docker image builds. No shared CI VM images were modified. Full validation details and constraints remain documented in #33592.

Motivation and Context

Separate setup-action consolidation from the runtime/target compatibility change so each can be reviewed independently. The first layer intentionally stays on SDK8.x; this second layer migrates targets, tooling, provisioning, and native-package metadata together to .NET 10 LTS ahead of .NET 8 end of support on November 10, 2026. Installing a newer SDK alone would leave older executable/mobile runtime requirements in place.

@eserscor
eserscor added this pull request to stack #33619 October 26, 2026 14:14
@eserscor
eserscor force-pushed the eserscor-dev/erscor/2026/10/26-dotnet-10-migratio branch from 81d7f41 to 9ff9dd3 Compare October 26, 2026 14:23
Base automatically changed from eserscor-dev/erscor/2026/10/26-centralize-dotnet to main October 26, 2026 18:58
Stack the complete runtime and target migration on the SDK8 setup centralization without duplicating its changes.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@tianleiwu
Tianlei Wu (tianleiwu) force-pushed the eserscor-dev/erscor/2026/10/26-dotnet-10-migratio branch from 9ff9dd3 to 20b274d Compare October 26, 2026 18:58

This branch has not been deployed

No deployments
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.

1 participant