Skip to content

feat(release): publish release candidates as GitHub prereleases - #260

Merged
ashishkurmi merged 2 commits into
step-security:mainfrom
venkata-stepsecurity:venkat/feat/release-candidate-prerelease
Oct 24, 2026
Merged

ashishkurmi merged 2 commits into
step-security:mainfrom
venkata-stepsecurity:venkat/feat/release-candidate-prerelease

Conversation

@venkata-stepsecurity

@venkata-stepsecurity venkata-stepsecurity commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

What does this PR do?

Adds a release-candidate stage to the release process, so a release can be tested on our own devices before customers get it.

  • New publish-prerelease.yml: runs the full Verify Release suite (same gate as publish-release.yml), then publishes the draft as a GitHub prerelease that is not marked latest. It refuses anything that is not a draft. agent-api mirrors a prerelease as a release-channel candidate and serves it only to rc tenants (step-security/agent-api#11639), so customers stay on the current release.
  • publish-release.yml now also passes --prerelease=false, so the same workflow promotes the tested candidate (same tag, same bytes) to latest. No change for a draft.
  • docs/release-process.md documents the new step. The full candidate-to-GA runbook with the agent-api SQS steps is in step-security/agent-api#11688 (docs/developer-mdm/release-candidates-runbook.md).

Release order becomes: Release, Release macOS, Publish Prerelease, test on rc devices, Publish Release.

Why the publish-release.yml change is needed: GitHub refuses to mark a prerelease as latest. Running today's gh release edit vX.Y.Z --draft=false --latest on a prerelease fails with Latest release cannot be draft or prerelease, so a hand-flagged prerelease could never be promoted by the existing workflow.

Type of change

  • Bug fix
  • Enhancement
  • Documentation

Testing

Tested in my fork with immutable releases enabled, using the real signed assets of v1.16.0 and v1.17.0 copied from this repo, so the real verification ran end to end (signed checksums, Authenticode, notarization):

Step Result
publish-release.yml on draft v1.16.0 (run) all checks pass, v1.16.0 published, latest, immutable
publish-prerelease.yml on draft v1.17.0 (run) all checks pass, v1.17.0 is a prerelease, immutable, latest stays v1.16.0, 42 assets unchanged
Upload or delete an asset, delete the tag on the prerelease rejected (Cannot upload assets to an immutable release, Cannot delete asset from an immutable release, tag delete 422)
publish-prerelease.yml on the published v1.16.0 (run) refused: not a draft
Old command --draft=false --latest on the prerelease fails: Latest release cannot be draft or prerelease
publish-release.yml on prerelease v1.17.0 (run) all checks pass again, v1.17.0 latest, prerelease cleared, assets and tag identical

Also found: GitHub lets a published release be flipped back to prerelease even when immutable, which moves Latest back. The docs say never to do that (agent-api keeps a promoted version GA regardless).

  • No secrets or credentials included

Related Issues

Part of the DMG staged release work. agent-api side: step-security/agent-api#11639 (release channel), step-security/agent-api#11688 (runbook).

Add publish-prerelease.yml, which runs the full Verify Release suite and
publishes a draft as a prerelease that is not marked latest, so agent-api
serves it only to release-channel rc tenants. publish-release.yml now
clears the prerelease flag too, so the same workflow promotes a validated
candidate to latest.
@ashishkurmi
ashishkurmi added this pull request to the merge queue Oct 24, 2026
Merged via the queue into step-security:main with commit 8cfc7cd Oct 24, 2026
16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants