CI/CD Pipelines

All CI/CD is handled by GitHub Actions. The workflows live in .github/workflows/.

Workflow overview

Workflow fileTriggerPurpose
gradle.ymlpush / PR to main (code paths)Full build, tests, coverage, Javadoc, dependency graph submission
publish.ymlpush to main — stable version onlyPublish all modules to Maven Central, create git tag and GitHub Release
publish-snapshot.ymlpush to main — SNAPSHOT version onlyPublish SNAPSHOT artifacts to Maven Central
jackson-compatibility.yamlPR touching jackson/**Matrix test against Jackson 2.13.x – 2.21.x
assertj-compatibility.yamlPR touching assertj/**Matrix test against AssertJ 3.21.x – 3.27.x
pages.ymlpush to mainBuild and deploy the documentation site to GitHub Pages

gradle.yml — Main CI build

Triggers: push to main on tracked paths, or any PR to main.

Uses dorny/paths-filter on PRs to skip the build entirely when no relevant file changed (e.g. a documentation-only commit).

What it does:

  1. Compiles all modules
  2. Runs all tests and uploads the aggregated JaCoCo coverage report to the PR
  3. Generates aggregated Javadoc
  4. Submits the dependency graph to GitHub for Dependabot

Local equivalent:

Terminal window
./gradlew build

Secrets required: none.


publish.yml — Stable release

Triggers: push to main when any of lib/**, jackson/**, assertj/**, gradle/**, gradle.properties, gradlew, gradlew.bat, or the workflow file itself changes.

Gotcha: the workflow reads version from gradle.properties at runtime. If the version ends with -SNAPSHOT, all subsequent steps are skipped — the workflow exits early. Only stable versions (e.g. 0.0.13) proceed.

What it does:

  1. Reads the version from gradle.properties
  2. Checks whether the git tag v{version} already exists — skips if it does (idempotent)
  3. Runs all tests (./gradlew test)
  4. Publishes all modules to Maven Central (./gradlew publishToMavenCentral --no-configuration-cache)
  5. Creates and pushes the git tag v{version}
  6. Creates a GitHub Release with auto-generated release notes

Secrets required:

SecretPurpose
MAVEN_CENTRAL_USERNAMEMaven Central portal username
MAVEN_CENTRAL_PASSWORDMaven Central portal password / token
SIGNING_KEY_IDGPG key ID (last 8 characters)
SIGNING_KEYGPG private key (armored, base64-encoded)
SIGNING_KEY_PASSWORDPassphrase for the GPG key

Local equivalent (dry-run only — do not publish locally):

Terminal window
./gradlew publishToMavenCentral --no-configuration-cache --dry-run

publish-snapshot.yml — SNAPSHOT publish

Triggers: same paths as publish.yml.

Gotcha: mirror of publish.yml — only proceeds when the version ends with -SNAPSHOT. Stable versions cause all steps to be skipped.

What it does:

  1. Reads the version; skips if not a SNAPSHOT
  2. Runs all tests
  3. Publishes to Maven Central’s snapshot repository via ./gradlew publishToMavenCentral

Secrets required: same five secrets as publish.yml.


jackson-compatibility.yaml — Jackson matrix

Triggers: PR where at least one changed file matches jackson/** or the workflow file itself.

Runs only on pull requests — not on push to main.

What it does: runs :jackson:test for each Jackson version in the matrix:

Jackson versionStatus
2.13.5tested
2.14.3tested
2.15.4tested
2.16.2tested
2.17.3tested
2.18.2tested
2.19.4tested
2.20.2tested
2.21.2tested

Local equivalent:

Terminal window
./gradlew :jackson:test -PjacksonVersion=2.17.3

Secrets required: none.


assertj-compatibility.yaml — AssertJ matrix

Triggers: PR where at least one changed file matches assertj/** or the workflow file itself.

Runs only on pull requests — not on push to main.

What it does: runs :assertj:test for each AssertJ version in the matrix:

AssertJ versionStatus
3.21.0tested
3.22.0tested
3.23.1tested
3.24.2tested
3.25.3tested
3.26.3tested
3.27.7tested

Local equivalent:

Terminal window
./gradlew :assertj:test -PassertjVersion=3.25.3

Secrets required: none.


pages.yml — Documentation site deploy

Triggers: push to main (no path filter — any push rebuilds the site).

What it does:

  1. Runs ./gradlew aggregateJavadoc to generate the API reference
  2. Copies the Javadoc output into site/public/javadoc/
  3. Runs npm run build inside site/
  4. Deploys the dist/ directory to GitHub Pages

Secrets required: none (uses GITHUB_TOKEN with pages: write permission).

Local equivalent:

Terminal window
./gradlew aggregateJavadoc
cd site && npm run build
# open dist/ in a local static server