Skip to content

feat(run-dotnet-tests)!: provision .NET 11 and retire the end-of-life .NET 9 SDK - #895

Merged
devantler merged 1 commit into
mainfrom
claude/dotnet-11-sdk
Nov 11, 2026
Merged

devantler merged 1 commit into
mainfrom
claude/dotnet-11-sdk

Conversation

@devantler

Copy link
Copy Markdown
Contributor

Why

.NET 11 became generally available on 10 November 2026, and .NET 9 reached end of support the same day (Microsoft's release index: 11.0 active, SDK 11.0.100; 9.0 eol).

run-dotnet-tests installs exactly two pinned SDKs, 9.0.319 and 10.0.402. A caller whose global.json asks for .NET 11 therefore fails at restore with "A compatible .NET SDK was not found". That is what blocks devantler-tech/dotnet-template#627, which moves the template to .NET 11 as its toolchain policy requires (devantler-tech/dotnet-template#599).

What

  • The action now installs 10.0.402 (long-term support) and 11.0.100 (current). The probe, the setup step and the fixture job that mirrors them move together, as the pin test requires.
  • The fixture that uses xUnit v3 on Microsoft.Testing.Platform now targets net11.0, so one fixture job proves the new SDK end to end. The other fixtures stay on net10.0.
  • The pin test expects the new pair and its refusal controls are updated to match. The version-pin ledger and the action's README name the new pair.

Breaking change

The .NET 9 SDK and runtime are no longer installed, so a caller that targets net9.0 would stop working. No such caller exists:

  • The consumer census (consumer-census.sh) and an organisation-wide code search find run-dotnet-tests called only by dotnet-template and by this repository's own CI.
  • The only net9.0 target in the organisation is the fixture under .github/fixtures/dotnet-test-action, which no workflow or test uses. It is left as it is here.

dotnet-template targets net10.0 today and keeps working: its global.json floor of 10.0.300 is met by 10.0.402.

Checked locally

test-dotnet-native-fixtures.sh (the pair and 18 + 26 refusal controls), test-version-pin-census.sh, test-dotnet-tool-pins.sh, test-catalogue-tool-pin-parity.sh and test-dotnet-helper-checkout.sh pass. The fixture jobs in this pull request's CI are the proof that the new SDK installs and tests on the runners.

Part of devantler-tech/dotnet-template#599

🤖 Generated with Claude Code

… .NET 9 SDK

.NET 11 is generally available since 2026-11-10 and .NET 9 reached end
of support the same day. Install 10.0.402 (LTS) and 11.0.100 (current)
instead of 9.0.319 and 10.0.402, move the Microsoft.Testing.Platform
fixture to net11.0, and update the pin test, the version-pin ledger and
the README to the new pair.

BREAKING CHANGE: the .NET 9 SDK and runtime are no longer installed. No
caller in the organisation targets net9.0.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
@github-code-quality

github-code-quality Bot commented Nov 11, 2026 •

Copy link
Copy Markdown

Code coverage overview

Languages: Go, C#

Go / code-coverage/test

main 980f003 claude/dotnet-11-sdk 698e00b +/-
50% 50% 0%

C# / code-coverage/dotnet

main 980f003 claude/dotnet-11-sdk 698e00b +/-
100% 100% 0%

Go / code-coverage/go

main 980f003 claude/dotnet-11-sdk 698e00b +/-
100% 50% -50%
View coverage of the 1 most impacted file.
File main 980f003 claude/dotnet-11-sdk 698e00b +/-
main.go 0% 50% +50%

ℹ️ Calculations represent line coverage. Results may change as calculations are updated.


Updated November 11, 2026 06:24 UTC

devantler added a commit to devantler-tech/dotnet-template that referenced this pull request Nov 11, 2026
Temporary: runs the template's tests with the unreleased action that
installs the .NET 11 SDK, to prove the move end to end. Reverted after
the run.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
devantler added a commit to devantler-tech/dotnet-template that referenced this pull request Nov 11, 2026
@devantler

Copy link
Copy Markdown
Contributor Author

🤖 Generated by the Agentic Engineer (interactive Claude Code session)

User trial at 698e00bae13b0b5fa537819ad828ab07ef267d7b

As the action's only outside caller. dotnet-template is the one repository that calls run-dotnet-tests. Its draft devantler-tech/dotnet-template#627 moves the template to net11.0 with a global.json floor of 11.0.100. I pointed that draft at this head for one run and reverted the pin afterwards:

  • With the released action (v20.1.16) all three test jobs fail at restore: "A compatible .NET SDK was not found. Requested SDK version: 11.0.100".
  • With this head all three pass: Ubuntu, Windows, macOS. The Ubuntu log shows the action installing 10.0.402 and 11.0.100, then the tests running from bin/Debug/net11.0 with 5 of 5 passing.

In this repository. The fixture moved to net11.0 passes on Ubuntu, macOS and Windows. The net10.0 fixtures pass too, so a caller that stays on .NET 10 keeps working.

The pin test still bites. test-dotnet-native-fixtures.sh passes for the new pair and rejects all 18 + 26 broken variants, among them a floating version, a single SDK, a preview build, and a fixture step that does not match the action.

Not proven here: a caller that targets net9.0 is expected to break and was not run, because none exists. The template itself is not unblocked by this alone: its packaging tool does not work with the .NET 11 SDK yet (xoofx/dotnet-releaser#78), which is recorded on devantler-tech/dotnet-template#599.

🤖 Generated with Claude Code

@devantler

Copy link
Copy Markdown
Contributor Author

🤖 Generated by the Agentic Engineer

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Nov 11, 2026 •

Copy link
Copy Markdown
Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented Nov 11, 2026

Copy link
Copy Markdown

Explain Change →

No actionable comments were generated in the recent review.

Walkthrough

The run-dotnet-tests action and CI workflow now provision .NET SDKs 10.0.402 and 11.0.100. The version ledger and README reflect the .NET 10 and .NET 11 pairing. Native fixture checks now expect those SDK versions, and the example test project targets .NET 11. The README also states that xUnit v3 4.x requires Microsoft.Testing.Platform on the .NET 10 SDK and later.

Possibly related PRs

  • devantler-tech/.github#765: Pins the same run-dotnet-tests and native fixture SDK provisioning to .NET 9 and .NET 10; this PR updates that configuration to .NET 10 and .NET 11.
Merge Risk: Minimal · up to 698e0

The SDK update and related fixtures are aligned, with no unresolved actionable merge risk identified.

Pre-merge checks: Passed 5

Check name Status Explanation
Title check Passed The title clearly summarizes the main change: provisioning .NET 11 and removing the end-of-life .NET 9 SDK.
Description check Passed The description directly explains the SDK changes, affected fixtures, breaking change, rationale, and validation results.
Docstring Coverage Passed No eligible functions found in the changed files. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentat…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

No eligible functions found in the changed files. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 0 functions across 1 files. (5 skipped: 5 unsupported.)

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

Recent review info

Run configuration

Commits

Reviewing files that changed from the base of the PR and between 980f003 and 698e00b.

Files selected for processing: 6

  • .github/fixtures/run-dotnet-tests-mtp/tests/Example.Tests/Example.Tests.csproj
  • .github/tests/test-dotnet-native-fixtures.sh
  • .github/version-pins.json
  • .github/workflows/ci.yaml
  • actions/run-dotnet-tests/README.md
  • actions/run-dotnet-tests/action.yaml

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

Recent review details

Context from checks skipped due to timeout: 2

  • GitHub Check: CodeRabbit
  • GitHub Check: [Test] Enable Auto-Merge - Queue Slot 2
Additional context used

Code guidelines: 4

actions/CONTRIBUTING.md — auto-discovered
.github/agent-guides/workflows.md — auto-discovered
AGENTS.md — auto-discovered
CONTRIBUTING.md — auto-discovered
Path-based instructions: 5

Applicability reference: AGENTS.md: # AGENTS.md — devantler-tech/.github (GitHub-as-code) Full detail in [actions/CONTRIBUTING.md](actions/CONTRIBUTING.md).

CodeRabbit inference engine (actions/CONTRIBUTING.md)

Files:

  • .github/workflows/ci.yaml
  • .github/tests/test-dotnet-native-fixtures.sh
  • actions/run-dotnet-tests/README.md
Applicability reference: AGENTS.md: # AGENTS.md — devantler-tech/.github (GitHub-as-code) | Guide | Read before | |---|---| | [Workflow and CI contracts](.github/agent-guides/workflows.md) | Any catalogue implementation, test or workflow ch...

CodeRabbit inference engine (.github/agent-guides/workflows.md)

Files:

  • .github/workflows/ci.yaml
  • .github/tests/test-dotnet-native-fixtures.sh
Applicability reference: AGENTS.md: # AGENTS.md — devantler-tech/.github (GitHub-as-code) Full detail in [actions/CONTRIBUTING.md](actions/CONTRIBUTING.md).

CodeRabbit inference engine (actions/CONTRIBUTING.md)

Files:

  • .github/workflows/ci.yaml
  • actions/run-dotnet-tests/action.yaml
Source excerpt: Full detail in [actions/CONTRIBUTING.md](actions/CONTRIBUTING.md).

CodeRabbit inference engine (AGENTS.md)

Files:

  • actions/run-dotnet-tests/action.yaml
  • actions/run-dotnet-tests/README.md
Applicability reference: AGENTS.md: # AGENTS.md — devantler-tech/.github (GitHub-as-code) Three things share one repo: **The org's public profile** — `profile/README.md` (rendered on the org page), plus the org-wide community health files i...

CodeRabbit inference engine (CONTRIBUTING.md)

Files:

  • .github/fixtures/run-dotnet-tests-mtp/tests/Example.Tests/Example.Tests.csproj
  • .github/workflows/ci.yaml
  • .github/tests/test-dotnet-native-fixtures.sh
  • .github/version-pins.json
Learnings: 1

Learning: 2026-11-09T20:49:18.242Z

Learnt from: CR
Repo: devantler-tech/.github PR: 0
File: actions/CONTRIBUTING.md:0-0
Timestamp: 2026-11-09T20:49:18.242Z
Learning: Applicability reference:
AGENTS.md: # AGENTS.md — devantler-tech/.github (GitHub-as-code)
## Actions catalogue
### Conventions
Full detail in [actions/CONTRIBUTING.md](actions/CONTRIBUTING.md). Key rules:

Source excerpt:
# Contributing

## Security

- **Every version pin is tracked or listed.** `.github/scripts/version-pin-census.sh`
  lists every pin in workflows, workflow templates, action metadata and Go modules. A pin passes when
  Dependabot updates it: a full-SHA action with a `# v<version>` comment in a
  directory that `dependabot.yml` covers, or a module in a `gomod` entry that does not
  ignore `*`. Any other pin needs an entry with its refresh path in
  `.github/version-pins.json`. That covers images, which must always carry a digest,
  tool versions in `run:`, `with:` and `env:`, branch-tracked actions and frozen
  fixtures. A Docker action whose metadata runs a floating image tag is called by
  image digest instead (`uses: docker://<image>:<tag>sha256:<digest>`). The cens...

Applied to files:

  • .github/version-pins.json
Additional comments: 6

.github/version-pins.json: 1

68-68: LGTM!

Also applies to: 72-72, 76-76, 85-85, 89-89, 94-94

actions/run-dotnet-tests/action.yaml: 1

23-23: LGTM!

Also applies to: 48-48, 53-53

.github/workflows/ci.yaml: 1

1946-1946: LGTM!

Also applies to: 1949-1949

actions/run-dotnet-tests/README.md: 1

3-3: LGTM!

Also applies to: 39-39

.github/fixtures/run-dotnet-tests-mtp/tests/Example.Tests/Example.Tests.csproj: 1

4-4: LGTM!

.github/tests/test-dotnet-native-fixtures.sh: 1

74-76: LGTM!

Also applies to: 87-89, 91-92, 110-110, 112-112

@devantler
devantler marked this pull request as ready for review November 11, 2026 06:32
@devantler
devantler merged commit a27e1b3 into main Nov 11, 2026
238 checks passed
@devantler
devantler deleted the claude/dotnet-11-sdk branch November 11, 2026 06:32
devantler added a commit to devantler-tech/dotnet-template that referenced this pull request Nov 11, 2026
* feat: move the template to .NET 11

.NET 11 became generally available on 2026-11-10 (SDK 11.0.100). Move
both project files to net11.0 and the global.json SDK floor to 11.0.100
in one change, as the toolchain policy requires, and update the docs and
the package-upload job to match.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>

* fix: run the packaging tool on the newest installed .NET runtime

dotnet-releaser 0.24 is built for .NET 10. On that runtime it reads the
build log with the .NET 10 MSBuild and aborts on a record the .NET 11
SDK writes ("unsupported type: 36"). DOTNET_ROLL_FORWARD=LatestMajor
runs it on the .NET 11 runtime, where it loads the MSBuild of the SDK
that global.json selects.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>

* ci: probe dotnet-releaser 0.24.1 on the .NET 11 SDK

Temporary: checks whether the newest release of the packaging tool reads
the .NET 11 SDK's build log. Reverted or kept depending on the result.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>

* Revert "fix: run the packaging tool on the newest installed .NET runtime"

This reverts commit 23c0baf.

* Revert "ci: probe dotnet-releaser 0.24.1 on the .NET 11 SDK"

This reverts commit b98d554.

* ci: probe the shared test action from devantler-tech/.github#895

Temporary: runs the template's tests with the unreleased action that
installs the .NET 11 SDK, to prove the move end to end. Reverted after
the run.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>

* Revert "ci: probe the shared test action from devantler-tech/.github#895"

This reverts commit 9420b54.

* fix(ci): use released .NET 11 tooling

Install the released shared test action and dotnet-releaser 0.25.0 together so .NET 11 validation and package preparation use supported tooling.

Refs: #599

---------

Co-authored-by: Claude Fable 5.2 <noreply@anthropic.com>
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