Skip to content

ci(refactor-release): adopt dotted RC identifiers - #12793

Draft
DariuszPorowski wants to merge 11 commits into
mainfrom
dp/dotted-rc-identifiers
Draft

DariuszPorowski wants to merge 11 commits into
mainfrom
dp/dotted-rc-identifiers

Conversation

@DariuszPorowski

@DariuszPorowski DariuszPorowski commented Aug 22, 2026 •

Copy link
Copy Markdown
Member

Summary

  • adopt the SemVer-native -rc.N form for new Radius release candidates, starting at -rc.1
  • centralize Radius release-version policy across selection, verification, and long-running release checkout
  • preserve historical -rcN parsing and reconciliation without emitting that form for new releases
  • update active workflow/runbook examples and add end-to-end coverage for tag parsing, selector output, Helm tags, and upgrade ordering

This is PR 11 in stack #12738 and is based on #12783.

Reason for change

Legacy identifiers such as rc10 are one alphanumeric SemVer prerelease identifier and therefore sort before rc2. 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'
  • shellcheck and shfmt -d on changed/new release scripts
  • actionlint -shellcheck= on changed workflows; changed shell files were checked separately
  • markdownlint-cli2 and markdown-table-formatter --check on changed docs
  • parse the copyable versions.yaml runbook example with yq
  • zizmor --pedantic --min-severity medium .github/workflows/release-verification.yaml

make spellcheck could not run locally because cspell is not installed; Markdown lint and table checks pass.

File change summary

