yugabyte/yb-voyager/update-yb-latest-stable
Claude Code and agent skill by yugabyte/yb-voyager
- community
Checking that the SKILL.md file is still in the repository.
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. Also covers bumping the bundled CDC connector version in yb-cdc-connector-versions.json. Use when updating latest stable YB version, yb-versions.json, the CDC/debezium connector version, yb-cdc-connector-versions.json, Jenkins YB cluster, or Voyager supported YB versions.
Install
npx vskill@latest install yugabyte/yb-voyager/update-yb-latest-stableSKILL.md
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.
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.
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_stable` must exactly match one entry in `version` (enforced in
prepare-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/:
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 `ybversion` constants in
src/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):
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.
Step 3.5: Assessment / analyze-schema report expectations — check after every latest-stable bump
assess-migration and analyze-schema default --target-db-version to latest_stable, so bumping it changes report content, and the expected files in migtests are compared near-verbatim (compare_json_reports in migtests/scripts/functions.sh ignores the TargetDBVersion field but NOT issue lists, descriptions, or counts).
What drifts and how to fix it
- Issues newly GA in the new target disappear from reports. Any issue whose GA map (
MinimumVersionsFixedIninsrc/query/queryissue/issues_*.go) gains an entry satisfied by the new latest stable — but was NOT satisfied by the old one — is dropped from assess-migration AND analyze-schema output (schema issues and query constructs alike). Find candidates by checking which issue types have aMinimumVersionsFixedInentry for the new series without an equivalent already-GA entry for the old latest-stable series. For each such type, delete its entries from every expected file below. - Complexity counts change. After adding/removing/re-leveling issues, recompute
MigrationComplexityandMigrationComplexityExplanationpercmd/migration_complexity.go: per-level complexity (L1: LOW ≤20 else MEDIUM; L2: LOW ≤10, MEDIUM ≤100, else HIGH; L3: LOW =0, MEDIUM ≤4, else HIGH), final = worst level; rationale string format differs per final complexity. - Summary invalid counts change. If an object (VIEW/FUNCTION/…) loses its only issue, decrement
InvalidCountfor that object type inSchemaSummary.DatabaseObjects(assessment) andSummary.DatabaseObjects(analysis report). - Tests that pin `TARGET_DB_VERSION` in `env.sh` (e.g.
pg/assessment-report-test-with-tdb) keep issues that are GA only in the new latest stable — do NOT drop them there.
Files to check (grep for the dropped issue types / changed strings)
migtests/tests/pg/assessment-report-test*/expectedAssessmentReport.jsonmigtests/tests/pg/basic-assessment-report-test/expectedAssessmentReport.{json,html}migtests/tests/pg/*/expected_files/expectedAssessmentReport.jsonandexpected_schema_analysis_report.json(sample schemas: sakila, stackexchange, osm, rna, mgi, omnibus, adventureworks, pgtbrus, …)migtests/tests/pg/*/expected_callhome_payloads/assess_migration_callhome.json(anonymized issue list + complexity explanation)migtests/tests/analyze-schema/expected_issues.json(+summary.jsonif invalid counts change)
Note: issue descriptions no longer embed the target version number (the "available as TP/EA in the target version — …" notes are version-independent since Sep 2026), so a bump alone should not churn description strings. If grep -r "in the target version (" migtests/ matches anything, something reintroduced the version — fix the code, not the expected files.
When editing these JSONs, preserve each file's existing indentation (some use 2 spaces, some 4, expected_issues.json uses an extra level) — the comparison normalizes via jq, but minimal diffs keep review sane.
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:
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.
Use the babysit skill to fix CI failures in a loop (do not weaken workflows to force green).
DO NOT MERGE until
- [ ] `TestDDLIssuesInYBVersion` passes for every entry in
yb-versions.jsonversion[](run locally before push; confirmed green in Issue Tests workflow) - [ ] `TestDMLIssuesInYBVersion` passes for every entry in
version[](same) - [ ] `yb_version_latest_stable` issue 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
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingai/skills/update-yb-latest-stable/SKILL.md
Popularity
- Repository stars
- 57
- Repository forks
- 23
- 7-day trend score
- 20
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/yugabyte/yb-voyager/update-yb-latest-stable)