Skip to main content

Publishing

Bleep has built-in publishing to local repositories, private Maven registries, and Sonatype / Maven Central.

Quick Start

Add publish config to your project:

projects:
mylib:
publish:
groupId: io.github.myname

Then publish:

# To GitHub Packages
bleep publish github --to myname/myrepo --version 0.1.0

# To local ivy cache
bleep publish local --version 0.1.0

# With git tag versioning (no --version needed)
git tag v0.1.0
bleep publish github --to myname/myrepo

Interactive Setup

bleep publish setup

This wizard walks you through configuring your publishing target. For Sonatype, it generates GPG keys and tells you which CI environment variables to set.

Configuration

The publish field

Add publish to any project (or template) to mark it as publishable:

templates:
template-publishable:
publish:
groupId: com.mycompany
repository: company-releases # named resolver
description: My library
url: https://github.com/mycompany/mylib
organization: My Company
developers:
- id: dev1
name: Developer One
url: https://github.com/dev1
licenses:
- name: MIT
url: http://opensource.org/licenses/MIT
distribution: repo

projects:
mylib:
extends: template-publishable
publish:
description: Specific lib description # overrides template

mylib-tests:
# no publish field = not published

Projects without publish are never published. All publish fields merge through templates using the same rules as other bleep config.

Named resolvers

Give your resolvers names so you can reference them from publish.repository:

resolvers:
- name: company-releases
type: maven
uri: artifactregistry://europe-north1-maven.pkg.dev/project/release

All publish fields

FieldDescription
groupIdMaven groupId (required)
repositoryNamed resolver to publish to
descriptionProject description (POM)
urlProject homepage (POM)
organizationOrganization name (POM)
developersList of {id, name, url} (POM)
licensesList of {name, url, distribution} (POM)
sonatypeProfileNameSonatype profile (defaults to groupId)
sonatypeCredentialHostSonatype host (defaults to central.sonatype.com)

Publishing Targets

Local

bleep publish local # to ~/.ivy2
bleep publish local --to /path/to/repo # to custom maven folder

GitHub Packages

bleep publish github --to owner/repo

Credentials come from gh auth token. Prerequisites: install GitHub CLI, run gh auth login.

Google Artifact Registry

bleep publish artifactregistry --to artifactregistry://region-maven.pkg.dev/project/repo

Credentials come from gcloud auth print-access-token. Prerequisites: install Google Cloud SDK, run gcloud auth login.

For multi-account setups, configure which account to use:

bleep config auth setup

GitLab Package Registry

bleep publish gitlab --to gitlab://gitlab.com/api/v4/projects/12345/packages/maven

Credentials come from glab auth token. Prerequisites: install GitLab CLI, run glab auth login.

Sonatype / Maven Central

bleep publish sonatype

This compiles, packages, signs with GPG, generates checksums, and uploads to Maven Central. Version is derived from git tags automatically (via DynVer).

Prerequisites

  1. A Sonatype account at central.sonatype.com
  2. Publishing rights for your groupId
  3. GPG key for signing artifacts
  4. CI environment variables set

First-time setup

Run bleep publish setup and select "Sonatype / Maven Central". The wizard will:

  • Generate a GPG key pair
  • Upload the public key to a keyserver
  • Tell you exactly which CI environment variables to set

Environment variables

VariableDescription
SONATYPE_USERNAMESonatype user token username
SONATYPE_PASSWORDSonatype user token password
PGP_SECRETBase64-encoded GPG private key
PGP_PASSPHRASEGPG key passphrase

Get Sonatype tokens at: central.sonatype.com > username > View Account > Generate User Token.

Version Management

Version is determined by (in priority order):

  1. --version X flag, explicit override
  2. Git tags via DynVer, automatic, derived from git describe

DynVer examples:

  • On tag v1.0.0 (clean) → 1.0.0
  • 3 commits after v1.0.01.0.0+3-abcdef12
  • Dirty working tree → 1.0.0+0-abcdef12+20260327-1430

For Sonatype, snapshot versions (any version not cleanly on a tag) get -SNAPSHOT appended.

Getting the version into the artifact

To read the version at runtime, declare stamp: [dynver] on the project and read bleep-stamp/<project>.properties from the classpath — see build stamps. It comes from the same derivation as the version above, and --version X stamps X, so the coordinate a jar is published under and the value inside it cannot disagree.

Project Selection

CI/CD Integration

Bleep is CI-agnostic. Set the required environment variables in your CI system and run bleep publish <target>. Example for GitHub Actions:

on:
push:
tags: ["v*"]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- uses: coursier/setup-action@v1
- run: bleep publish sonatype
env:
PGP_SECRET: ${{ secrets.PGP_SECRET }}
PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}

Troubleshooting

"No publishable projects found"

Add publish config with at least groupId to your projects or templates.

"No --version specified"

For publish local/artifactregistry/github/gitlab: either pass --version X or ensure your repo has git tags (e.g. git tag v0.1.0). The sonatype subcommand handles versioning automatically.

GPG / PGP errors

Run bleep publish setup to regenerate keys. Ensure PGP_SECRET is base64-encoded without line breaks.

Sonatype 401 Unauthorized

Verify SONATYPE_USERNAME and SONATYPE_PASSWORD are user tokens (not your account password). Regenerate at central.sonatype.com.