Skip to content

[Devops] Branching Strategy - Phase 2.B - Release Versions #533

Description

@lowlydba

Goal

Implement CI release-event detection and the release process for main.

Scope: release trigger + vnext/main merge process + changelog machinery + docs. No publish workflows, those live in Phase 3 (#509), which this phase unblocks.

Implemented in PR #557.

Model (as implemented)

Humans own the full <major>.<minor>.<patch> in each package's pyproject.toml. Any version increase merged to main is a release; CI only versions the interim internal builds between releases.

  1. Every PR that changes a package carries a towncrier fragment (packages/<pkg>/changelog.d/), enforced by CI.
  2. A release PR bumps the version and runs towncrier build, folding fragments into that package's CHANGELOG.md (notes reviewed in the PR).
  3. On merge, release-trigger cuts one published GitHub Release per bumped package: tag <package>-v<version>, notes read back from CHANGELOG.md. The umbrella overture-schema release is marked Latest.
  4. No-bump merges get internal builds versioned <version>.postN+main.<sha> (or +vnext.<sha>), which order after the release for >= consumers and are rejected by public PyPI by construction.

Decisions resolved

Question Decision
Patch destination Patch is a human bump like any other, releases to PyPI. No-bump merges are internal-only .postN builds.
Changelog approach towncrier per-PR fragments, folded in the release PR, enforced by a CI check.
Release granularity Per-package tags (<pkg>-v<semver>); packages version independently.
Release gate None at the GH Release step; the human gate moves to a GitHub Environment approval on the Phase 3 PyPI publish job.
Internal build versioning PEP 440 post-releases; +dev.N rejected as not orderable. N is a per-version sequence (.post0 = identical to the release). Verified: >=X.Y.Z resolves .postN, ==X.Y.Z selects the clean release, > never matches (pin with >=).
Workspace dependency floors uv dual declaration: hand-maintained >= floors in project.dependencies alongside workspace sources. A major bump of a dependency must cascade to its dependents, enforced by CI.

Definition of done

  • release-trigger workflow live: detects per-package bumps, fails on version decreases, creates per-package Releases
  • vnext/main release PR process documented; Phase 1 workflows skip on head.ref == 'vnext'
  • Changelog fragments enforced by CI (require-changelog-fragment)
  • compute-version reworked to .postN internal builds (per-version sequence from CodeArtifact, .post0 first)
  • docs/versioning.md created, CONTRIBUTING.md updated
Original issue body (superseded, kept for history)

Goal (original)

Implement CI release-event detection and the release process for main.

Depends on Phase 2.A (#508), version scheme baseline and compute-version composite action must exist first.

1. Major/minor bump -> public PyPI release

  1. Human edits <major>.<minor> in any package's pyproject.toml and opens a PR to vnext (or main for non-breaking).
  2. PR merges normally.
  3. For breaking changes: maintainer opens a vnext->main PR (regular merge, not squash).
  4. On merge to main: p2-release-trigger detects the <major>/<minor> bump -> creates GH Release at v<major>.<minor>.0.
  5. GH Release event fires p3-pypi-publish (Phase 3) -> all affected packages publish to public PyPI.

2. Normal patch commits -> auto-versioned CA builds

  • Push to vnext: affected packages publish to CA dev as <major>.<minor>.<last-patch>+dev.<N>.
  • Push to main (no bump): affected packages publish to CA as <major>.<minor>.<next-patch>.

Both superseded: patch is now human-owned (releases like any bump), and +dev.N was replaced by .postN because local-only labels are not PEP 440 orderable.

Changelog options evaluated

  • Per-PR fragment files assembled at release time (antsibull pattern) -> adopted, via towncrier
  • Auto-generated from PR titles/descriptions -> rejected, poor quality
  • Manual release notes at release time -> rejected, added friction with no review trail

Activity

  1. changed the title [-][Devops] Branching Strategy - Phase 2.B[/-] [+][Devops] Branching Strategy - Phase 2.B Release Versions[/+] on May 20, 2026
  2. changed the title [-][Devops] Branching Strategy - Phase 2.B Release Versions[/-] [+][Devops] Branching Strategy - Phase 2.B - Release Versions[/+] on May 20, 2026
  3. added a commit that references this issue on Aug 5, 2026
    02d5538
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

enhancementNew feature or request

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions