This project uses JReleaser for automated releases to GitHub Releases and Maven Central.
-
Ensure all changes are committed and pushed
git status # Should be clean -
Trigger the release workflow
- Go to Actions → Release
- Click Run workflow
- Enter the release version (e.g.,
1.0.0) - Click Run workflow
-
What the workflow does
- Updates all
pom.xmlversions to the release version - Builds and signs artifacts (JARs, sources, javadoc) for both modules
- Deploys staging artifacts to local directories
- Commits and pushes the version change
- Creates a GitHub Release with auto-generated changelog
- Publishes both
minitermandminiterm-ffmto Maven Central - Bumps versions to the next
-SNAPSHOTand pushes
- Updates all
-
Verify the release
- Check GitHub Releases
- Check Maven Central (may take ~30 minutes)
# Validate JReleaser configuration
./mvnw jreleaser:config
# Test build with release profile (produces staged artifacts)
./mvnw clean deploy jreleaser:assemble -Prelease
# Inspect staged artifacts (all modules land here)
ls target/staging-deploy/
# Do a dry-run of the full release
./mvnw jreleaser:full-release -Djreleaser.dry.rungpg --gen-key
gpg --list-secret-keys --keyid-format=long
# Export keys (replace KEY_ID with your key ID)
gpg --armor --export KEY_ID > public.key
gpg --armor --export-secret-keys KEY_ID > private.key
# Publish to key server
gpg --keyserver keyserver.ubuntu.com --send-keys KEY_ID- Sign up at https://central.sonatype.com/
- Verify namespace ownership for
org.codejive - Generate a user token (username + password)
Add at Settings → Secrets → Actions:
| Secret | Description |
|---|---|
GPG_PUBLIC_KEY |
Contents of public.key |
GPG_SECRET_KEY |
Contents of private.key |
GPG_PASSPHRASE |
Passphrase used when generating the GPG key |
MAVENCENTRAL_USERNAME |
Maven Central token username |
MAVENCENTRAL_PASSWORD |
Maven Central token password |
GITHUB_TOKEN is provided automatically by GitHub Actions.
For an extra approval gate, create a jreleaser environment under Settings → Environments, add the same secrets there, and uncomment the environment: jreleaser line in .github/workflows/release.yml.
- Development versions use
-SNAPSHOTsuffix (e.g.,1.0.0-SNAPSHOT) - The workflow automatically bumps to the next patch SNAPSHOT after each release
- Use semantic versioning:
MAJOR.MINOR.PATCH - Use conventional commits for automatic changelog entries (
feat:,fix:,docs:, etc.)