Skip to content

build(refactor-release)!: pin chart images to full release versions - #12953

Draft
DariuszPorowski wants to merge 1 commit into
dp/release-publication-gatefrom
dp/helm-immutable-image-tags
Draft

build(refactor-release)!: pin chart images to full release versions#12953
DariuszPorowski wants to merge 1 commit into
dp/release-publication-gatefrom
dp/helm-immutable-image-tags

Conversation

@DariuszPorowski

Copy link
Copy Markdown
Member

Summary

Implement phase 17 of the GoReleaser release lifecycle above #12948 in stack #12738.

  • Use the complete Chart.AppVersion for final and patch image defaults, preserving RC/edge behavior, custom registries, and explicit tag or image overrides. Existing channel aliases remain published.
  • Require full-version image references in the publication gate and installation verifier while leaving CLI/Bicep channel metadata and historical parity baselines unchanged.
  • Reuse native ORAS tagging and the existing OCI inspection/retry helpers to prepare full-version dashboard and Deployment Engine references before publishing the chart. Verify source commits, platform sets, and the Deployment Engine digest lock; do not rebuild images or move channel aliases.
  • Exercise a real Helm install/upgrade with in-memory release storage and actual chart templates: implicit channel defaults adopt full versions, explicit channel overrides survive, and clearing an override adopts the new defaults while preserving other user values.
  • Add prominent patch-pickup notices to both release-note templates and test the generated final/patch notes. Update the chart documentation, runbook, and implementation plan.

No new files or dependencies are introduced.

Breaking change: With chart defaults, restarting pods no longer picks up later patches through moving channel aliases. Upgrade the chart to update the images. Explicit tag and image overrides remain respected.

Draft rollout gates:

  • Update the dashboard publisher to stamp org.opencontainers.image.revision with the built commit SHA, then verify a source-labeled release image. The currently inspected dashboard build command and Dockerfile do not emit this label; source verification deliberately fails closed rather than adopting an unproven image.
  • Grant the Radius repository Actions write access to the GHCR dashboard and Deployment Engine packages for the existing GITHUB_TOKEN package-write job.
  • Exercise a real registry publication and live cluster upgrade from a channel-tag installation. Confirm full-version chart defaults, unchanged channel aliases, and the published release notice.
  • Complete the preceding stack phases' rollout gates before enabling this cutover.

Keep this PR and every earlier stack PR in draft. This PR does not modify the dashboard repository or package permissions.

Reason for change

Stable charts currently truncate image tags to major/minor, allowing a pod restart to pick up images from a different patch than the installed chart. Pinning chart defaults to the release version removes that implicit patch pickup. Native image tagging supplies the external full-version references without creating another build path, and existing Helm upgrade semantics preserve intentional user overrides.

Fixes #12815

How to test

Completed local validation:

  • helm unittest deploy/Chart: all 136 tests pass, including 81 helper tests.
  • go test ./pkg/cli/helm -count=1: passes, including three native install/upgrade regression cases. Repeated after signing was unblocked; no staged content changed during the pause.
  • make test-release-publication test-release-cutover test-release-oci-artifacts test-release-parity-manifest test-prepare-release test-release-plan test-release-sboms test-release-version-format: passes.
  • OCI tests cover retries, existing-tag reuse, source/digest conflicts, missing provenance, platform mismatches, and unchanged aliases. Native ORAS against a local OCI layout verifies digest preservation.
  • Actionlint and offline Zizmor (medium severity and above) pass for the Helm publication workflow. Configured ShellCheck, Go/JavaScript formatting, Markdown lint/table checks, and git diff --check pass on the changed scope.

Helm upgrade tests use Helm's real actions and release storage with a fake Kubernetes client; CRD installation is excluded from that fixture. Live cluster/registry validation, dashboard publisher changes, package access configuration, and cspell were not run. These remain explicit rollout gates, not claimed acceptance results.

File change summary

File Summary of change
deploy/Chart/templates/_helpers.tpl, deploy/Chart/tests/helpers_test.yaml Remove stable-tag truncation and cover final/patch defaults.
pkg/cli/helm/helmclient_test.go Verify channel-to-full-version upgrades and explicit override behavior with real Helm actions and chart templates.
.github/scripts/release-oci-artifacts{,_test}.sh Reuse native OCI tagging with source/platform/digest guards and retry reconciliation.
.github/workflows/__build-helm-chart.yaml, .github/scripts/release-cutover_test.sh Prepare external full-version tags before chart publication and protect that ordering.
.github/scripts/verify-release-manifest{,_test}.mjs, verify-release-publication.sh Require and inspect full-version chart images without changing non-chart channel contracts.
.github/scripts/release-parity-manifest{,_test}.sh, release-verification{,_test}.sh Align staged/public installation checks while retaining historical parity behavior.
docs/release-notes/template*.md, .github/scripts/prepare-release_test.sh Include and test the shipping patch-pickup warning.
Chart README, release runbook, and lifecycle implementation plan Document migration behavior, retained overrides, and external publisher/package prerequisites.

@github-actions

Copy link
Copy Markdown

Dependency Review

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

OpenSSF Scorecard

