name: update-yb-latest-stable description: >- Bump YugabyteDB latest_stable in yb-versions.json, coordinate Jenkins migtest cluster upgrades, fix version-gated issue/integration tests, and open a PR only after all GitHub Actions pass. Use when updating latest stable YB version, yb-versions.json, Jenkins YB cluster, or Voyager supported YB versions.
Update Latest Stable YugabyteDB Version
Single source of truth: yb-voyager/versions/yb-versions.json. GitHub Actions read it via .github/workflows/prepare-versions.yml. Jenkins migtests use a separate long-lived YB cluster (env vars), not this file directly.
Before you start
- Confirm the new stable release tag from YugabyteDB releases (full string with build, e.g.
2025.2.4.0-b150). - Confirm the Docker image exists:
yugabytedb/yugabyte:<tag>. - Create a branch:
update-yb-latest-stable-<version>(e.g.update-yb-latest-stable-2025.2.4.0).
Step 1: Update yb-versions.json
Edit yb-voyager/versions/yb-versions.json. How you change version[] depends on the bump type.
Always set latest_stable to the new full tag (e.g. 2025.2.4.0-b150).
A. Same stable series — patch/minor (e.g. 2025.2.3 → 2025.2.4)
Replace the existing entry for that series in place; do not prepend a second 2025.2.* line.
// Before
"version": ["2025.2.3.0-b149", "2025.1.3.2-b1", ...],
"latest_stable": "2025.2.3.0-b149"
// After
"version": ["2025.2.4.0-b150", "2025.1.3.2-b1", ...],
"latest_stable": "2025.2.4.0-b150"
B. New stable series released (e.g. 2025.2 becomes latest stable)
Prepend the new series tag to version[]. Keep older series (e.g. 2025.1.*) in the list for CI matrix coverage unless maintainers retire them.
// Before
"version": ["2025.1.3.2-b1", "2024.2.8.0-b85", ...],
"latest_stable": "2025.1.3.2-b1"
// After — prepend 2025.2.*, keep 2025.1.*
"version": ["2025.2.3.0-b149", "2025.1.3.2-b1", "2024.2.8.0-b85", ...],
"latest_stable": "2025.2.3.0-b149"
Only remove an older series entry when the team explicitly drops Voyager support for that release line.
C. Adding support without changing latest stable
Rare — only when bumping version[] for matrix coverage while latest_stable stays on another tag. Coordinate with maintainers.
Rules (all cases)
latest_stablemust exactly match one entry inversion(enforced inprepare-versions.yml).- At most one tag per stable series in
version[](e.g. one2025.2.*, not both2025.2.3and2025.2.4— use in-place replace for that case). - Version format:
A.B.C.D-b<N>(four numeric segments + build). - Order: newest / current stable series first is the convention.
Step 2: Code that auto-tracks latest_stable (usually no edit)
These read yb-versions.json at build/runtime — no change for a typical bump:
yb-voyager/versions/versions.go(GetLatestStableYBVersion, embedded JSON)yb-voyager/src/ybversion/constants.go—LatestStableis set fromversions.GetLatestStableYBVersionWithoutBuildNumber()ininit()- All workflows using
prepare-versionsoutputs (yb_latest_stable,yb_versionsmatrix)
Step 3: Issue tests — required after every bump
YB version bumps often change error messages or fix issues. Always run and fix the issue integration tests before opening the PR.
DDL / DML issue tests (mandatory)
From yb-voyager/:
export YB_VERSION=$(jq -r '.latest_stable' versions/yb-versions.json)
# All supported versions (matches CI issue-tests matrix)
for v in $(jq -r '.version[]' versions/yb-versions.json); do
echo "=== DDL issues @ $v ==="
YB_VERSION="$v" go test -tags issues_integration -run '^TestDDLIssuesInYBVersion$' -count=1 -timeout=30m ./src/query/queryissue/
echo "=== DML issues @ $v ==="
YB_VERSION="$v" go test -tags issues_integration -run '^TestDMLIssuesInYBVersion$' -count=1 -timeout=30m ./src/query/queryissue/
done
# Latest-stable-only tag (CI also runs this)
go test -tags 'issues_integration,yb_version_latest_stable' -count=1 -timeout=30m ./src/query/queryissue/...
Files to inspect when tests fail:
yb-voyager/src/query/queryissue/issues_ddl_test.go—TestDDLIssuesInYBVersionyb-voyager/src/query/queryissue/issues_dml_test.go—TestDMLIssuesInYBVersionyb-voyager/src/query/queryissue/issues_ddl.go/issues_dml.go—MinimumVersionsFixedIn, issue definitionsyb-voyager/src/query/queryissue/issues_ddl_test.go—assertErrorCorrectlyThrownForIssueForYBVersion
Debugging and fixing failing issue tests
For each failure:
- Identify the subtest — use
-run 'TestDMLIssuesInYBVersion/copy_from_where'(or the failingt.Runname). - Compare exec error vs expectation — log
errfromconn.Exec; YB may return a different message or no error on newer builds. - Check
issue.IsFixedIn(testYbVersion)— if the issue is marked fixed for this series, tests expect success (assert.NoError), not the old error string. - Add version gates when behavior changes at a specific 3-dot release (e.g.
ybversion.V2025_2_3_0,packaging.version.Versionin migtestvalidatescripts). - Add
ybversionconstants insrc/ybversion/constants.goonly when tests compare against a newV*constant. - Re-run the single failing subtest, then the full
TestDDLIssuesInYBVersion/TestDMLIssuesInYBVersionfor thatYB_VERSION.
External YB (matches local psql instead of testcontainers):
export YB_CONN_STR="postgresql://yugabyte:yugabyte@127.0.0.1:5433/yugabyte?sslmode=disable"
YB_VERSION=$(jq -r '.latest_stable' versions/yb-versions.json)
go test -tags issues_integration -run '^TestDMLIssuesInYBVersion$' -count=1 -v ./src/query/queryissue/
Other tests that commonly fail on version bumps
Run and fix as needed (do not ignore red CI):
| Test area | Command / workflow |
|---|---|
| Issue tests (all) | go test -tags issues_integration ./src/query/queryissue/... |
| Latest-stable tag | go test -tags yb_version_latest_stable ./... |
| Integration / live migration | .github/workflows/integration-tests.yml |
| Failpoints | .github/workflows/failpoint-tests.yml |
| Migtests | pg-13-migtests, pg-17-migtests, mysql-migtests, misc-migtests |
| Unit | go test -tags unit ./... |
If any test fails: reproduce locally, root-cause against the new YB behavior, fix test expectations or product code in this PR, re-run until green. Do not merge with failing or skipped issue tests.
rg "2025\.2\.3|V2025_2_3|latest_stable" yb-voyager migtests
Step 4: Optional follow-up edits (product behavior)
| Area | When to touch |
|---|---|
yb-voyager/src/ybversion/constants.go |
New 3-dot gate needed |
migtests/tests/**/validate |
Version-specific extension or behavior checks |
yb-voyager/config-templates/*.yaml |
Docs mention minimum YB version |
yb-voyager/cmd/*.go help text |
User-facing minimum version strings |
Step 5: Jenkins pipeline (external cluster)
Jenkins config is not in this repo. Migtests run via migtests/scripts/jenkins-wrapper against a cluster set by Jenkins job env vars (TARGET_DB_HOST, TARGET_DB_PORT, etc. — see migtests/scripts/yugabytedb/env.sh defaults).
Required (human / infra):
- Upgrade the Jenkins shared YugabyteDB cluster to
<NEW_VERSION>(same build aslatest_stable). - Re-run the Jenkins migtest job(s) for this PR branch after upgrade.
- Verify:
psql "postgresql://yugabyte:<password>@<TARGET_DB_HOST>:<TARGET_DB_PORT>/yugabyte" \
-c "SELECT version();"
PR description must note: Jenkins cluster upgraded (or infra ticket) and Jenkins job name + result.
Do not change migtests/scripts/yugabytedb/env.sh default host unless intentionally moving the shared dev cluster for everyone.
Step 6: Open PR and monitor CI
Push branch and create PR to main. Use the pr-description skill.
git push -u origin HEAD
gh pr checks --watch
gh pr checks --json name,state,link --jq '.[] | select(.state != "SUCCESS")'
Use the babysit skill to fix CI failures in a loop (do not weaken workflows to force green).
DO NOT MERGE until
-
TestDDLIssuesInYBVersionpasses for every entry inyb-versions.jsonversion[](run locally before push; confirmed green in Issue Tests workflow) -
TestDMLIssuesInYBVersionpasses for every entry inversion[](same) -
yb_version_latest_stableissue tests pass (go test -tags yb_version_latest_stable ./src/query/queryissue/...) - Any other failing test is debugged and fixed in this PR — reproduce locally, update expectations or code, re-run the failing package/workflow; no “known failure” left behind without maintainer sign-off
- All required GitHub Actions checks are green (see table below)
- Jenkins migtests run against the upgraded cluster (if required for this repo/team) with result linked in the PR
- No unresolved review comments on the version bump
GitHub Actions checklist
| Workflow | What it exercises |
|---|---|
Go |
Unit tests, staticcheck |
Build Voyager |
Installer / build |
Integration Tests |
Live migration @ yb_latest_stable |
Failpoint Tests |
Failpoint flows @ yb_latest_stable |
Issue Tests |
DDL/DML issue tests matrix over all version[] + yb_version_latest_stable |
PG 13: Migration Tests |
Migtests matrix per yb_versions |
PG 17: Migration Tests |
Migtests matrix per yb_versions |
MySQL: Migration Tests |
Migtests matrix per yb_versions |
Misc Migration Tests |
Import-file tests per yb_versions |
Common failures after a bump
| Failure | Likely fix |
|---|---|
prepare-versions — latest_stable not in version |
Fix JSON alignment |
TestDDLIssuesInYBVersion / TestDMLIssuesInYBVersion |
Update assertErrorCorrectlyThrownForIssueForYBVersion expected strings, MinimumVersionsFixedIn, or version branches |
| Issue tests — testcontainers vs local YB differ | Use YB_CONN_STR for local cluster; document docker image gap |
Migtests — extension list in validate |
Version-gate expectedExtensions (e.g. pg_parquet only before 2025.2.3) |
| Integration tests — image pull | Ensure yugabytedb/yugabyte:<tag> exists |
PR title / commit message
chore: bump latest stable YugabyteDB to <NEW_VERSION>