File Summary of change
.github/scripts/release-version.sh Define canonical and historical Radius RC policy in one sourced helper.
.github/scripts/release-version-format_test.sh Test generic SemVer, Radius RC policy, tag parsing, caller wiring, and runbook examples.
.github/scripts/release-get-version* Validate supported release versions, prefer dotted RCs, and preserve legacy reconciliation.
.github/scripts/{validate_semver.py,get_release_version.py,release-verification.sh,checkout-release-codebase.sh} Accept dotted RCs through validation, metadata, verification, and release checkout.
.github/workflows/*.yaml Update active operator and image-tag examples to -rc.N.
pkg/upgrade/preflight/version_check* Prove numeric rc.2 to rc.10 upgrade ordering while retaining legacy compatibility.
deploy/Chart/tests/helpers_test.yaml Exercise a dotted RC image tag without changing Helm prerelease logic.
docs/contributing/contributing-releases/README.md Update the current runbook to emit dotted RCs and document the legacy transition.
eng/design-notes/tools/2026-03-goreleaser-release-lifecycle.md Align target-state examples and the resolved RC decision with the implementation.
build/test.mk Add the focused release-version-format target to the unit-test aggregate.
eng/design-notes/tools/2026-09-goreleaser-stack-review/pr-11-dotted-rc-identifiers.md Review note for this layer: what changed in review, why, the value, and the impact

@DariuszPorowski
DariuszPorowski requested review from a team as code owners August 22, 2026 00:52
@DariuszPorowski DariuszPorowski added the pr:standard Ongoing maintenance, minor improvements, documentation updates, and routine development work label Aug 22, 2026
@DariuszPorowski DariuszPorowski self-assigned this Aug 22, 2026
Copilot AI lite review requested due to automatic review settings August 22, 2026 04:10
@DariuszPorowski
DariuszPorowski force-pushed the dp/dotted-rc-identifiers branch from 6261084 to a914717 Compare August 22, 2026 04:10

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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-rcN values, 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 REPOSITORIES are empty here, this test exercises a brand-new release rather than historical reconciliation. As written it locks in selecting v0.62.0-rc2 for 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-rcN values, 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.

Comment on lines +40 to +43
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
@DariuszPorowski
DariuszPorowski force-pushed the dp/dotted-rc-identifiers branch from a914717 to 9529362 Compare August 24, 2026 15:25
@github-actions

Copy link
Copy Markdown

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

@github-actions

github-actions Bot commented Aug 24, 2026 •

Copy link
Copy Markdown

Unit Tests

    2 files  ±0    459 suites  ±0   8m 0s ⏱️ +51s
6 637 tests +2  6 635 ✅ +2  2 💤 ±0  0 ❌ ±0 
7 945 runs  +2  7 943 ✅ +2  2 💤 ±0  0 ❌ ±0 

Results for commit 0a46c5c. ± Comparison against base commit 33e4aa9.

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Aug 24, 2026 •

Copy link
Copy Markdown

Functional Tests - upgrade-noncloud

3 tests  ±0   3 ✅ ±0   1m 18s ⏱️ -8s
1 suites ±0   0 💤 ±0 
1 files   ±0   0 ❌ ±0 

Results for commit cc55692. ± Comparison against base commit 8439a30.

♻️ This comment has been updated with latest results.

@codecov

codecov Bot commented Aug 28, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 59.52%. Comparing base (33e4aa9) to head (0a46c5c).

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.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@DariuszPorowski
DariuszPorowski force-pushed the dp/dotted-rc-identifiers branch from b7bbf25 to 190f3a8 Compare August 28, 2026 20:07
@DariuszPorowski DariuszPorowski changed the title ci: adopt dotted RC identifiers ci(refactor-release): adopt dotted RC identifiers Aug 28, 2026
@DariuszPorowski
DariuszPorowski force-pushed the dp/dotted-rc-identifiers branch from 190f3a8 to 6848ff9 Compare September 3, 2026 16:22
@DariuszPorowski
DariuszPorowski removed this pull request from stack #12738 September 17, 2026 21:54
@DariuszPorowski
DariuszPorowski added this pull request to stack #13045 September 17, 2026 21:56
@DariuszPorowski
DariuszPorowski removed this pull request from stack #13045 September 18, 2026 20:12
@DariuszPorowski
DariuszPorowski added this pull request to stack #13056 September 18, 2026 20:12
@DariuszPorowski
DariuszPorowski force-pushed the dp/dotted-rc-identifiers branch 2 times, most recently from 45be327 to d59270e Compare September 18, 2026 22:04
@DariuszPorowski
DariuszPorowski removed this pull request from stack #13056 September 18, 2026 22:57
@DariuszPorowski
DariuszPorowski added this pull request to stack #13058 September 18, 2026 22:59
@DariuszPorowski
DariuszPorowski removed this pull request from stack #13058 September 18, 2026 23:05
@DariuszPorowski
DariuszPorowski added this pull request to stack #13060 September 18, 2026 23:06
@DariuszPorowski
DariuszPorowski removed this pull request from stack #13060 September 19, 2026 02:21
@DariuszPorowski
DariuszPorowski added this pull request to stack #13063 September 19, 2026 02:21
@radius-functional-tests

radius-functional-tests Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

Radius functional test overview

🔍 Go to test action run

Click here to see the test run details
Name Value
Repository radius-project/radius
Commit ref 0a46c5c
Unique ID func558e3de98e
Image tag pr-func558e3de98e
  • Dapr: 1.14.4
  • Azure KeyVault CSI driver: 1.4.2
  • Azure Workload identity webhook: 1.3.0
  • Bicep recipe location ghcr.io/radius-project/dev/test/testrecipes/test-bicep-recipes/<name>:pr-func558e3de98e
  • Terraform recipe location http://tf-module-server.radius-test-tf-module-server.svc.cluster.local/<name>.zip (in cluster)
  • applications-rp test image location: ghcr.io/radius-project/dev/applications-rp:pr-func558e3de98e
  • dynamic-rp test image location: ghcr.io/radius-project/dev/dynamic-rp:pr-func558e3de98e
  • controller test image location: ghcr.io/radius-project/dev/controller:pr-func558e3de98e
  • ucp test image location: ghcr.io/radius-project/dev/ucpd:pr-func558e3de98e
  • deployment-engine test image location: ghcr.io/radius-project/deployment-engine:latest

Test Status

⌛ Building Radius and pushing container images for functional tests...
✅ Container images build succeeded
⌛ Publishing Bicep Recipes for functional tests...
✅ Recipe publishing succeeded
⌛ Starting ucp-cloud functional tests...
⌛ Starting corerp-cloud functional tests...
✅ ucp-cloud functional tests succeeded
✅ corerp-cloud functional tests succeeded

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>

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

pr:needs-rebase The pull request has merge conflicts pr:standard Ongoing maintenance, minor improvements, documentation updates, and routine development work

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Adopt dotted RC identifiers Migrate release automation to GoReleaser

2 participants