Skip to content

ci(refactor-release): introduce release controller and swap triggers - #12872

Draft
DariuszPorowski wants to merge 6 commits into
dp/goreleaser-sbomsfrom
dp/release-controller-trigger-swap
Draft

DariuszPorowski wants to merge 6 commits into
dp/goreleaser-sbomsfrom
dp/release-controller-trigger-swap

Conversation

@DariuszPorowski

@DariuszPorowski DariuszPorowski commented Aug 29, 2026 •

Copy link
Copy Markdown
Member

Summary

Introduce the source-bound release controller and replace the legacy versions.yaml push trigger. Generated release PRs and metadata backports now resolve through one reusable controller; manual approval and recovery use secretless gateways into default-branch code.

Release plans are committed as schema v2 with frozen sibling repository SHAs. The controller validates and preflights every destination, verifies the exact signed Deployment Engine tag and image provenance, persists its digest lock, reconciles sibling repositories, and creates the Radius tag last with the release App. Existing release branches remove their legacy workflow through the generated metadata backport.

This stacked PR depends on #12869.

Draft gates:

Reason for change

The previous workflow inferred release intent from any versions.yaml push, created the Radius tag before all prerequisites completed, and had no source-bound resume entry point. This implements the approved PR15 transaction and recovery model.

Fixes #12813

How to test

  • make test-prepare-release test-release-controller test-release-plan test-release-backport test-release-tag-and-branch test-release-get-version test-monitor-remote-workflow test-release-cutover test-release-sboms with pinned yq v4.53.3
  • Failure injection after Deployment Engine, each sibling repository, and Radius tag creation resumes without duplicate dispatches or moved tags.
  • ShellCheck and shfmt pass for every changed shell file.
  • Prettier, markdownlint, and Markdown table checks pass.
  • Zizmor reports no findings for the new controller and gateway workflows.
  • Raw actionlint reports only its known stale-schema rejection of the documented GitHub concurrency.queue: max key.
  • Independent final review found no blocking issues.

File change summary

File Summary of change
.github/workflows/{release-controller,approve-release,resume-release}.yaml, reusable controller workflows Add automatic, approval, and recovery entry points with shared source-bound concurrency and least-privilege App identities.
.github/workflows/release.yaml, .github/scripts/release-should-skip.sh Remove the superseded branch-push release path and branch-existence special case.
.github/scripts/{prepare-release,validate-release-plan,validate-release-controller-plan,capture-release-sibling-commits}* Commit and validate immutable schema-v2 plans with frozen sibling SHAs and exact release commits.
.github/scripts/{monitor-remote-workflow,reconcile-release-controller-lock,verify-deployment-engine-*}* Correlate publisher work, bind signed-tag provenance, verify image platforms, and persist immutable DE digest state.
.github/scripts/{create-release-backport,release-create-tag-and-branch}* Preflight idempotent mutations and retire branch-local legacy workflows during metadata backports.
build/test.mk and controller fixtures Register focused failure-injection, plan, lock, provenance, and resume tests.
docs/contributing/contributing-releases/README.md Document controller approval, resume, immutable state, legacy cutover, and break-glass procedures.
eng/design-notes/tools/2026-09-goreleaser-stack-review/pr-15-release-controller.md Review note for this layer: what changed in review, why, the value, and the impact

@github-actions

github-actions Bot commented Aug 29, 2026 •

Copy link
Copy Markdown

Dependency Review

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

OpenSSF Scorecard

