From 0d82cbfc0c17e5f4598ffafe51a67fd6258d9db4 Mon Sep 17 00:00:00 2001 From: Thomas Luca Date: Sat, 3 Oct 2026 13:26:38 -0300 Subject: [PATCH 1/2] Preparar la publicacion en Maven Central Agrega lo que Central exige y faltaba (developers, fuentes, javadoc y firma) en un perfil release, para que el build de siempre no cambie. El javadoc deja afuera el paquete internal. Se publica desde GitHub Actions al subir un tag vX.Y.Z y no desde Windows: el plugin de Sonatype arma el bundle en Windows con barras invertidas dentro del zip. autoPublish queda apagado, asi que cada version se revisa y se publica a mano desde el portal. docs/publicar.md tiene los pasos de una sola vez (token, GPG, secrets) y los de cada version. --- .github/workflows/release.yml | 48 +++++++++++++++++++ docs/publicar.md | 87 +++++++++++++++++++++++++++++++++++ pom.xml | 85 ++++++++++++++++++++++++++++++++++ 3 files changed, 220 insertions(+) create mode 100644 .github/workflows/release.yml create mode 100644 docs/publicar.md diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..52c94e5 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,48 @@ +name: Publicar en Maven Central + +on: + push: + tags: + - 'v*' + +concurrency: + group: release + cancel-in-progress: false + +jobs: + publicar: + name: Publicar ${{ github.ref_name }} + runs-on: ubuntu-latest + timeout-minutes: 30 + + steps: + - name: Traer el codigo + uses: actions/checkout@v4 + + - name: Preparar Java, Maven y la clave GPG + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: '17' + cache: maven + server-id: central + server-username: CENTRAL_USERNAME + server-password: CENTRAL_PASSWORD + gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} + gpg-passphrase: MAVEN_GPG_PASSPHRASE + + - name: Tomar la version del tag + run: | + VERSION="${GITHUB_REF_NAME#v}" + if ! echo "$VERSION" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then + echo "El tag tiene que ser vX.Y.Z y es $GITHUB_REF_NAME" + exit 1 + fi + mvn -B -q org.codehaus.mojo:versions-maven-plugin:2.22.0:set -DnewVersion="$VERSION" -DgenerateBackupPoms=false + + - name: Probar, firmar y subir a Central + run: mvn -B -Prelease deploy + env: + CENTRAL_USERNAME: ${{ secrets.CENTRAL_USERNAME }} + CENTRAL_PASSWORD: ${{ secrets.CENTRAL_PASSWORD }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} diff --git a/docs/publicar.md b/docs/publicar.md new file mode 100644 index 0000000..8dc0cb1 --- /dev/null +++ b/docs/publicar.md @@ -0,0 +1,87 @@ +# Publicar en Maven Central + +Se publica desde GitHub Actions al crear un tag `vX.Y.Z` +(`.github/workflows/release.yml`). No se publica desde una máquina Windows: el plugin de +Sonatype arma el bundle con `\` como separador dentro del zip y Central espera `/`. + +## Lo que se hace una sola vez + +### 1. Namespace + +`io.github.caerus-dev` está verificado en central.sonatype.com (03/10/2026), en la cuenta en +la que Thomas entró con **Google**. Cada forma de entrar es una cuenta distinta: el token +tiene que salir de esa. + +### 2. Token de publicación + +central.sonatype.com → usuario → **View Account** → **Generate User Token**. Da un usuario y +una clave que no son los de la cuenta. + +### 3. Clave GPG + +Central exige que cada archivo vaya firmado. Git for Windows trae `gpg`, así que alcanza con +Git Bash: + +```bash +gpg --full-generate-key +``` + +RSA, 4096 bits, con vencimiento (2 años está bien), nombre `Caerus` y un mail del equipo. +Después: + +```bash +gpg --list-secret-keys --keyid-format=long +``` + +El ID es lo que va después de `rsa4096/` en la línea `sec`. Publicarla para que Central pueda +comprobar las firmas: + +```bash +gpg --keyserver keyserver.ubuntu.com --send-keys ID_DE_LA_CLAVE +gpg --keyserver keys.openpgp.org --send-keys ID_DE_LA_CLAVE +``` + +### 4. Secrets del repositorio + +En `caerus-dev/caerus-sdk-java` → Settings → Secrets and variables → Actions, o con `gh` +(pide el valor sin mostrarlo): + +| Secret | Valor | +|---|---| +| `CENTRAL_USERNAME` | El usuario del token | +| `CENTRAL_PASSWORD` | La clave del token | +| `GPG_PRIVATE_KEY` | `gpg --armor --export-secret-keys ID_DE_LA_CLAVE` | +| `GPG_PASSPHRASE` | La frase de la clave GPG | + +```bash +gh secret set CENTRAL_USERNAME --repo caerus-dev/caerus-sdk-java +gpg --armor --export-secret-keys ID_DE_LA_CLAVE | gh secret set GPG_PRIVATE_KEY --repo caerus-dev/caerus-sdk-java +``` + +La clave privada no se guarda en ningún archivo ni se pega en un chat. + +## Cada versión + +1. Que `main` tenga lo que se publica y el CI esté verde. +2. Crear y subir el tag: + + ```bash + git tag v0.1.0 + git push origin v0.1.0 + ``` + +3. El workflow pone esa versión en el `pom.xml` (no se commitea), corre los tests, firma y + sube el bundle. Central lo valida. +4. En central.sonatype.com → **Deployments** aparece como **Validated**. Revisarlo y apretar + **Publish**. A partir de ahí no se puede borrar ni pisar esa versión. +5. Aparece en Maven Central en unos 30 minutos. + +Si la validación falla, el deployment queda en el portal con el motivo y se puede descartar +con **Drop**; nada se publicó. + +## Qué va en el bundle + +El jar, el `.pom`, el jar de fuentes, el de javadoc (solo con los paquetes públicos; el +código no tiene Javadoc, así que es la lista de clases y firmas), las firmas `.asc` y los +checksums. Se puede armar localmente sin firmar ni subir para revisarlo con +`mvn -Prelease package -Dgpg.skip`. diff --git a/pom.xml b/pom.xml index c4b3727..d8aef7e 100644 --- a/pom.xml +++ b/pom.xml @@ -20,11 +20,26 @@ + + + caerus-dev + Caerus + Caerus + https://github.com/caerus-dev + + + https://github.com/caerus-dev/caerus-sdk-java scm:git:https://github.com/caerus-dev/caerus-sdk-java.git + scm:git:https://github.com/caerus-dev/caerus-sdk-java.git + + GitHub + https://github.com/caerus-dev/caerus-sdk-java/issues + + 17 UTF-8 @@ -237,6 +252,76 @@ + + release + + + + org.apache.maven.plugins + maven-source-plugin + 3.4.0 + + + attach-sources + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.12.0 + + 17 + none + true + dev.caerus.sdk.internal:dev.caerus.sdk.internal.* + + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 3.2.8 + + + sign-artifacts + verify + + sign + + + + + + --pinentry-mode + loopback + + + + + org.sonatype.central + central-publishing-maven-plugin + 0.11.0 + true + + central + false + validated + + + + + live From e104b156b3a589ac0337ce39feb166b94ecde5ee Mon Sep 17 00:00:00 2001 From: Thomas Luca Date: Sat, 3 Oct 2026 13:29:36 -0300 Subject: [PATCH 2/2] Completar en la guia los comandos de los cuatro secrets Faltaban CENTRAL_PASSWORD y GPG_PASSPHRASE: siguiendo la guia, la primera publicacion fallaba al autenticar o al firmar. --- docs/publicar.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/publicar.md b/docs/publicar.md index 8dc0cb1..0c7d25c 100644 --- a/docs/publicar.md +++ b/docs/publicar.md @@ -55,6 +55,8 @@ En `caerus-dev/caerus-sdk-java` → Settings → Secrets and variables → Actio ```bash gh secret set CENTRAL_USERNAME --repo caerus-dev/caerus-sdk-java +gh secret set CENTRAL_PASSWORD --repo caerus-dev/caerus-sdk-java +gh secret set GPG_PASSPHRASE --repo caerus-dev/caerus-sdk-java gpg --armor --export-secret-keys ID_DE_LA_CLAVE | gh secret set GPG_PRIVATE_KEY --repo caerus-dev/caerus-sdk-java ```