Goal
Build and publish packages to the right destinations using version strings computed by Phase 2. Each workflow has one trigger and one destination. No version logic lives here.
vnext dev builds to CodeArtifact are out of scope here, split to Phase 4 (#510): they're blocked on a CodeArtifact repo that doesn't exist yet (ops-team#299), so this phase can ship and close without waiting on that migration.
Trigger x destination matrix
| Trigger |
Workflow |
Packages |
Version |
Destination |
Push to main, no bump |
main-publish.yaml |
affected only |
<version>.postN+main.<sha> |
CodeArtifact |
| GitHub Release published (manual bump) |
release-publish.yaml |
released package |
<version> |
Public PyPI (upstreamed by all internal CA) |
Push to vnext |
see Phase 4 (#510) |
affected only |
<version>.postN+vnext.<sha> |
⛔ Blocked on ops-team#299 |
CodeArtifact: domain overture-pypi / account 505071440022 / region us-west-2.
Tasks
Internal builds -> CodeArtifact
Releases -> PyPI
Docs
Require the new CI checks
Consumer guidance
Internal consumers (CDP) pin >=X.Y.Z per package: this resolves the freshest .postN build from CodeArtifact and falls back to the clean release. Never pin >, PEP 440 excludes post-releases from exclusive comparisons. Verified against uv in Phase 2.B.
Definition of done
Original issue body (superseded, kept for history)
Original matrix used +dev.N (vnext) and CI-computed <next-patch> (main), with public PyPI on major/minor bumps only:
| Trigger |
Version |
Destination |
Push to vnext |
<last-published>+dev.N |
CA dev repo |
Push to main (no major/minor bump) |
<major>.<minor>.<next-patch> |
TBD |
Major/minor bump on main |
<major>.<minor>.0 |
Public PyPI |
The patch-destination decision (Option A: patches to PyPI; Option B: CA only) was superseded by making patch a human-owned bump like any other: deliberate patch bumps release to PyPI, and no-bump merges publish internal-only .postN builds. +dev.N was dropped because local-only labels are not PEP 440 orderable, so >= consumers could never resolve them.
CDP pin guidance was >=<last-published>+dev.0; now plain >=X.Y.Z.
Goal
Build and publish packages to the right destinations using version strings computed by Phase 2. Each workflow has one trigger and one destination. No version logic lives here.
vnextdev builds to CodeArtifact are out of scope here, split to Phase 4 (#510): they're blocked on a CodeArtifact repo that doesn't exist yet (ops-team#299), so this phase can ship and close without waiting on that migration.Trigger x destination matrix
main, no bumpmain-publish.yaml<version>.postN+main.<sha>release-publish.yaml<version>vnext<version>.postN+vnext.<sha>CodeArtifact: domain
overture-pypi/ account505071440022/ regionus-west-2.Tasks
Internal builds -> CodeArtifact
mainwith no version bumps.compute-versionaction (maincontext), build + publish to CodeArtifact. Workspace dependency floors are declared statically in eachpyproject.toml(dual declaration), so no metadata rewriting is needed at build time.Releases -> PyPI
release-trigger.yamlcreates the release with theoverture-release-publisherapp's installation token (provisioned via Provisionoverture-release-publisherGitHub App for Phase 3 release publishing #637) instead ofGITHUB_TOKEN, so the release actually fires therelease: publishedevent this workflow needs.pypi-release) approval (required reviewers) on this job.Docs
docs/versioning.mdwith the matrix above and consumer pin guidance.compute-versions-dry-run.yamland the legacypublish-python-packages.yamlonce real publish workflows are live.Require the new CI checks
omf-github-terraform) and [Devops] Stabilize schema CI check names for required-status-check pinning #647 (check-name stability fixes in this repo, a prerequisite for pinning more of [Devops] Wire schema's CI checks up as required status checks (safe-settings in omf-github-terraform) #646's checks).Consumer guidance
Internal consumers (CDP) pin
>=X.Y.Zper package: this resolves the freshest.postNbuild from CodeArtifact and falls back to the clean release. Never pin>, PEP 440 excludes post-releases from exclusive comparisons. Verified against uv in Phase 2.B.Definition of done
overture-release-publisherGitHub App for Phase 3 release publishing #637,overture-release-publisherapp token inrelease-trigger.yaml)main-publish.yamlrelease-publish.yaml, tested against a real releasedocs/versioning.mdupdated; dry-run + legacy publish workflows retired>=picks.postN)Original issue body (superseded, kept for history)
Original matrix used
+dev.N(vnext) and CI-computed<next-patch>(main), with public PyPI on major/minor bumps only:vnext<last-published>+dev.Nmain(no major/minor bump)<major>.<minor>.<next-patch>main<major>.<minor>.0The patch-destination decision (Option A: patches to PyPI; Option B: CA only) was superseded by making patch a human-owned bump like any other: deliberate patch bumps release to PyPI, and no-bump merges publish internal-only
.postNbuilds.+dev.Nwas dropped because local-only labels are not PEP 440 orderable, so>=consumers could never resolve them.CDP pin guidance was
>=<last-published>+dev.0; now plain>=X.Y.Z.