PackageVersionScoreDetails
actions/actions/checkout 3d3c42e5aac5ba805825da76410c181273ba90b1 🟢 7
Details
CheckScoreReason
Code-Review🟢 10all changesets reviewed
Binary-Artifacts🟢 10no binaries found in the repo
Maintained🟢 1017 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
CII-Best-Practices⚠️ 0no effort to earn an OpenSSF best practices badge detected
Pinned-Dependencies⚠️ 3dependency not pinned by hash detected -- score normalized to 3
License🟢 10license file detected
Fuzzing⚠️ 0project is not fuzzed
Packaging⚠️ -1packaging workflow not detected
Signed-Releases⚠️ -1no releases found
Security-Policy🟢 9security policy file detected
Branch-Protection🟢 6branch protection is not maximal on development and all release branches
SAST🟢 10SAST tool is run on all commits
actions/actions/create-github-app-token bcd2ba49218906704ab6c1aa796996da409d3eb1 🟢 5.1
Details
CheckScoreReason
Code-Review⚠️ 2Found 3/14 approved changesets -- score normalized to 2
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Maintained⚠️ 00 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Packaging⚠️ -1packaging workflow not detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Pinned-Dependencies🟢 7dependency not pinned by hash detected -- score normalized to 7
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
Security-Policy🟢 9security policy file detected
Branch-Protection🟢 6branch protection is not maximal on development and all release branches
SAST🟢 6SAST tool is not run on all commits -- score normalized to 6
actions/actions/github-script 3a2844b7e9c422d3c10d287c895573f7108da1b3 🟢 6.7
Details
CheckScoreReason
Maintained⚠️ 00 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Code-Review🟢 10all changesets reviewed
Packaging⚠️ -1packaging workflow not detected
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Binary-Artifacts🟢 10no binaries found in the repo
Token-Permissions🟢 9detected GitHub workflow tokens with excessive permissions
Pinned-Dependencies⚠️ 1dependency not pinned by hash detected -- score normalized to 1
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
Security-Policy🟢 9security policy file detected
SAST🟢 10SAST tool is run on all commits
Branch-Protection🟢 6branch protection is not maximal on development and all release branches
actions/actions/upload-artifact 043fb46d1a93c77aae656e7c1c64a875d1fc6a0a 🟢 5.2
Details
CheckScoreReason
Binary-Artifacts🟢 10no binaries found in the repo
Dangerous-Workflow🟢 10no dangerous workflow patterns detected
Maintained⚠️ 00 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Code-Review🟢 10all changesets reviewed
Packaging⚠️ -1packaging workflow not detected
Token-Permissions⚠️ 0detected GitHub workflow tokens with excessive permissions
Pinned-Dependencies⚠️ 1dependency not pinned by hash detected -- score normalized to 1
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
Security-Policy🟢 9security policy file detected
SAST🟢 10SAST tool is run on all commits
Branch-Protection⚠️ 0branch protection not enabled on development/release branches
actions/docker/setup-buildx-action 37fe631027851001ddb9b187196cc803df7f5f0e 🟢 8.6
Details
CheckScoreReason
Maintained🟢 1030 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
Security-Policy🟢 9security policy file detected
Code-Review🟢 10all changesets reviewed
Binary-Artifacts🟢 10no binaries found in the repo
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/__release-controller.yaml
  • .github/workflows/release.yaml

@DariuszPorowski DariuszPorowski changed the title ci: introduce release controller and swap triggers ci(refactor-release): introduce release controller and swap triggers Aug 29, 2026
Comment thread .github/workflows/__release-controller.yaml Fixed
Comment thread .github/workflows/__release-controller.yaml Fixed
Comment thread .github/workflows/__release-controller.yaml Fixed
@DariuszPorowski DariuszPorowski added the pr:standard Ongoing maintenance, minor improvements, documentation updates, and routine development work label Aug 29, 2026
@github-actions

github-actions Bot commented Aug 29, 2026 •

Copy link
Copy Markdown

Unit Tests

    2 files  +    2    459 suites  +459   7m 34s ⏱️ + 7m 34s
6 627 tests +6 627  6 625 ✅ +6 625  2 💤 +2  0 ❌ ±0 
7 935 runs  +7 935  7 933 ✅ +7 933  2 💤 +2  0 ❌ ±0 

Results for commit 56a5617. ± Comparison against base commit 38af438.

♻️ This comment has been updated with latest results.

@codecov

codecov Bot commented Aug 29, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
⚠️ Please upload report for BASE (dp/goreleaser-sboms@38af438). Learn more about missing BASE report.

Additional details and impacted files
@@                  Coverage Diff                   @@
##             dp/goreleaser-sboms   #12872   +/-   ##
======================================================
  Coverage                       ?   59.52%           