PackageVersionScoreDetails
actions/docker/login-action dbcb813823bdd20940b903addbd779551569679f 🟢 8.5
Details
CheckScoreReason
Maintained🟢 1030 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Binary-Artifacts🟢 10no binaries found in the repo
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Security-Policy🟢 9security policy file detected
Code-Review🟢 10all changesets reviewed
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Signed-Releases⚠️ -1no releases found
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration
Pinned-Dependencies🟢 6dependency not pinned by hash detected -- score normalized to 6
Packaging🟢 10packaging workflow detected
SAST🟢 9SAST tool detected but not run on all commits
actions/docker/setup-buildx-action bb05f3f5519dd87d3ba754cc423b652a5edd6d2c 🟢 8.6
Details
CheckScoreReason
Security-Policy🟢 9security policy file detected
Code-Review🟢 10all changesets reviewed
Binary-Artifacts🟢 10no binaries found in the repo
Maintained🟢 1030 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Token-Permissions🟢 10GitHub workflow tokens follow principle of least privilege
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Fuzzing⚠️ 0project is not fuzzed
License🟢 10license file detected
Branch-Protection⚠️ -1internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration
Signed-Releases⚠️ -1no releases found
Pinned-Dependencies🟢 7dependency not pinned by hash detected -- score normalized to 7
Packaging🟢 10packaging workflow detected
SAST🟢 10SAST tool is run on all commits

Scanned Files

  • .github/workflows/__build-helm-chart.yaml

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.

🟡 Changes recommended

The implicit-default test does not model an absent override, and the documentation gives incorrect instructions for clearing component image overrides.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

Pins Helm chart images to complete release versions and updates release verification, OCI tagging, upgrade tests, and migration documentation.

Changes:

  • Uses full Chart.AppVersion image tags.
  • Pins and verifies external release images.
  • Adds upgrade coverage and patch-pickup guidance.
File summaries
File Description
.github/scripts/prepare-release_test.sh Tests release-note warnings.
.github/scripts/release-cutover_test.sh Verifies publication ordering.
.github/scripts/release-oci-artifacts.sh Adds guarded OCI image tagging.
.github/scripts/release-oci-artifacts_test.sh Tests external image pinning.
.github/scripts/release-parity-manifest.sh Inspects staged full-version images.
.github/scripts/release-parity-manifest_test.sh Tests staged external references.
.github/scripts/release-verification.sh Expects full-version image tags.
.github/scripts/release-verification_test.sh Tests public installation verification.
.github/scripts/verify-release-manifest.mjs Enforces full-version references.
.github/scripts/verify-release-manifest_test.mjs Tests rejection of channel tags.
.github/scripts/verify-release-publication.sh Verifies version-pinned Deployment Engine.
.github/workflows/__build-helm-chart.yaml Pins external images before packaging.
deploy/Chart/README.md Documents image-tag migration.
deploy/Chart/templates/_helpers.tpl Removes stable-version truncation.
deploy/Chart/tests/helpers_test.yaml Tests final and patch defaults.
docs/contributing/contributing-releases/README.md Updates release prerequisites and behavior.
docs/release-notes/template.md Adds final-release migration notice.
docs/release-notes/template_patch.md Adds patch-release migration notice.
eng/design-notes/tools/2026-03-goreleaser-release-lifecycle-implementation-plan.md Documents phase 17 design.
pkg/cli/helm/helmclient_test.go Tests Helm upgrade semantics.
Review details
  • Files reviewed: 20/20 changed files
  • Comments generated: 4
  • Review effort level: Balanced

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +72 to +76
values := map[string]any{
"global": map[string]any{"imageTag": testCase.storedTag},
"rp": map[string]any{"publicEndpointOverride": "retained.example.test"},
"preupgrade": map[string]any{"enabled": true},
}
Comment thread deploy/Chart/README.md

**Patch updates require a chart upgrade.** Restarting pods no longer picks up a later patch through the moving `major.minor` alias. Upgrade the Radius CLI and run `rad upgrade kubernetes`, or upgrade to the desired chart version with Helm. Channel aliases remain published for existing consumers.

An upgrade adopts the new defaults when the previous installation used chart defaults. Explicit `global.imageTag`, component tags, and tagged or digest-pinned image paths remain respected. To remove a stored global channel override while preserving other user settings, use `rad upgrade kubernetes --set global.imageTag=`. Clear any component-specific tag or image overrides separately; `--reset-values` also discards unrelated stored settings.

## Upgrading to Radius vX.Y.Z

**Helm image pinning:** This release's Helm chart pins Radius component images to the full release version. Restarting pods no longer picks up later patches implicitly; upgrade the chart to receive patched images. Existing channel aliases remain available, and explicitly configured `global.imageTag`, component tags, or image references keep overriding chart defaults. Clear those overrides to adopt version-pinned defaults while retaining other settings.

