The Release Process and Release Trains
A reviewed, compatibility-safe change merged to main is not yet released. Between your
merged PR and a user running the fix lies the release machinery: a schedule, a release
manager, a tracking issue, a build-and-bundle pipeline, and generated release notes. Unlike
the Apache model, there is no [VOTE] email and no formal release vote. Release decisions
happen openly in a dedicated repo, opensearch-build, coordinated through public GitHub
issues. This chapter is how OpenSearch ships, and — the part you actually need — exactly what
you must do to get a fix into a given release.
The opensearch-build Repo Is the Release Control Plane
The core engine lives in opensearch-project/OpenSearch, but a release is more than the
engine. OpenSearch ships as a bundle: the core distribution plus the standard plugins
(security, k-NN, SQL, alerting, index-management, ml-commons, observability, and the rest),
each from its own repo, assembled into a single coherent product at one version.
That assembly, the schedule, and the per-release coordination live in
opensearch-project/opensearch-build:
Lives in opensearch-build | Purpose |
|---|---|
| Release schedule | The published cadence and dates for upcoming releases |
| Manifests | Which repo/ref of each component goes into a given release version |
| Release-readiness issues | One tracking issue per release, aggregating every component's status |
| Build/assemble/test pipeline | Builds each component, bundles them, runs validation |
| Release notes tooling | Aggregates per-component CHANGELOG.md / PR data into release notes |
# The control plane (browse, don't clone unless you're release-managing):
# github.com/opensearch-project/opensearch-build
# Look for: the release schedule, the "Release version X.Y.Z" tracking issues,
# and the per-version manifests.
The key mental shift from Apache: the "release decision" is not a moment (an email vote passing). It is a process that becomes visibly done when the release-readiness issue's checklist is complete and the pipeline has produced validated artifacts.
Release Trains: Major, Minor, Patch
OpenSearch ships on trains — scheduled departures you either make or wait for.
| Train | Branch | Carries | Compatibility |
|---|---|---|---|
Major (3.0.0) | new line off main | Breaking changes, removed deprecations, new index format era | May break BWC vs previous major (within policy) |
Minor (3.1.0, 3.2.0) | main (the 3.x line) | New features, additive API, deprecations | Backward compatible within the major |
Patch (3.1.1, 2.18.1) | maintenance branch (2.x, 1.x) | Bug fixes, security fixes only | No new features; strict BWC |
main is the 3.x development line. 2.x is the active maintenance line (gets backported
fixes and minors). 1.x is legacy (security/critical fixes only). The train you can catch
depends on what your change is: a feature rides a minor off main; a bug fix can ride a
patch on a maintenance branch via backport.
Note: "Train" is not just a metaphor for cadence — it is a metaphor for the cutoff. A train leaves on a schedule whether or not your change is aboard. Miss the merge-and- backport deadline for a release and your fix waits for the next departure.
The Release Manager and the Readiness Issue
Each release has a release manager — a person (rotating, from the community/maintainers) who owns shepherding that version out. They are coordinator, not dictator: the work is done by each component's maintainers; the release manager tracks it.
Their primary instrument is the release-readiness tracking issue in opensearch-build,
which aggregates, per component:
- Is the component's release branch cut and code-frozen?
- Are all targeted PRs merged and backported by the cutoff?
- Are the
CHANGELOG.mdentries in place (they become the release notes)? - Do the integration tests / BWC tests / packaging tests pass in the bundle?
- Is the documentation (the separate
documentation-websiterepo) updated? - Are there any release-blocking issues open? (See issue-roadmap stage 12.)
The release ships when this checklist is green across components. That is the "vote" — conducted in checkboxes, in public, on a GitHub issue.
The Release Pipeline
flowchart TD
A[Changes merged to main and backport branches] --> B[Release branch cut / code freeze]
B --> C[Per-component build in opensearch-build]
C --> D[Assemble the bundle: core + standard plugins at one version]
D --> E[Version bumps applied: 3.x.0]
E --> F[RC build produced]
F --> G[Validation: integ tests, BWC, packaging, smoke]
G -->|Issues found| H[Fix, backport, new RC]
H --> F
G -->|Clean| I[Release notes generated from CHANGELOG + PRs]
I --> J[Documentation-website sync]
J --> K[GA release: artifacts published, announcement]
K --> L[Backport branches and main keep moving]
Reading the pipeline:
- Code freeze / release branch. At the cutoff, a release branch is cut. After this, only approved fixes land for that version — this is the firm edge of the train.
- Build and bundle.
opensearch-buildbuilds each component at the manifest-pinned ref and assembles them into one distribution. - Version bumps. Versions are incremented (
v3.x.0), including the internalVersionconstants the BWC machinery keys off (see maintainer-mindset). - RC and validation. Release candidate builds run the full validation: integration,
backward-compatibility and rolling-upgrade tests (from
qa/), packaging (deb/rpm/ docker/archives), and smoke tests. A failure spawns a fix → backport → new RC loop. - Release notes. Generated from the accumulated
CHANGELOG.mdentries and PR metadata — which is precisely why every PR must add a CHANGELOG line in the right section. - Docs sync. The
documentation-websiterepo is updated soopensearch.org/docsmatches the release. - GA. Artifacts are published and the release is announced.
CHANGELOG → Release Notes
This is the most direct connection between your PR and the release. Every PR to the core
repo adds a one-line entry to CHANGELOG.md under the unreleased section, categorized:
## [Unreleased 3.x]
### Added
- Add `include_unloaded_segments` to the nodes stats API ([#NNNN](https://github.com/opensearch-project/OpenSearch/pull/NNNN))
### Changed
### Fixed
- Fix DiskThresholdDecider off-by-one for relocating shards ([#MMMM](https://github.com/opensearch-project/OpenSearch/pull/MMMM))
### Deprecated
### Removed
### Security
At release time, the entries under the unreleased section for the version being cut are rolled up into the human-readable release notes. Consequences for you:
- A missing CHANGELOG entry means your change is invisible in the release notes — and the precommit/PR checks will usually catch the omission first.
- The section matters. On
mainyour entry sits under[Unreleased 3.x]. When you backport to2.x, the entry must move to[Unreleased 2.x]so it lands in the right release's notes. Mis-sectioning is a common backport-PR review comment (see GitHub review).
What You Must Do to Get a Fix Into a Given Release
This is the operational checklist. To land a fix in release X.Y.Z:
-
Merge to
mainbefore the cutoff. The fix has to be inmain(reviewed, green CI, CHANGELOG entry) before the release branch is cut for the train you want. -
Add the backport label for every maintenance line that needs it (e.g.
backport 2.x, andbackport 1.xif applicable) — at or before merge, so the backport bot opens the backport PR. -
Land the backport PR before the cutoff for that line's release. A backport that
misses the cutoff misses the train, even if
mainmade it. -
Put the CHANGELOG entry in the correct section on both
mainand the backport. -
Watch the release-readiness issue in
opensearch-buildfor the target version; if your change is release-blocking, make sure it's tracked there.
# Concretely, for a fix you want in the next 2.x patch:
# 1) Open the PR against main, with a CHANGELOG entry under [Unreleased 3.x].
# 2) Add the label `backport 2.x` to the PR.
# 3) After it squash-merges to main, the bot opens a backport PR against 2.x.
# 4) Move the CHANGELOG entry to [Unreleased 2.x] on the backport, get it reviewed and merged.
# 5) Confirm it's listed on the release-readiness issue for the target 2.x.Z version.
Warning: The two failure modes that cost contributors a release: (1) merging to
mainbut forgetting thebackportlabel, so the fix never reaches the maintenance line; and (2) the backport PR conflicting and sitting unresolved past the cutoff. Add the label early and resolve backport conflicts promptly. See release-blocking issues for the highest- stakes version of this.
Prove You Understand This
- Which repo is the release control plane, and what does a release-readiness issue track?
- There is no
[VOTE]email — so what is the artifact that signals a release is ready to ship? - Distinguish major / minor / patch trains by branch, contents, and BWC guarantee. Which train can carry a new feature?
- Trace your CHANGELOG entry from PR to release notes, including what changes when you
backport to
2.x. - You have a one-line bug fix you need in the next
2.xpatch release. List, in order, every step from opening the PR to confirming it's in the release. - Name the two most common ways a contributor's fix misses the train despite being merged to
main.
Next: The TSC and Project Governance — who sets the direction the trains run on.