9.2 KiB
Pulse v6 Prerelease Runbook
This runbook captures the branch-specific operational path that was used while
main continued to serve v5 releases during the v6 prerelease period.
Canonical customer-channel and promotion rules now live in
docs/release-control/v6/internal/RELEASE_PROMOTION_POLICY.md.
Current release-branch authority lives in
docs/release-control/control_plane.json.
If this historical runbook and the release-control policy disagree, the
release-control policy wins.
Branch Model (Current)
main: v5 stable (current public/stable line)pulse/v6-release: active v6 prerelease and stable release line until an explicit post-GA branch cutover is governed
Do not move main to v6 during prerelease.
Enforced Workflow Policy
Release workflows now enforce branch/tag lineage rules:
Pulse Release Pipeline(create-release.yml)- Resolves stable versus prerelease branch requirements from
docs/release-control/control_plane.json. - For the current v6 profile, both stable and prerelease releases dispatch
from
pulse/v6-release.
- Resolves stable versus prerelease branch requirements from
publish-docker.yml,promote-floating-tags.yml,publish-helm-chart.yml, andupdate-demo-server.yml- Validate the release tag commit is reachable from the governed branch for
that version instead of assuming
main.
- Validate the release tag commit is reachable from the governed branch for
that version instead of assuming
update-demo-server.yml- Routes stable tags to the stable demo environment and prerelease tags to the separate v6 preview demo environment.
- The selected tag must still be reachable from the governed branch for that version.
This prevents accidental cross-line releases from non-governed branches even if the stable branch changes later.
Important Scope Note
The Pulse release workflow in this repo (.github/workflows/create-release.yml) builds from the checked-out Pulse ref and runs ./scripts/build-release.sh, which builds ./cmd/pulse.
It does not automatically check out or build pulse-enterprise.
That means public pulse-v... release archives are OSS runtime artifacts. They must not be
described as including Pulse Pro runtime features unless a separate Pro package has been built
from pulse-enterprise against the same Pulse ref and version.
Paid-user GA is blocked until the Pro release artifacts are built and wired into the paid
install/upgrade path. The current Pro packaging path lives in pulse-enterprise:
.github/workflows/build-pro-release.ymlscripts/build-pro-release.sh
The paid-user promise is only satisfied when paid customers are directed to pulse-pro-v...
artifacts, or to an explicitly verified paid container image, rather than the public OSS
pulse-v... archives.
Versioning Rules
- v5 stable examples:
5.1.14 - v6 prerelease examples:
6.0.0-rc.1,6.0.0-rc.2 - v6 GA example:
6.0.0
The workflow auto-marks -rc.N/-alpha.N/-beta.N as prerelease.
Preconditions for Each RC
pulse/v6-releaseis pushed and green in CI.VERSIONfile inpulse/v6-releaseexactly matches the release input version.- The current RC release packet is prepared and internally linked:
- release notes
- changelog
- operator support pack
docs/RELEASE_NOTES.mdpoints at the current in-repo draft packet
PULSE_LICENSE_PUBLIC_KEYsecret is present in GitHub Actions.- For any build after
v6.0.0-rc.2, operators know the update signer changed. Hosts pinned to the historicalrc.2trust root must not assume unattended continuity into later prerelease or GA artifacts; use a manual reinstall or other explicit trust-migration path before testing those newer packets. - For paid-user GA, run the
pulse-enterprisePro release workflow against the same Pulse ref/version, verifypulse-pro-v...archives exist, verifybin/pulse --versionidentifiesPulse Pro (Enterprise), and confirm the paid install/upgrade docs point paid customers to the Pro artifacts or verified paid container image.
RC Release Steps
- Update version on
pulse/v6-release:
export RC_VERSION="6.0.0-rc.2"
git checkout pulse/v6-release
git pull --ff-only
printf '%s\n' "$RC_VERSION" > VERSION
git add VERSION
git commit -m "chore(release): bump version to ${RC_VERSION}"
git push origin pulse/v6-release
-
Optional preflight dry run:
- Run workflow:
Release Dry Run - Ref:
pulse/v6-release - Inputs:
version:RC_VERSION- optional
note
- Run workflow:
-
Create draft prerelease:
- Run workflow:
Pulse Release Pipeline - Ref:
pulse/v6-release - Inputs:
version:RC_VERSIONrelease_notes: markdown text from the current release-notes packetdraft_only:true
- Keep the current release-notes, changelog, and operator-support packet in sync. Do not update only one of them and treat the packet as ready.
- Run workflow:
-
Validate draft outputs:
- Confirm assets exist and checksums match.
- Confirm GitHub release is marked prerelease.
- Smoke install on a test host/container.
-
Publish prerelease:
- Re-run
Pulse Release Pipelineonpulse/v6-release - Same
versionand release-notes packet draft_only:false- Existing unpublished draft releases for the same tag are updated in place
and their tag is retargeted to the current governed
pulse/v6-releasehead automatically. Do not delete the tag manually just to retry publish. - The release workflow dispatches
update-demo-server.ymlagainst thepreview-v6demo target automatically. - Keep the public stable demo on v5/stable; prereleases must land only on the separate preview demo runtime.
- Re-run
-
Canary rollout:
- Upgrade a small user subset first.
- Collect regressions, fix on
pulse/v6-release, then cutrc.2/rc.3as needed.
Keep v5 Stable During v6 RC
- Continue v5 patch releases from
mainas normal. - Do not merge
pulse/v6-releaseintomainduring prerelease. - Keep v5 and v6 changelogs/release notes separate.
- Do not rewrite shipped RC notes in place. Each RC should get its own draft or
published release-notes packet so
rc.1,rc.2, and later prerelease support context remain historically accurate.
GA Cutover (Only After RC Confidence)
Do this only when v6 is proven stable in production-like usage.
- Create v5 long-tail branch from current
main:
git checkout main
git pull --ff-only
git checkout -b pulse/v5-maintenance
git push -u origin pulse/v5-maintenance
- Keep the governed v6 release line on
pulse/v6-releasefor GA:
git checkout pulse/v6-release
git pull --ff-only
-
Release
6.0.0frompulse/v6-releaseusingPulse Release Pipeline. Before the real GA publish, run./scripts/trigger-release-dry-run.sh 6.0.0frompulse/v6-release. That helper validates the default-branch workflow-dispatch contract before calling GitHub so stalemainworkflow inputs fail locally instead of returning an opaque 422 fromgh workflow run. The governedRelease Dry Runmust still carry:version:6.0.0promoted_from_tag: exact prerelease tag being promotedrollback_version: prior stablega_date: exact published v6 GA datev5_eos_date: exact published v5 end-of-support date- optional
hotfix_exceptionandhotfix_reasonAfter the run passes, materialize the governed dated rehearsal record withpython3 scripts/release_control/record_rc_to_ga_rehearsal.py --run-id <run-id>. If--outputis omitted, that recorder writes todocs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-rehearsal-<record-date>.md. Attach that record, therc-to-ga-rehearsal-summaryartifact, and the run URL to the release ticket, and confirm the artifact carries the canonical promotion metadata envelope for that candidate: candidate stable tag, promotion channel, promoted prerelease tag, rollback target, exact rollback command, planned GA date, and planned v5 end-of-support date.
-
Publish the exact v6 GA date and v5 end-of-support date in the GA release notice using
docs/release-control/v6/internal/V5_MAINTENANCE_SUPPORT_POLICY.mdas the canonical policy. -
Continue critical v5 fixes from
pulse/v5-maintenanceonly.- The support window lasts 90 calendar days from v6 GA.
- Only critical security issues, critical correctness/data-loss issues, installer or updater failures, licensing or billing blockers, and safe migration blockers are eligible during that window.
- After that window, v5 is unsupported.
-
Treat any future move of stable v6 releases away from
pulse/v6-releaseas a separate post-GA governance change; do not assume an automatic cutover tomain.
Rollback Strategy
If an RC is bad:
- Do not promote to GA.
- Keep fixing on
pulse/v6-release. - Cut next RC.
- Keep v5 users on
mainstable releases.
If GA has a severe regression:
- Patch quickly on
pulse/v6-release(v6.0.1), or - Advise affected users to hold at prior stable while fix ships.
- Continue v5 emergency fixes from
pulse/v5-maintenanceonly if the published maintenance-only window is still active or I explicitly announce an exception.
Minimal Per-Release Checklist
- Version file matches workflow input.
- CI green on release ref.
- Draft release validated.
- Checksums and assets verified.
- Canary cohort upgraded successfully.
- Rollback note prepared before publish.