======================================================
  Files                          ?      772           
  Lines                          ?    45053           
  Branches                       ?        0           
======================================================
  Hits                           ?    26817           
  Misses                         ?    18236           
  Partials                       ?        0           

☔ 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 Aug 29, 2026 •

Copy link
Copy Markdown

Functional Tests - upgrade-noncloud

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

For more details on these failures, see this check.

Results for commit 56a5617.

♻️ This comment has been updated with latest results.

@DariuszPorowski
DariuszPorowski force-pushed the dp/release-controller-trigger-swap branch from 5b2ee48 to 12a1f75 Compare September 3, 2026 16:22
@github-actions

github-actions Bot commented Sep 3, 2026 •

Copy link
Copy Markdown

Functional Tests - corerp-noncloud

190 tests   188 ✅  1h 3m 26s ⏱️
  3 suites    2 💤
  1 files      0 ❌

Results for commit 039c78a.

♻️ This comment has been updated with latest results.

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.

🔵 Needs a closer look

The release-path redesign remains draft with live App-tag triggering and release-cycle soak gates still unverified.

Pull request overview

Replaces the legacy versions.yaml release trigger with a source-bound, resumable release controller that validates immutable release plans and creates the Radius tag last.

Changes:

  • Adds automatic, approval, and recovery controller entry points.
  • Introduces schema-v2 plans, frozen sibling commits, and Deployment Engine provenance locking.
  • Adds failure-injection tests and updates release documentation.
File summaries
File Description
.github/ghalint.yaml Removes obsolete release-workflow exception.
.github/scripts/capture-release-sibling-commits.sh Freezes sibling repository commits.
.github/scripts/capture-release-sibling-commits_test.sh Tests sibling commit capture.
.github/scripts/create-release-backport.sh Removes legacy workflow during metadata backports.
.github/scripts/create-release-backport_test.sh Tests backport cleanup.
.github/scripts/dispatch-release-controller.mjs Dispatches approved controller events.
.github/scripts/dispatch-release-controller_test.mjs Tests dispatch validation.
.github/scripts/monitor-remote-workflow.mjs Adds query-only and retry controls.
.github/scripts/monitor-remote-workflow_test.mjs Tests updated remote-run reconciliation.
.github/scripts/prepare-release.sh Generates schema-v2 committed plans.
.github/scripts/prepare-release_test.sh Tests plan generation.
.github/scripts/reconcile-release-controller-lock.mjs Persists Deployment Engine digest locks.
.github/scripts/reconcile-release-controller-lock_test.mjs Tests immutable lock behavior.
.github/scripts/release-controller-resume_test.sh Tests resumability after each stage.
.github/scripts/release-controller_test.sh Verifies controller workflow contracts.
.github/scripts/release-create-tag-and-branch.sh Adds non-mutating preflight mode.
.github/scripts/release-create-tag-and-branch_test.sh Tests preflight reconciliation.
.github/scripts/release-get-version_test.sh Removes legacy skip-path tests.
.github/scripts/release-should-skip.sh Deletes obsolete branch-wait logic.
.github/scripts/resolve-release-controller.mjs Resolves release and backport events.
.github/scripts/resolve-release-controller_test.mjs Tests controller input resolution.
.github/scripts/validate-release-controller-plan.sh Binds plans to exact release commits.
.github/scripts/validate-release-controller-plan_test.sh Tests controller-plan validation.
.github/scripts/validate-release-merge-group.sh Includes committed plans in merge validation.
.github/scripts/validate-release-merge-group_test.sh Updates merge-group fixtures.
.github/scripts/validate-release-plan.sh Validates schema-v2 plans and siblings.
.github/scripts/validate-release-plan_test.sh Tests immutable plan validation.
.github/scripts/verify-deployment-engine-image.sh Verifies image provenance and platforms.
.github/scripts/verify-deployment-engine-image_test.sh Tests image verification.
.github/scripts/verify-deployment-engine-tag.sh Verifies signed tag identity and target.
.github/scripts/verify-deployment-engine-tag_test.sh Tests strengthened tag checks.
.github/workflows/__changes.yml Removes deleted workflow classification.
.github/workflows/__dispatch-release-controller.yaml Adds reusable secretless dispatcher.
.github/workflows/__release-controller.yaml Implements staged release reconciliation.
.github/workflows/approve-release.yaml Adds manual approval gateway.
.github/workflows/prepare-release.yaml Captures and commits immutable plans.
.github/workflows/release-controller.yaml Adds trusted controller entry workflow.
.github/workflows/release.yaml Removes legacy release trigger.
.github/workflows/resume-release.yaml Adds manual recovery gateway.
build/test.mk Registers controller test suites.
docs/contributing/contributing-releases/README.md Documents the new release process.
Review details
  • Files reviewed: 41/41 changed files
  • Comments generated: 0
  • Review effort level: Balanced

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@DariuszPorowski
DariuszPorowski force-pushed the dp/release-controller-trigger-swap branch 2 times, most recently from a3e0c72 to 6fce55a Compare September 10, 2026 20:32
@DariuszPorowski
DariuszPorowski force-pushed the dp/release-controller-trigger-swap branch 2 times, most recently from 14cbcaf to 3cad501 Compare September 10, 2026 20:56
@DariuszPorowski
DariuszPorowski force-pushed the dp/release-controller-trigger-swap branch from 3cad501 to ed55a86 Compare September 10, 2026 21:41
@DariuszPorowski
DariuszPorowski force-pushed the dp/release-controller-trigger-swap branch from ed55a86 to 3c6d49e Compare September 10, 2026 21:47
@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
@github-actions

