Releasing
Paramixel is released through a manual process with CI validation. The release process is automated by scripts/release.sh.
Prerequisites
Maven Central credentials
A Maven settings.xml at ~/.m2/settings.xml with Sonatype Central credentials:
<settings>
<servers>
<server>
<id>central</id>
<username>YOUR_CENTRAL_USERNAME</username>
<password>YOUR_CENTRAL_TOKEN</password>
</server>
</servers>
</settings>
GPG signing key
Maven Central requires signed artifacts and that the signing key is published to public key servers.
# Generate a GPG key (if you don't have one)
gpg --full-generate-key
# RSA 4096, 2-year expiry recommended
# Get your Key ID
gpg --list-secret-keys --keyid-format=long
# Publish to key servers
gpg --keyserver keyserver.ubuntu.com --send-keys XXXXXXXXXXXXXXXX
gpg --keyserver keys.openpgp.org --send-keys XXXXXXXXXXXXXXXX
gpg --keyserver pgp.mit.edu --send-keys XXXXXXXXXXXXXXXX
# Verify signing works
echo "test" | gpg --batch --clearsign >/dev/null
Gradle Plugin Portal credentials
Publishing the Gradle plugin requires credentials for the Gradle Plugin Portal:
export GRADLE_PUBLISH_KEY=YOUR_KEY
export GRADLE_PUBLISH_SECRET=YOUR_SECRET
Conventions
- Release tag:
v<VERSION> - Release branch:
release/<VERSION> - Post-release development version:
<VERSION>-POST - Accepted version format:
MAJOR.MINOR.PATCHorMAJOR.MINOR.PATCH-label
Release process
Phase 1 — Prepare the release branch
./scripts/release.sh phase1 <VERSION>
Checks out main, pulls latest, creates the release/<VERSION> branch, sets the version across all modules, applies spotless formatting, commits, and pushes the branch. Prints CI wait instructions on completion.
If CI fails: fix the issue on the release branch, push, and wait for CI to pass again. If the issue requires changes on main, delete the release branch, fix main, and start over.
Phase 2 — Deploy to Maven Central
./scripts/release.sh phase2 <VERSION>
Checks out the release branch and deploys to Sonatype Central. The deployment remains in a pending state until you explicitly publish it in the next phase.
Phase 3 — Verify and publish to Maven Central
./scripts/release.sh phase3
Maven Central releases are immutable and cannot be undone or overwritten. Before proceeding, verify the deployment at Sonatype Central:
- Confirm the version number is correct
- Confirm the artifacts (JAR, sources, javadoc, POM) are present and valid
- Confirm GPG signatures are present
Prompts for confirmation, then publishes the deployment.
Phase 4 — Tag the release
./scripts/release.sh phase4 <VERSION>
Creates an annotated tag v<VERSION> and pushes it to origin.
Phase 5 — Bump main to the next development version
./scripts/release.sh phase5 <VERSION>
Checks out main, pulls latest, sets the version to <VERSION>-POST across all modules, applies spotless formatting, runs ./mvnw clean install, commits, and pushes.
Phase 6 — Publish the Gradle plugin
This phase is not yet automated. Publish the Gradle plugin to the Gradle Plugin Portal manually:
JAVA_17_HOME=/path/to/jdk17 ./scripts/build.sh gradle-plugin
cd gradle-plugin
GRADLE_PUBLISH_KEY=YOUR_KEY \
GRADLE_PUBLISH_SECRET=YOUR_SECRET \
JAVA_HOME="$JAVA_17_HOME" \
./gradlew publishPlugins --no-daemon
cd ..
Troubleshooting
- GPG signing failed — Verify your key is valid and unexpired with
gpg --list-secret-keys. Test withecho "test" | gpg --batch --clearsign. - Maven settings not found — Create
~/.m2/settings.xmlwith Sonatype Central credentials. - Tag already exists — Check with
git tag -l; delete if stale withgit tag -d vX.Y.Z. - Central deployment fails — Verify credentials at https://central.sonatype.com and ensure your GPG public key is published to key servers.
Error recovery
- CI fails on the release branch: Fix on the branch or delete it and start over. No tag or deploy has happened yet.
- Maven Central deploy fails: Do not push the tag. Fix the issue and retry the deploy.
- Deploy succeeded but publish not yet done: Retry
./mvnw -Prelease central-publishing:publish, or drop the deployment with./mvnw -Prelease central-publishing:dropto start over. - Tag pushed but deploy failed: Delete the remote tag (
git push origin :refs/tags/vX.Y.Z), fix the issue, redeploy, then re-tag. - Post-release bump failed on main: Manually set the version, commit, and push.