ci: adopt the consolidated .NET workflow - #229
Merged
Merged
Conversation
Every ktsu .NET repository carried its own copy of dotnet.yml and they had drifted into five different files. This replaces the local copy with one canonical workflow that is byte-identical in every repository, folding in the drift rather than flattening it. The drift, and where it went: * macOS is back in the test matrix. It had been excluded org-wide because a macOS runner widened one repository's target frameworks to include a net10.0-ios head needing a workload this job does not install. That widening is now opt-in, so every other repository stops paying for it. UI test projects still run on Linux only, so a macOS cell stays cheap. * The UI-test rule is now "Linux runs them, every other platform does not", rather than naming Windows, so a platform added later gets the cheap treatment by default instead of silently inheriting the expensive one. * The Linux coverage report's paths are rewritten to this job's workspace before analysis. Sonar matches coverage to source by path, so a Linux-only suite's coverage was being dropped without a word. The step no-ops where there is no Linux report. * The test and release jobs install the 8.0 and 9.0 runtimes alongside the pinned SDK, because test projects commonly multi-target every framework their library publishes and the test host needs those runtimes present. global.json still pins the SDK, so this only adds runtimes. * Coverage exclusions are extensible per repository through the SONAR_COVERAGE_EXCLUSIONS_EXTRA variable, so a repository with a file that cannot be executed rather than one nobody has tested yet can say so without editing this file and making every other repository carry its paths. * A SonarQube Cloud outage skips analysis instead of failing the build, and is never dressed up as a pass. Where the gate is blocking, an outage still fails. * Stale comments explaining one repository's circumstances are rewritten to explain the shared rule, with the measurements kept and attributed. Nothing in the pipeline's shape changed: the same jobs, the same steps, the same order. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015qxqZVzN8CJcDxTb5gtWua
|
This was referenced Sep 14, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Every ktsu .NET repository carried its own copy of
.github/workflows/dotnet.yml, and they had drifted into five different files. This adopts the one canonical workflow, byte-identical across the org — folding the drift in rather than flattening it.ed23a97(18,495 b)f59a33a(18,653 b)c47b195(18,775 b)30fbfeb(19,681 b)cb1dbdc(25,807 b)Sdk, VST and ByteSizeDotnet have no
dotnet.ymland are untouched.What this repository gains
net10.0-ioshead needing a workload this job does not install, so every macOS cell failed withNETSDK1147. That widening is now opt-in, so every other repository stops paying for a problem it never had — as the old comment itself prescribed: "excluded until the underlying problem is fixed rather than papered over".global.jsonstill pins the SDK, so this adds runtimes without changing what builds.dotnet tool installit is about to throw away. Skipping is never dressed up as a pass — no gate is produced, the check does not report, and a warning annotation and job summary say why.SONAR_BLOCKING_GATEis set, an outage is still forgiven on a pull request (which cannot publish), and theReleasestep instead names the Sonar outputs explicitly so a release cannot go out ungated.SONAR_COVERAGE_EXCLUSIONS_EXTRAvariable, rather than one repository's paths living in everyone's file. Unset here, so nothing changes.Nothing in the pipeline's shape changed: the same four jobs, the same steps, the same order.
Already proven
This file is merged and green in three repositories, piloted before this fan-out:
How it was checked
Anchored transforms that refuse to apply on a missing or ambiguous anchor, then 18 structural assertions over the parsed YAML; comment-stripped diffs against all five variants, so the executable delta for each is exactly the list above; and both Sonar scripts parsed with the PowerShell parser and exercised under pwsh 7.4 across nine cases, capturing process exit codes and written
$GITHUB_OUTPUTrather than a pipeline's status.🤖 Generated with Claude Code
https://claude.ai/code/session_015qxqZVzN8CJcDxTb5gtWua
Generated by Claude Code