diff --git a/PROJECT_STATUS.md b/PROJECT_STATUS.md index 7868434..2ff4689 100644 --- a/PROJECT_STATUS.md +++ b/PROJECT_STATUS.md @@ -172,26 +172,26 @@ A modern Java 25 SDK for the Open Payments API, featuring clean architecture, ty ### Completed Implementations #### Authentication & Authorization -- ✅ Ed25519 cryptography -- ✅ HTTP message signatures (RFC 9421) -- ✅ GNAP protocol (RFC 9635) -- ✅ Token lifecycle management -- ✅ Client key generation and management +- Ed25519 cryptography +- HTTP message signatures (RFC 9421) +- GNAP protocol (RFC 9635) +- Token lifecycle management +- Client key generation and management #### HTTP Infrastructure -- ✅ HTTP client abstraction -- ✅ Request/Response interceptors -- ✅ Logging with security (sensitive data masking) -- ✅ Authentication (multiple schemes) -- ✅ Error handling (structured JSON parsing) -- ✅ Resilience (retry, circuit breaker) - already existed +- HTTP client abstraction +- Request/Response interceptors +- Logging with security (sensitive data masking) +- Authentication (multiple schemes) +- Error handling (structured JSON parsing) +- Resilience (retry, circuit breaker) - already existed #### Data Models -- ✅ Immutable records for all models -- ✅ Builder patterns for complex objects -- ✅ Factory methods for common patterns -- ✅ Optional support with Jackson -- ✅ Thread-safe implementations +- Immutable records for all models +- Builder patterns for complex objects +- Factory methods for common patterns +- Optional support with Jackson +- Thread-safe implementations --- @@ -315,25 +315,25 @@ This phase implemented the complete Open Payments resource services that integra All completed phases meet the following quality standards: -✅ **Code Quality** +**Code Quality** - Zero PMD violations in implemented code - Checkstyle compliant - Spotless formatting applied - No compiler warnings -✅ **Testing** +**Testing** - 100% test pass rate - Unit tests for all public APIs - Edge cases covered - Error scenarios tested -✅ **Documentation** +**Documentation** - JavaDoc for all public classes/methods - Package-level documentation - Usage examples provided - README kept current -✅ **Security** +**Security** - Sensitive data masking in logs - Secure key generation - Thread-safe implementations @@ -449,14 +449,14 @@ We welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for: Licensed under Apache License 2.0 - see [LICENSE](LICENSE) for details. **Why Apache 2.0?** -- ✅ Commercial use allowed -- ✅ Patent grant included -- ✅ Industry standard for Java -- ✅ Compatible with most licenses +- Commercial use allowed +- Patent grant included +- Industry standard for Java +- Compatible with most licenses --- **Last Updated**: 2025-10-16 **Version**: 0.1.0-SNAPSHOT -**Status**: ✅ Core Implementation Complete (Phases 1-7) +**Status**: Core Implementation Complete (Phases 1-7) **Next**: Phase 8 - Integration Testing diff --git a/RELEASE_GUIDE.md b/RELEASE_GUIDE.md index bf1c242..2c34fd8 100644 --- a/RELEASE_GUIDE.md +++ b/RELEASE_GUIDE.md @@ -19,18 +19,19 @@ Complete guide for publishing `open-payments-java` to Maven Central using automa ## Overview -This project is configured to publish to Maven Central via the **Central Portal** API: +This project is configured to publish to Maven Central via **JReleaser** and the **Central Portal** API: -- **Publishing Endpoint:** `https://central.sonatype.com` -- **Namespace:** `zm.hashcode` +- **Publishing Tool:** JReleaser 1.14.0 +- **Publishing Endpoint:** `https://central.sonatype.com/api/v1/publisher` +- **Namespace:** `zm.hashcode` - **Artifact:** `open-payments-java` - **Group ID:** `zm.hashcode` -- **Authentication:** Token-based +- **Authentication:** Token-based - **Current Version:** `0.1.0` (pre-1.0 development) **Publication Methods:** -1. **Automated (Recommended):** Push a git tag → GitHub Actions publishes automatically -2. **Manual (Fallback):** Run Gradle commands locally +1. **Automated (Recommended):** Push a git tag → GitHub Actions publishes automatically via JReleaser +2. **Manual (Fallback):** Run JReleaser Gradle tasks locally --- @@ -132,50 +133,92 @@ gpg --keyserver keys.openpgp.org --recv-keys ABCD1234EFGH5678IJKL9012MNOP3456QRS Go to: `https://github.com/boniface/open-payments-java/settings/secrets/actions` -Add these **5 required secrets**: +Add these **6 required secrets for JReleaser**: | Secret Name | Value | How to Get | |-------------|-------|------------| -| `GPG_PRIVATE_KEY` | ASCII armored GPG private key | `gpg --export-secret-keys --armor YOUR_KEY_ID` | -| `GPG_PASSPHRASE` | Your GPG key passphrase | The password you chose during `gpg --gen-key` | -| `SIGNING_KEY_ID` | Last 8 characters of GPG key ID | From `gpg --list-keys` (e.g., `QRST7890`) | -| `CENTRAL_PORTAL_USERNAME` | Central Portal token username | From step 2 above | -| `CENTRAL_PORTAL_PASSWORD` | Central Portal token password | From step 2 above | +| `JRELEASER_GPG_PUBLIC_KEY` | ASCII armored GPG public key | `gpg --export --armor YOUR_KEY_ID` | +| `JRELEASER_GPG_SECRET_KEY` | ASCII armored GPG private key | `gpg --export-secret-keys --armor YOUR_KEY_ID` | +| `JRELEASER_GPG_PASSPHRASE` | Your GPG key passphrase | The password you chose during `gpg --gen-key` | +| `JRELEASER_GITHUB_TOKEN` | GitHub Personal Access Token | Create at https://github.com/settings/tokens | +| `JRELEASER_MAVENCENTRAL_USERNAME` | Central Portal token username | From step 2 above | +| `JRELEASER_MAVENCENTRAL_PASSWORD` | Central Portal token password | From step 2 above | -**Example: Getting GPG_PRIVATE_KEY** +**Example: Getting GPG Keys for JReleaser** ```bash +# Export public key in ASCII armor format +gpg --export --armor ABCD1234EFGH5678IJKL9012MNOP3456QRST7890 + # Export private key in ASCII armor format gpg --export-secret-keys --armor ABCD1234EFGH5678IJKL9012MNOP3456QRST7890 # Copy the ENTIRE output (including BEGIN/END lines): -# -----BEGIN PGP PRIVATE KEY BLOCK----- +# -----BEGIN PGP PUBLIC/PRIVATE KEY BLOCK----- # ... -# -----END PGP PRIVATE KEY BLOCK----- +# -----END PGP PUBLIC/PRIVATE KEY BLOCK----- ``` +**Creating GitHub Token:** +1. Go to https://github.com/settings/tokens/new +2. Select scope: `repo` (Full control of private repositories) +3. Generate token and copy it + ### 5. Configure Local Credentials (For Manual Releases) -**Option A: User-level configuration** (recommended - keeps secrets out of repo) +**Option A: Environment Variables** (recommended for JReleaser) + +Add to your `~/.zshrc` or `~/.bashrc`: + +```bash +# JReleaser GPG Signing +export JRELEASER_GPG_PASSPHRASE="your-gpg-passphrase" +export JRELEASER_GPG_PUBLIC_KEY="$(gpg --export --armor YOUR_KEY_ID)" +export JRELEASER_GPG_SECRET_KEY="$(gpg --export-secret-keys --armor YOUR_KEY_ID)" + +# JReleaser GitHub Token +export JRELEASER_GITHUB_TOKEN="your-github-token" + +# JReleaser Maven Central Authentication +export JRELEASER_MAVENCENTRAL_USERNAME="your-token-username" +export JRELEASER_MAVENCENTRAL_PASSWORD="your-token-password" +``` + +Then reload your shell: +```bash +source ~/.zshrc # or source ~/.bashrc +``` + +**Option B: Gradle Properties** (alternative) Create/edit `~/.gradle/gradle.properties`: ```properties -# GPG Signing -signing.keyId=QRST7890 -signing.password=your-gpg-passphrase -signing.secretKeyRingFile=/[HOME DIRECTORY]/.gnupg/secring.gpg - -# Central Portal Authentication -centralPortalUsername=your-token-username -centralPortalPassword=your-token-password +# JReleaser GPG Signing +JRELEASER_GPG_PASSPHRASE=your-gpg-passphrase +JRELEASER_GPG_PUBLIC_KEY= +JRELEASER_GPG_SECRET_KEY= + +# JReleaser GitHub Token +JRELEASER_GITHUB_TOKEN=your-github-token + +# JReleaser Maven Central Authentication +JRELEASER_MAVENCENTRAL_USERNAME=your-token-username +JRELEASER_MAVENCENTRAL_PASSWORD=your-token-password ``` -**Export Secret Key for Gradle (GPG 2.1+)** +**Export GPG Keys to Files (for Option B)** ```bash -# Export to legacy format for Gradle -gpg --export-secret-keys > ~/.gnupg/secring.gpg +# Export public key +gpg --export --armor YOUR_KEY_ID > ~/.gnupg/public-key.asc + +# Export secret key +gpg --export-secret-keys --armor YOUR_KEY_ID > ~/.gnupg/secret-key.asc + +# Update gradle.properties with paths +JRELEASER_GPG_PUBLIC_KEY=/Users/yourusername/.gnupg/public-key.asc +JRELEASER_GPG_SECRET_KEY=/Users/yourusername/.gnupg/secret-key.asc ``` --- @@ -351,27 +394,47 @@ ls -lh build/libs/ # - open-payments-java-0.1.0-javadoc.jar ``` -### Step 3: Publish to Central Portal +### Step 3: Publish to Central Portal with JReleaser -Ensure you have configured `~/.gradle/gradle.properties` with credentials (see Prerequisites). +Ensure you have configured JReleaser credentials as environment variables (see Prerequisites). ```bash -# Publish to Maven Central (signs and uploads) -./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository +# Build and publish to staging repository +./gradlew clean build publishMavenPublicationToMavenRepository + +# Deploy to Maven Central via JReleaser (full release process) +./gradlew jreleaserFullRelease --no-configuration-cache # Or in separate steps for more control: -./gradlew publishToSonatype # Upload to staging -./gradlew closeAndReleaseSonatypeStagingRepository # Release to Central +./gradlew jreleaserDeploy --no-configuration-cache # Deploy to Maven Central +./gradlew jreleaserRelease --no-configuration-cache # Create GitHub release ``` +**Note:** JReleaser tasks require `--no-configuration-cache` flag due to compatibility with Gradle 9.1's configuration cache. + **What happens:** 1. Gradle builds all artifacts (JAR, sources, javadoc) -2. Signs each artifact with your GPG key -3. Uploads to Central Portal staging repository -4. Validates artifacts (POM, signatures, required files) -5. Releases to Maven Central (public within 15-30 minutes) +2. JReleaser signs each artifact with your GPG key +3. Uploads to Central Portal via API +4. Creates GitHub release with changelog +5. Validates and publishes to Maven Central (public within 15-30 minutes) + +### Step 4: Verify Release -### Step 4: Create GitHub Release (Manual) +JReleaser automatically creates the GitHub release. Verify it was created: + +```bash +# Check GitHub releases +open https://github.com/hashcode-zm/open-payments-java/releases + +# Or list releases via CLI +gh release list + +# View specific release +gh release view v0.1.0 +``` + +If you need to create a release manually: ```bash # Via GitHub CLI @@ -383,36 +446,41 @@ gh release create v0.1.0 \ build/libs/open-payments-java-0.1.0-javadoc.jar # Or via web interface: -# https://github.com/boniface/open-payments-java/releases/new +# https://github.com/hashcode-zm/open-payments-java/releases/new ``` --- ## Troubleshooting -### ❌ "No value has been specified for property 'signing.keyId'" +### ❌ "JRELEASER_GPG_PASSPHRASE is not set" -**Problem:** GPG signing not configured +**Problem:** JReleaser GPG credentials not configured **Solution:** ```bash -# Configure in ~/.gradle/gradle.properties -signing.keyId=QRST7890 -signing.password=your-gpg-passphrase -signing.secretKeyRingFile=/Users/yourusername/.gnupg/secring.gpg +# Set environment variables (add to ~/.zshrc or ~/.bashrc) +export JRELEASER_GPG_PASSPHRASE="your-gpg-passphrase" +export JRELEASER_GPG_PUBLIC_KEY="$(gpg --export --armor YOUR_KEY_ID)" +export JRELEASER_GPG_SECRET_KEY="$(gpg --export-secret-keys --armor YOUR_KEY_ID)" + +# Reload shell +source ~/.zshrc ``` ### ❌ "Unable to find secret key" -**Problem:** Secret keyring not found +**Problem:** GPG keys not properly exported **Solution:** ```bash -# Export secret key to legacy format -gpg --export-secret-keys > ~/.gnupg/secring.gpg +# Export keys to files +gpg --export --armor YOUR_KEY_ID > ~/.gnupg/public-key.asc +gpg --export-secret-keys --armor YOUR_KEY_ID > ~/.gnupg/secret-key.asc -# Verify location -ls -lh ~/.gnupg/secring.gpg +# Set in gradle.properties +JRELEASER_GPG_PUBLIC_KEY=/Users/yourusername/.gnupg/public-key.asc +JRELEASER_GPG_SECRET_KEY=/Users/yourusername/.gnupg/secret-key.asc ``` ### ❌ Publishing Fails with "401 Unauthorized" @@ -423,8 +491,8 @@ ls -lh ~/.gnupg/secring.gpg 1. Go to https://central.sonatype.com/account 2. Click "Generate User Token" (revokes old token) 3. Update credentials: - - **Local:** Update `~/.gradle/gradle.properties` - - **CI/CD:** Update GitHub secrets `CENTRAL_PORTAL_USERNAME` and `CENTRAL_PORTAL_PASSWORD` + - **Local:** Update environment variables `JRELEASER_MAVENCENTRAL_USERNAME` and `JRELEASER_MAVENCENTRAL_PASSWORD` + - **CI/CD:** Update GitHub secrets `JRELEASER_MAVENCENTRAL_USERNAME` and `JRELEASER_MAVENCENTRAL_PASSWORD` ### ❌ Signature Verification Fails @@ -480,19 +548,19 @@ The release workflow (`.github/workflows/release.yml`) is triggered when you pus 1. ✅ Validates Gradle wrapper 2. ✅ Runs all quality checks (tests, coverage, PMD, SpotBugs) 3. ✅ Builds all artifacts (JAR, sources, javadoc) -4. ✅ Imports GPG key for signing -5. ✅ Signs artifacts with GPG -6. ✅ Publishes to Maven Central via Central Portal -7. ✅ Creates GitHub Release with artifacts -8. ✅ Deploys JavaDoc to GitHub Pages -9. ✅ Verifies artifact availability on Maven Central - -**Required GitHub Secrets:** -- `GPG_PRIVATE_KEY` - ASCII armored GPG private key -- `GPG_PASSPHRASE` - GPG key passphrase -- `SIGNING_KEY_ID` - Last 8 characters of GPG key ID -- `CENTRAL_PORTAL_USERNAME` - Central Portal token username -- `CENTRAL_PORTAL_PASSWORD` - Central Portal token password +4. ✅ Signs artifacts with GPG via JReleaser +5. ✅ Publishes to Maven Central via Central Portal API (JReleaser) +6. ✅ Creates GitHub Release with changelog (JReleaser) +7. ✅ Deploys JavaDoc to GitHub Pages +8. ✅ Verifies artifact availability on Maven Central + +**Required GitHub Secrets (JReleaser):** +- `JRELEASER_GPG_PUBLIC_KEY` - ASCII armored GPG public key +- `JRELEASER_GPG_SECRET_KEY` - ASCII armored GPG private key +- `JRELEASER_GPG_PASSPHRASE` - GPG key passphrase +- `JRELEASER_GITHUB_TOKEN` - GitHub Personal Access Token +- `JRELEASER_MAVENCENTRAL_USERNAME` - Central Portal token username +- `JRELEASER_MAVENCENTRAL_PASSWORD` - Central Portal token password --- @@ -524,9 +592,9 @@ git commit -m "Release version 0.1.0" git tag -a v0.1.0 -m "Release version 0.1.0" git push origin feature/maven-publish && git push origin v0.1.0 -# Manual Release -./gradlew clean test build -./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository +# Manual Release with JReleaser +./gradlew clean test build publishMavenPublicationToMavenRepository +./gradlew jreleaserFullRelease --no-configuration-cache # Verify Publication curl -I "https://repo1.maven.org/maven2/zm/hashcode/open-payments-java/0.1.0/open-payments-java-0.1.0.pom" @@ -572,15 +640,17 @@ version=2.0.0 # Breaking changes ## Resources +- **JReleaser Documentation:** https://jreleaser.org/guide/latest/index.html +- **JReleaser Maven Central Deploy:** https://jreleaser.org/guide/latest/examples/maven/maven-central.html - **Central Portal Documentation:** https://central.sonatype.org/publish/publish-portal-gradle/ -- **Gradle Nexus Publish Plugin:** https://github.com/gradle-nexus/publish-plugin - **GPG Signing Guide:** https://central.sonatype.org/publish/requirements/gpg/ - **Semantic Versioning:** https://semver.org/ -- **Project Issues:** https://github.com/boniface/open-payments-java/issues +- **Project Issues:** https://github.com/hashcode-zm/open-payments-java/issues --- -**Last Updated:** 2025-10-22 -**Publishing Method:** Maven Central Portal (current standard) +**Last Updated:** 2025-10-31 +**Publishing Tool:** JReleaser 1.14.0 +**Publishing Method:** Maven Central Portal via JReleaser **Namespace:** `zm.hashcode` (verified ✓) **Current Version:** `0.1.0` diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index bcc5c92..893653c 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -20,9 +20,10 @@ java { dependencies { implementation("com.diffplug.spotless:spotless-plugin-gradle:8.0.0") - implementation("io.github.gradle-nexus:publish-plugin:2.0.0") implementation("org.owasp:dependency-check-gradle:10.0.4") implementation("com.github.spotbugs.snom:spotbugs-gradle-plugin:6.2.5") implementation("org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:5.1.0.4882") implementation("com.github.ben-manes:gradle-versions-plugin:0.53.0") + implementation("org.jreleaser:jreleaser-gradle-plugin:1.14.0") + implementation("io.github.sgtsilvio.gradle:gradle-metadata:0.6.0") } diff --git a/buildSrc/src/main/kotlin/publishing-convention.gradle.kts b/buildSrc/src/main/kotlin/publishing-convention.gradle.kts index ee1ab62..bf6c9f0 100644 --- a/buildSrc/src/main/kotlin/publishing-convention.gradle.kts +++ b/buildSrc/src/main/kotlin/publishing-convention.gradle.kts @@ -1,81 +1,144 @@ -import java.time.Duration +import org.jreleaser.model.Active plugins { - `java-library` + java `maven-publish` - signing - id("io.github.gradle-nexus.publish-plugin") + id("org.jreleaser") + id("io.github.sgtsilvio.gradle.metadata") } java { - withJavadocJar() withSourcesJar() + withJavadocJar() +} + +metadata { + readableName = "Open Payments Java SDK" + description = "Java SDK for Open Payments API - facilitating interoperable payment setup and completion" + license { apache2() } + developers { + register("boniface") { + fullName.set("Boniface Kabaso") + email.set("550236+boniface@users.noreply.github.com") + } + register("espoir") { + fullName.set("Espoir Diteekemena") + email.set("47171587+ESPOIR-DITE@users.noreply.github.com") + } + } + github { + org.set("hashcode-zm") + repo.set("open-payments-java") + } } publishing { publications { - create("mavenJava") { + create("maven") { + groupId = "zm.hashcode" + artifactId = "open-payments-java" + version = "0.1.0" + from(components["java"]) pom { - name = "Open Payments Java SDK" - description = "Java SDK for Open Payments API - facilitating interoperable payment setup and completion" - url = "https://github.com/boniface/open-payments-java" + name.set("Open Payments Java SDK") + description.set("Java SDK for Open Payments API - facilitating interoperable payment setup and completion") + url.set("https://github.com/hashcode-zm/open-payments-java") + inceptionYear.set("2025") licenses { license { - name = "The Apache License, Version 2.0" - url = "http://www.apache.org/licenses/LICENSE-2.0.txt" + name.set("Apache-2.0") + url.set("https://www.apache.org/licenses/LICENSE-2.0") } } developers { developer { - id = "boniface" - name = "Boniface Kabaso" - email = "550236+boniface@users.noreply.github.com" + id.set("boniface") + name.set("Boniface Kabaso") + email.set("550236+boniface@users.noreply.github.com") } developer { - id = "espoir" - name = "Espoir Diteekemena" - email = "47171587+ESPOIR-DITE@users.noreply.github.com" + id.set("espoir") + name.set("Espoir Diteekemena") + email.set("47171587+ESPOIR-DITE@users.noreply.github.com") } } scm { - connection = "scm:git:git://github.com/boniface/open-payments-java.git" - developerConnection = "scm:git:ssh://github.com/boniface/open-payments-java.git" - url = "https://github.com/boniface/open-payments-java" + url.set("https://github.com/hashcode-zm/open-payments-java") + connection.set("scm:git:https://github.com/hashcode-zm/open-payments-java.git") + developerConnection.set("scm:git:ssh://git@github.com/hashcode-zm/open-payments-java.git") } } } } -} -signing { - // Only sign if publishing to Maven Central - setRequired { gradle.taskGraph.hasTask("publish") } - sign(publishing.publications["mavenJava"]) + repositories { + maven { + url = uri(layout.buildDirectory.dir("staging-deploy")) + } + } } -nexusPublishing { - repositories { - sonatype { - // Maven Central Portal - nexusUrl = uri("https://central.sonatype.com") +jreleaser { + project { + description.set("Java SDK for Open Payments API - facilitating interoperable payment setup and completion") + authors.set(listOf("Boniface Kabaso", "Espoir Diteekemena")) + license.set("Apache-2.0") + links { + homepage.set("https://github.com/hashcode-zm/open-payments-java") + } + inceptionYear.set("2025") + copyright.set("2025 Boniface Kabaso") + } - // Use Central Portal token authentication - // Set via environment variables or ~/.gradle/gradle.properties: - // centralPortalUsername= - // centralPortalPassword= - username = project.findProperty("centralPortalUsername") as String? - ?: System.getenv("CENTRAL_PORTAL_USERNAME") - password = project.findProperty("centralPortalPassword") as String? - ?: System.getenv("CENTRAL_PORTAL_PASSWORD") + release { + github { + repoOwner.set("hashcode-zm") + name.set("open-payments-java") + tagName.set("{{projectVersion}}") + releaseName.set("Release {{projectVersion}}") + overwrite.set(false) + update { + enabled.set(true) + } + changelog { + enabled.set(true) + formatted.set(Active.ALWAYS) + preset.set("conventional-commits") + contributors { + enabled.set(true) + } + append { + enabled.set(true) + target.set(file("CHANGELOG.md")) + content.set(""" + ## [{{projectVersion}}] - {{releaseDate}} + {{changelogChanges}} + {{changelogContributors}} + """.trimIndent()) + } + } } } - // Timeout configuration for large uploads - connectTimeout = Duration.ofMinutes(3) - clientTimeout = Duration.ofMinutes(3) + signing { + active = Active.ALWAYS + armored = true + } + + deploy { + maven { + mavenCentral { + create("sonatype") { + active = Active.ALWAYS + url = "https://central.sonatype.com/api/v1/publisher" + stagingRepository(layout.buildDirectory.dir("staging-deploy").get().toString()) + } + } + } + } } diff --git a/gradle.properties b/gradle.properties index a4d464a..c880b80 100644 --- a/gradle.properties +++ b/gradle.properties @@ -30,16 +30,19 @@ org.gradle.configuration-cache=true # Java kotlin.stdlib.default.dependency=false -# Maven Central Publishing (Central Portal) +# Maven Central Publishing via JReleaser # ================================================================ # Configure in ~/.gradle/gradle.properties (NOT in project files) # -# GPG Signing: -# signing.keyId=YOUR_GPG_KEY_ID -# signing.password=YOUR_GPG_KEY_PASSWORD -# signing.secretKeyRingFile=/path/to/secring.gpg +# GPG Signing (required for JReleaser): +# JRELEASER_GPG_PASSPHRASE=YOUR_GPG_KEY_PASSWORD +# JRELEASER_GPG_PUBLIC_KEY= +# JRELEASER_GPG_SECRET_KEY= # -# Central Portal Token (get from https://central.sonatype.com/account): -# centralPortalUsername=YOUR_TOKEN_USERNAME -# centralPortalPassword=YOUR_TOKEN_PASSWORD +# GitHub Token (for release creation): +# JRELEASER_GITHUB_TOKEN=YOUR_GITHUB_TOKEN +# +# Maven Central Token (get from https://central.sonatype.com/account): +# JRELEASER_MAVENCENTRAL_USERNAME=YOUR_TOKEN_USERNAME +# JRELEASER_MAVENCENTRAL_PASSWORD=YOUR_TOKEN_PASSWORD # ================================================================ \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index f86da34..bb15199 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -4,7 +4,6 @@ pluginManagement { plugins { kotlin("jvm") version "2.2.20" id("com.diffplug.spotless") version "6.25.0" - id("io.github.gradle-nexus.publish-plugin") version "2.0.0" } repositories { gradlePluginPortal()