github-actions Bot commented Sep 18, 2026 •

Copy link
Copy Markdown

Functional Tests - samples-noncloud

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

Results for commit 187adaa.

♻️ This comment has been updated with latest results.

@DariuszPorowski
DariuszPorowski force-pushed the dp/release-controller-trigger-swap branch from 9356431 to 187adaa Compare September 18, 2026 20:32
@DariuszPorowski
DariuszPorowski force-pushed the dp/release-controller-trigger-swap branch from 187adaa to 17507da Compare September 18, 2026 21:05
@DariuszPorowski
DariuszPorowski force-pushed the dp/release-controller-trigger-swap branch from 17507da to e1afcd9 Compare September 18, 2026 21:44
@DariuszPorowski
DariuszPorowski force-pushed the dp/release-controller-trigger-swap branch from e1afcd9 to 5cfdebc 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 23:00
@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
@DariuszPorowski
DariuszPorowski force-pushed the dp/release-controller-trigger-swap branch from 5cfdebc to d5f4f9f Compare September 19, 2026 02:30
Signed-off-by: Dariusz Porowski <3431813+DariuszPorowski@users.noreply.github.com>
…r workflow

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>
Signed-off-by: Dariusz Porowski <3431813+DariuszPorowski@users.noreply.github.com>
…nd Deployment Engine token management

Signed-off-by: Dariusz Porowski <3431813+DariuszPorowski@users.noreply.github.com>
@DariuszPorowski
DariuszPorowski force-pushed the dp/release-controller-trigger-swap branch from d5f4f9f to 56a5617 Compare September 19, 2026 03:47
@radius-functional-tests

radius-functional-tests Bot commented Sep 19, 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 56a5617
Unique ID func2082b0edfe
Image tag pr-func2082b0edfe
  • 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-func2082b0edfe
  • 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-func2082b0edfe
  • dynamic-rp test image location: ghcr.io/radius-project/dev/dynamic-rp:pr-func2082b0edfe
  • controller test image location: ghcr.io/radius-project/dev/controller:pr-func2082b0edfe
  • ucp test image location: ghcr.io/radius-project/dev/ucpd:pr-func2082b0edfe
  • 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

@DariuszPorowski
DariuszPorowski removed this pull request from stack #13063 September 21, 2026 16:26
@DariuszPorowski
DariuszPorowski added this pull request to stack #13074 September 21, 2026 16:26

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:standard Ongoing maintenance, minor improvements, documentation updates, and routine development work

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Introduce the release controller and swap triggers

3 participants