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..0c7d25c --- /dev/null +++ b/docs/publicar.md @@ -0,0 +1,89 @@ +# 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 +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 +``` + +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