From 05e0d9b7d2cc74fc0449aae27a38643d0ee31fe9 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Thu, 15 May 2025 22:18:43 +0600 Subject: [PATCH] add clatch for uploading of publication --- gradle/templates/publish.gradle | 1 + gradle/templates/publish_jvm.gradle | 1 + gradle/templates/sonatype_upload.gradle | 47 +++++++++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 gradle/templates/sonatype_upload.gradle diff --git a/gradle/templates/publish.gradle b/gradle/templates/publish.gradle index c6e31fea6c3..6d4246b81c8 100644 --- a/gradle/templates/publish.gradle +++ b/gradle/templates/publish.gradle @@ -3,6 +3,7 @@ if (ext.getProperties()["do_publish"] == false) { } apply plugin: 'maven-publish' +apply from: "$sonatype_upload" task javadocsJar(type: Jar) { archiveClassifier = 'javadoc' diff --git a/gradle/templates/publish_jvm.gradle b/gradle/templates/publish_jvm.gradle index 5a052b6c675..f741bcad726 100644 --- a/gradle/templates/publish_jvm.gradle +++ b/gradle/templates/publish_jvm.gradle @@ -1,4 +1,5 @@ apply plugin: 'maven-publish' +apply from: "$sonatype_upload" task javadocJar(type: Jar) { from javadoc diff --git a/gradle/templates/sonatype_upload.gradle b/gradle/templates/sonatype_upload.gradle new file mode 100644 index 00000000000..28a3ddd1e4e --- /dev/null +++ b/gradle/templates/sonatype_upload.gradle @@ -0,0 +1,47 @@ +import java.nio.charset.StandardCharsets +import java.util.Base64 +import java.net.http.HttpClient +import java.net.http.HttpRequest +import java.net.http.HttpResponse + +if ((project.hasProperty('SONATYPE_USER') || System.getenv('SONATYPE_USER') != null) && (project.hasProperty('SONATYPE_PASSWORD') || System.getenv('SONATYPE_PASSWORD') != null)) { + def taskName = "uploadSonatypePublication" + if (rootProject.tasks.names.contains(taskName)) { + return + } + rootProject.tasks.register(taskName) { + doLast { + def username = project.hasProperty('SONATYPE_USER') ? project.property('SONATYPE_USER') : System.getenv('SONATYPE_USER') + def password = project.hasProperty('SONATYPE_PASSWORD') ? project.property('SONATYPE_PASSWORD') : System.getenv('SONATYPE_PASSWORD') + def bearer = Base64.getEncoder().encodeToString("$username:$password".getBytes(StandardCharsets.UTF_8)) + + def client = HttpClient.newHttpClient() + def request = HttpRequest.newBuilder() + .uri(URI.create("https://ossrh-staging-api.central.sonatype.com/manual/search/repositories?state=open")) + .GET() + .header("Content-Type", "application/json") + .header("Authorization", "Bearer $bearer") + .build() + + def response = client.send(request, HttpResponse.BodyHandlers.ofString()) + def keys = new ArrayList() + response.body().findAll("\"key\"[\\s]*:[\\s]*\"[^\"]+\"").forEach { + def key = it.find("[^\"]+\"\$").find("[^\"]+") + keys.add(key) + } + keys.forEach { + println("Start uploading $it") + def uploadRequest = HttpRequest.newBuilder() + .uri(URI.create("https://ossrh-staging-api.central.sonatype.com/manual/upload/repository/$it?publishing_type=user_managed")) + .POST(HttpRequest.BodyPublishers.ofString("")) + .header("Content-Type", "application/json") + .header("Authorization", "Bearer $bearer") + .build() + def uploadResponse = client.send(uploadRequest, HttpResponse.BodyHandlers.ofString()) + if (uploadResponse.statusCode() != 200) { + throw IllegalStateException("Faced error of uploading for repo with key $it. Response: $uploadResponse") + } + } + } + } +}