Versioning and releases¶
Semantic versioning¶
Migrax versions follow Semantic Versioning: MAJOR.MINOR.PATCH.
| Change | Example | Version bump |
|---|---|---|
| Bug fix, no behavior change you rely on | wrong column type fixed | 0.1.0 → 0.1.1 |
| New feature, backward compatible | new command, new framework | 0.1.1 → 0.2.0 |
| Breaking change | renamed option, new snapshot format | 0.x: minor; from 1.0.0: major |
Before 1.0.0, a minor release may change commands, options and configuration keys; the
changelog says how to upgrade. From 1.0.0, these are stable within a major version: CLI
commands and options, exit codes, configuration keys, the snapshot format, migration file and
directive formats, and the JavaMigration API.
Pre-releases are marked -rc.N (0.2.0-rc.1). Between releases, the code on main carries the
next version with -SNAPSHOT (0.2.0-SNAPSHOT).
Release tags¶
Each release is an annotated git tag vX.Y.Z on main. Pushing the tag builds and tests
Migrax and publishes a GitHub release with:
migrax-X.Y.Z.zip: the command line tool and installers;migrax-X.Y.Z.jar: the core library and Maven plugin;- the integration jars (Spring Boot, Quarkus, Micronaut, Helidon, Gradle).
Release notes come from the changelog.
Branches¶
Migrax uses short-lived branches that merge into main through pull requests:
| Branch | Purpose | Example |
|---|---|---|
main |
Always releasable; protected; every change arrives by pull request with green CI | |
feature/<name> |
New functionality | feature/sqlite-dialect |
fix/<name> |
Bug fixes (add the issue number when there is one) | fix/42-mysql-enum-length |
docs/<name> |
Documentation only | docs/micronaut-guide |
refactor/<name>, test/<name>, ci/<name>, chore/<name> |
Other changes | ci/hibernate-matrix |
release/X.Y.Z |
Preparing a release: version, changelog, last fixes | release/0.2.0 |
hotfix/X.Y.Z |
Urgent fix for a released version, branched from its tag | hotfix/0.1.1 |
Branch names are lowercase, with words separated by hyphens.
Commit messages¶
Commits follow Conventional Commits:
feat(cli): add --impact to plan
fix(hibernate): read identity columns on Hibernate 6.3
docs: add the Helidon guide
chore(release): 0.2.0
Types: feat, fix, docs, refactor, perf, test, build, ci, chore. A breaking
change adds ! (feat(cli)!: rename --dir to --project) and a BREAKING CHANGE: footer that
explains the upgrade.
How a release is made¶
- Create
release/X.Y.Zfrommain. - Set the version everywhere with
scripts/set-version.sh X.Y.Z. - Move the
Unreleasedchangelog entries under## [X.Y.Z] - YYYY-MM-DD. - Open a pull request, wait for green CI, merge into
main. - Tag the merge:
git tag -a vX.Y.Z -m "Migrax X.Y.Z"andgit push origin vX.Y.Z. - Set
mainto the next development version:scripts/set-version.sh X.Y.(Z+1)-SNAPSHOT.