ci(refactor-release): adopt dotted RC identifiers - #12793
DariuszPorowski wants to merge 11 commits into
Conversation
6261084 to
a914717
Compare
There was a problem hiding this comment.
Pull request overview
This PR updates Radius release automation to use SemVer-native -rc.N identifiers while preserving historical -rcN compatibility.
Changes:
- Centralizes RC validation, parsing, and release selection.
- Updates workflows, Helm coverage, upgrades, and release documentation.
- Adds tests for RC ordering and release-version handling.
Reviewed changes
Copilot reviewed 17 out of 17 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Summary | Final review note |
|---|---|---|
pkg/upgrade/preflight/version_check.go |
Upgrade compatibility handling | Moderate (2 votes): Normalize legacy rcN values for comparison; rc9 → rc10 is currently rejected. |
pkg/upgrade/preflight/version_check_test.go |
RC ordering tests | — |
eng/design-notes/tools/2026-03-goreleaser-release-lifecycle.md |
Lifecycle documentation updates | — |
docs/contributing/contributing-releases/README.md |
Release runbook updates | — |
deploy/Chart/tests/helpers_test.yaml |
Dotted RC Helm tag coverage | — |
build/test.mk |
Focused test registration | — |
.github/workflows/release-verification.yaml |
Updated release-version example | — |
.github/workflows/functional-test-noncloud.yaml |
Updated image-tag example | — |
.github/workflows/functional-test-cloud.yaml |
Updated image-tag example | — |
.github/scripts/validate_semver.py |
Dotted RC validation | — |
.github/scripts/release-version.sh |
Shared RC policy helpers | — |
.github/scripts/release-version-format_test.sh |
Version policy and parsing tests | — |
.github/scripts/release-verification.sh |
Release verification integration | — |
.github/scripts/release-get-version.sh |
Release candidate selection | Moderate (3 votes): Undotted candidates can still be emitted for new releases; reject or canonicalize them while preserving existing legacy tags. |
.github/scripts/release-get-version_test.sh |
Selector and compatibility tests | — |
.github/scripts/get_release_version.py |
Release metadata parsing | — |
.github/scripts/checkout-release-codebase.sh |
Release checkout validation | — |
Suppressed comments (3)
.github/scripts/checkout-release-codebase.sh:85
- The shared policy still accepts historical
vX.Y.Z-rcNvalues, but this new checkout error lists only the dotted form. Keep the error guidance consistent with the compatibility promise by mentioning the legacy form as accepted input.
echo "Expected semantic version format (e.g., '0.61.0' or '0.61.0-rc.1')"
.github/scripts/release-get-version_test.sh:214
- Because
REPOSITORIESare empty here, this test exercises a brand-new release rather than historical reconciliation. As written it locks in selectingv0.62.0-rc2for the path that later creates tags, so it permits the legacy form to be emitted; seed an existing legacy tag to test reconciliation and add an empty-repository assertion for the chosen reject-or-canonicalize behavior.
run_selector "${rc}" "${REPOSITORIES[@]}"
.github/scripts/release-verification.sh:139
- The shared policy still accepts historical
vX.Y.Z-rcNvalues, but this new validation error lists only the dotted form. When verification rejects a nearby malformed version, the message should mention the legacy form as accepted input too, otherwise the CLI guidance contradicts the compatibility promise.
echo "Error: Invalid version format. Expected format: X.Y.Z or X.Y.Z-rc.N" >&2
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| if is_legacy_rc_version "${version_number}"; then | ||
| canonical_version="$(canonical_radius_rc_version "${version_number}")" | ||
| printf 'Warning: %s uses the historical RC form; use v%s for new releases.\n' \ | ||
| "${version}" "${canonical_version}" >&2 |
|
|
||
| // Allow upgrades within the same minor version (patch bumps, prerelease upgrades) | ||
| // e.g., 0.55.0-rc4 -> 0.55.0-rc5, 0.55.0-rc5 -> 0.55.0, 0.55.0 -> 0.55.1 | ||
| // e.g., 0.61.0-rc.2 -> 0.61.0-rc.10, 0.61.0-rc.10 -> 0.61.0, 0.61.0 -> 0.61.1 |
a914717 to
9529362
Compare
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.Scanned FilesNone |
9529362 to
f58c094
Compare
f58c094 to
b7bbf25
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## dp/release-identifier-correlation #12793 +/- ##
==================================================================
Coverage 59.52% 59.52%
==================================================================
Files 772 772
Lines 45060 45060
==================================================================
+ Hits 26823 26824 +1
+ Misses 18237 18236 -1 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
b7bbf25 to
190f3a8
Compare
190f3a8 to
6848ff9
Compare
f302034 to
db428e9
Compare
db428e9 to
bf30160
Compare
45be327 to
d59270e
Compare
Radius functional test overviewClick here to see the test run details
Test Status⌛ Building Radius and pushing container images for functional tests... |
Reconcile branches and tags against an exact immutable release commit. Create only the named refs, verify remote state after every mutation, accept matching state on rerun, and stop on divergent branches or tags. Handle concurrent exact-state creation without overwriting conflicts. Select a release until its tag exists in all four release repositories, not just Radius. Preserve the current main-to-release cherry-pick gate while allowing branch-only and tag-only partial failures to resume. An existing immutable tag recovers a sibling repository's planned commit after its release branch advances. Add real-git coverage for exact plans, annotated tags, concurrent ref races, multi-repository partial releases, dotted RC parsing, transport failures, and workflow skip/resume decisions. Increase the release job timeout above its Deployment Engine monitor budget and fetch full git history for reachability checks. Signed-off-by: Dariusz Porowski <3431813+DariuszPorowski@users.noreply.github.com>
…script Signed-off-by: Dariusz Porowski <3431813+DariuszPorowski@users.noreply.github.com>
Signed-off-by: Dariusz Porowski <3431813+DariuszPorowski@users.noreply.github.com> Generated-by: 🔧 - Generated by Copilot
Query publisher runs by an exact version-and-source identifier before dispatching, then reuse successful or active work and retry failed work without changing App scopes. Add bounded transient API retries, caller wiring checks, and queue-aware timeout budgets. Signed-off-by: Dariusz Porowski <3431813+DariuszPorowski@users.noreply.github.com>
Emit dispatch payload values with toJSON so an externally supplied image, tag, or ref cannot break out of the JSON it is placed in. Bound the correlated run lookup to a fixed page budget, reset per retry, so a long publisher history cannot cost an unbounded number of API calls. Signed-off-by: Dariusz Porowski <3431813+DariuszPorowski@users.noreply.github.com>
Signed-off-by: Dariusz Porowski <3431813+DariuszPorowski@users.noreply.github.com>
Signed-off-by: Dariusz Porowski <3431813+DariuszPorowski@users.noreply.github.com>
…nce validation tests Signed-off-by: Dariusz Porowski <3431813+DariuszPorowski@users.noreply.github.com>
Signed-off-by: Dariusz Porowski <3431813+DariuszPorowski@users.noreply.github.com> Generated-by: 🔧 - Generated by Copilot
Use the SemVer-native rc.N form for new release candidates while preserving historical rcN parsing for verification, upgrades, and release reconciliation. Centralize Radius release-version policy, update operator guidance and active examples, and add focused coverage across tag parsing, selectors, Helm tags, and upgrade ordering. Signed-off-by: Dariusz Porowski <3431813+DariuszPorowski@users.noreply.github.com>
Signed-off-by: Dariusz Porowski <3431813+DariuszPorowski@users.noreply.github.com>
Summary
-rc.Nform for new Radius release candidates, starting at-rc.1-rcNparsing and reconciliation without emitting that form for new releasesThis is PR 11 in stack #12738 and is based on #12783.
Reason for change
Legacy identifiers such as
rc10are one alphanumeric SemVer prerelease identifier and therefore sort beforerc2. The dotted form (rc.10) makes the RC number a numeric identifier, so standard SemVer tooling orders releases correctly. Historical tags must remain readable for verification, upgrades, and previous-release reconciliation.How to test
make test-release-version-format(24 checks)make test-release-get-version(11 real-git tests)make test-helm(134 tests)go test ./pkg/upgrade/preflight -run 'TestVersionCompatibilityCheck_Run|TestValidateVersionJump'shellcheckandshfmt -don changed/new release scriptsactionlint -shellcheck=on changed workflows; changed shell files were checked separatelymarkdownlint-cli2andmarkdown-table-formatter --checkon changed docsversions.yamlrunbook example withyqzizmor --pedantic --min-severity medium .github/workflows/release-verification.yamlmake spellcheckcould not run locally becausecspellis not installed; Markdown lint and table checks pass.File change summary
.github/scripts/release-version.sh.github/scripts/release-version-format_test.sh.github/scripts/release-get-version*.github/scripts/{validate_semver.py,get_release_version.py,release-verification.sh,checkout-release-codebase.sh}.github/workflows/*.yaml-rc.N.pkg/upgrade/preflight/version_check*rc.2torc.10upgrade ordering while retaining legacy compatibility.deploy/Chart/tests/helpers_test.yamldocs/contributing/contributing-releases/README.mdeng/design-notes/tools/2026-03-goreleaser-release-lifecycle.mdbuild/test.mkeng/design-notes/tools/2026-09-goreleaser-stack-review/pr-11-dotted-rc-identifiers.md