This patch release includes the fixes listed in the [changelog](#changelog).

**Helm image pinning:** This release's Helm chart pins Radius component images to the full patch version. Restarting pods no longer picks up later patches implicitly; upgrade your CLI and run `rad upgrade kubernetes` to update the chart and images. Explicit channel-tag or image overrides remain respected; clear them to adopt version-pinned defaults.
@github-actions

github-actions Bot commented Sep 10, 2026

Copy link
Copy Markdown

Unit Tests

    2 files  ±0    460 suites  ±0   9m 5s ⏱️ +25s
6 577 tests +4  6 575 ✅ +4  2 💤 ±0  0 ❌ ±0 
7 878 runs  +4  7 876 ✅ +4  2 💤 ±0  0 ❌ ±0 

Results for commit af4029a. ± Comparison against base commit 9c54242.

♻️ This comment has been updated with latest results.

@codecov

codecov Bot commented Sep 10, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 59.83%. Comparing base (9c54242) to head (af4029a).

Additional details and impacted files
@@                       Coverage Diff                       @@
##           dp/release-publication-gate   #12953      +/-   ##
===============================================================
+ Coverage                        59.77%   59.83%   +0.06%     
===============================================================
  Files                              778      778              
  Lines                            45916    45916              
===============================================================
+ Hits                             27445    27474      +29     
+ Misses                           18471    18442      -29     

☔ 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.

@github-actions

github-actions Bot commented Sep 10, 2026

Copy link
Copy Markdown

Functional Tests - upgrade-noncloud

1 tests   0 ✅  5m 5s ⏱️
1 suites  0 💤
1 files    1 ❌

For more details on these failures, see this check.

Results for commit af4029a.

♻️ This comment has been updated with latest results.

@DariuszPorowski
DariuszPorowski force-pushed the dp/helm-immutable-image-tags branch from 3ee6d6e to c930cca Compare September 10, 2026 20:32
@DariuszPorowski
DariuszPorowski force-pushed the dp/helm-immutable-image-tags branch from c930cca to a8ba6fe Compare September 10, 2026 20:47
@DariuszPorowski
DariuszPorowski force-pushed the dp/helm-immutable-image-tags branch from a8ba6fe to 1ab9d33 Compare September 10, 2026 20:56
@github-actions

github-actions Bot commented Sep 10, 2026

Copy link
Copy Markdown

Functional Tests - kubernetes-noncloud

23 tests   23 ✅  8m 8s ⏱️
 1 suites   0 💤
 1 files     0 ❌

Results for commit 6a7bf54.

♻️ This comment has been updated with latest results.

@DariuszPorowski
DariuszPorowski force-pushed the dp/helm-immutable-image-tags branch from 1ab9d33 to d3e659e Compare September 10, 2026 21:41
@DariuszPorowski
DariuszPorowski force-pushed the dp/helm-immutable-image-tags branch 2 times, most recently from 17f1f4c to fb17fff Compare September 10, 2026 21:57
@DariuszPorowski
DariuszPorowski force-pushed the dp/helm-immutable-image-tags branch from fb17fff to 5bbff86 Compare September 10, 2026 22:27
@DariuszPorowski
DariuszPorowski force-pushed the dp/helm-immutable-image-tags branch 2 times, most recently from 99381a0 to f0a0e28 Compare September 11, 2026 04:01
@github-actions

github-actions Bot commented Sep 11, 2026

Copy link
Copy Markdown

Functional Tests - corerp-cloud

32 tests   31 ✅  21m 31s ⏱️
 2 suites   1 💤
 1 files     0 ❌

Results for commit d0322f1.

♻️ This comment has been updated with latest results.

@DariuszPorowski
DariuszPorowski force-pushed the dp/helm-immutable-image-tags branch from f0a0e28 to d0322f1 Compare September 11, 2026 04:29
@DariuszPorowski
DariuszPorowski force-pushed the dp/helm-immutable-image-tags branch from d0322f1 to 6a7bf54 Compare September 11, 2026 05:51
BREAKING CHANGE: Default stable chart images no longer pick up newer patches on pod restart. Upgrade the chart to update images; explicit tag overrides remain respected.

Signed-off-by: Dariusz Porowski <3431813+DariuszPorowski@users.noreply.github.com>
@DariuszPorowski
DariuszPorowski force-pushed the dp/helm-immutable-image-tags branch from 6a7bf54 to af4029a Compare September 11, 2026 06:12
@github-actions

Copy link
Copy Markdown

❌ Spellcheck Failed

There are spelling errors in your PR. Visit the workflow output to see what words are failing.

Adding new words

You can add new custom words to .cspellignore.

@radius-functional-tests

radius-functional-tests Bot commented Sep 11, 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 af4029a
Unique ID funcdc4bc113bd
Image tag pr-funcdc4bc113bd
  • 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-funcdc4bc113bd
  • 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-funcdc4bc113bd
  • dynamic-rp test image location: ghcr.io/radius-project/dev/dynamic-rp:pr-funcdc4bc113bd
  • controller test image location: ghcr.io/radius-project/dev/controller:pr-funcdc4bc113bd
  • ucp test image location: ghcr.io/radius-project/dev/ucpd:pr-funcdc4bc113bd
  • 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 corerp-cloud functional tests...
✅ ucp-cloud functional tests succeeded
✅ corerp-cloud functional tests succeeded

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Pin Helm charts to immutable image tags

2 participants