Files
UA-.NETStandard/coverage-thresholds.json
romanett d623007a3f Remove the Azure Pipelines CI and publishing definitions from master (#4575)
# Description

Removes the Azure Pipelines CI and package-publishing definitions from
`master`. GitHub Actions already owns all CI and package publishing for
`master`, but pushes to `master` still queued the Azure definitions.
They duplicated the Actions work and posted failing checks, for example
[`Nuget Preview (Push Nuget Preview Pack Nugets
Debug)`](https://github.com/OPCFoundation/UA-.NETStandard/runs/109065914524)
on `19dc504c5`.

## Removed

- `azure-pipelines.yml`, `azure-pipelines-preview.yml`
- `.azurepipelines/` templates: `ci.yml`, `coverage.yml`, `preview.yml`,
`sample-ha-longhaul.yml`, `sln.yml`, `test.yml`, `test-aot.yml`
- Helpers only those templates used: `get-matrix.ps1`, `get-root.ps1`,
`evaluate-test-results.ps1`
- `TrxGateScriptTests`: it tested only `evaluate-test-results.ps1`. The
Actions equivalent, `.github/scripts/get-test-verdict.ps1`, keeps its
own `CiTestVerdictTests`.

## Kept

**OneFuzz:** `.azurepipelines/onefuzz.yml` stays. Submitting to the
internal OneFuzz service needs the Azure DevOps-only `onefuzz-task`,
which has no GitHub Actions equivalent. The pipeline has no push, PR or
schedule trigger, so it never runs on `master` pushes. The public drop
build keeps running in the GitHub `fuzz-public-drop` job.

**Scripts GitHub Actions still invokes:** these stay in
`.azurepipelines/`, so every workflow path and `release.yml`'s
candidate-bound checkout keep working. Only `generate-slnx.ps1` changes,
and only its comment.

| Script | Used by |
| --- | --- |
| `set-version.ps1` | buildandtest, nightly, nuget-publish,
docker-image, stress / stability / long-haul, `run-dotnet-tests` action
|
| `generate-slnx.ps1`, `signlist{Debug,Release}.txt`,
`validate-source-generator-packages.ps1` (+ `expected-packages.txt`) |
nuget-publish |
| `package-version-policy.ps1`, `validate-nuget-package-set.ps1`,
`validate-preview-package-ordering.ps1`,
`assert-published-packages-match.ps1` | nuget-publish, release |
| `check-coverage.ps1` | buildandtest, nightly |
| `validate-migration-plugin.ps1` | buildandtest |

I didn't rename the directory on purpose. `release.yml` checks out the
candidate commit and runs `./.azurepipelines/package-version-policy.ps1`
from it, so moving the scripts would break promotion of any candidate
built before the move.

## Docs and comments

- `UA.slnx` drops the deleted files.
- `codecov.yml`, `coverage-thresholds.json`, `targets.props`, the
Redundancy sample test comments, the `.github` scripts and workflows,
`CONTRIBUTING.md`, `docs/` and `fuzzing/` no longer describe Azure as
running on `master` (`/azp run`, the `azure` Codecov flag, "the Azure
gate", the Azure long-haul and AoT legs).
- In the Developer Guide, the "Triggering a pipeline run" and "Migration
status" sections are replaced by "Pull requests from outside
contributors" and "Azure Pipelines on other branches".
- The new section names `onefuzz.yml` as the one remaining Azure
definition.
- It keeps the warning that the `Release` ruleset's Azure required check
must be lifted before cutting a new `release/2.<minor>` branch.
- `master` is merged in, including the #4555 docs rewrite. Its new
`docs/RedundancySampleTests.md` needed the Azure references removed
again. `docs/README.md` already had none.

## Reviewer notes

- **Azure DevOps side (admin action, not in this PR):** the definitions
are configured in the Azure DevOps portal. With the YAML gone, `master`
pushes give the CI and preview definitions nothing to run. Disabling
definition 14's push trigger/schedule, definition 16's build-completion
trigger, and the stale definition 13 stops any residual "file not found"
runs. Leave the OneFuzz definition enabled.
- `master378`, the 1.x `release/*` lines and the frozen `release/2.0.0`
keep their own `azure-pipelines.yml`. This PR only touches `master`.

## Related Issues

- Follow-up to #4513 (GitHub Actions for CI and nightly).

## Checklist

- [ ] I have signed the
[CLA](https://opcfoundation.org/license/cla/ContributorLicenseAgreementv1.0.pdf)
and read the
[CONTRIBUTING](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/CONTRIBUTING.md)
doc.
- [ ] I have added tests that prove my fix is effective or that my
feature works and increased code coverage.
- [x] I have added all necessary documentation.
- [ ] I have verified that my changes do not introduce (new) build or
analyzer warnings.
- [ ] I ran **all** tests locally using the **UA.slnx** solution against
at least .net **framework** and .net **10**, and all passed.
- [ ] I fixed **all** failing and flaky tests in the CI pipelines and
**all** CodeQL warnings.
- [ ] I have addressed **all** PR feedback received.

This PR removes a test and adds none. Locally, at `9b00da817`, the full
`Opc.Ua.Tools.Tests` suite passed on net10.0: 884 passed, 1 skipped. The
later commits (OneFuzz restore, merge with `master`) touch only YAML and
docs.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 07:44:36 +02:00

68 lines
3.2 KiB
JSON

{
"$comment": [
"Coverage gates for the UA .NET Standard stack. These are the ENFORCED rules;",
"see .azurepipelines/check-coverage.ps1 for the implementation and",
"docs/DeveloperGuide.md for the contributor-facing description.",
"Rates are percentages (0-100).",
"",
"codecov.io is still uploaded to, but only for reporting - its own",
"codecov/project and codecov/patch statuses are informational (see",
"codecov.yml) so that there is exactly one gate rather than two sets of",
"thresholds that can disagree about the same pull request.",
"",
"IMPORTANT: the coverage check is ADVISORY. The GitHub Actions 'code coverage' job",
"reports a clean failure when these thresholds are missed, so the miss is visible on",
"the pull request, but it does not belong in the branch ruleset. The required check is",
"'build-and-test summary', which only asserts that the tests themselves passed.",
"",
"'project' is an absolute floor over the whole merged coverage report.",
"Ratchet minimumLineRate/minimumBranchRate upward (together with baselineLineRate)",
"as coverage improves - never downward to make a red check go green.",
"",
"The initial values are seeded from the last codecov project reading (73.61%) with",
"headroom, because the in-pipeline number had not been observed yet when the gate",
"was introduced.",
"",
"The report is assembled from whichever legs of the run published Cobertura fragments,",
"so the number moves with the matrix: the pull-request run is the reference, and",
"scheduled runs read higher because the Debug / .NET 8 / .NET 9 / netstandard legs",
"contribute too. Re-calibrate against the pull-request figure.",
"",
"'patch' mirrors the old codecov/patch semantics: changed lines must reach",
"target percent, tolerating threshold percentage points. The requirement is",
"graduated by how much actually changed, because a percentage over a handful of",
"lines is noise: one uncovered line in a two-line fix reads as 50% and would fail",
"a flat floor, which teaches authors to ignore the check rather than fix it.",
"'bands' is consulted in order and the first band whose maxChangedLines covers the",
"patch wins; a band with enforced=false reports a warning instead of failing.",
"Anything larger than the last band falls through to target-threshold and is",
"always enforced, because at that size the percentage is meaningful and a big",
"untested change is exactly what the check exists to catch.",
"",
"'ignore' mirrors the exclusion list in codecov.yml so both report on the same",
"code - change the two together - and is applied to BOTH the project floor and",
"the changed-lines check."
],
"project": {
"minimumLineRate": 70.0,
"minimumBranchRate": 60.0,
"baselineLineRate": 73.6,
"advisoryDeltaTolerance": 1.0
},
"patch": {
"target": 80.0,
"threshold": 5.0,
"bands": [
{ "maxChangedLines": 10, "target": 50.0, "enforced": false },
{ "maxChangedLines": 100, "target": 60.0, "enforced": false }
]
},
"ignore": [
"tests/**",
"samples/**",
"**/obj/**",
"**/bin/**",
"**/*.g.cs"
]
}