From 7c27f6b194c3e5b9fa154e6b1302baf574d8ad37 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 29 Sep 2025 14:34:32 +0200 Subject: [PATCH] Add task to promote build artifacts automatically --- build.gradle | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/build.gradle b/build.gradle index 5088134..ed082f3 100644 --- a/build.gradle +++ b/build.gradle @@ -171,6 +171,57 @@ subprojects { required { signingRequired } sign publishing.publications.mavenJava } + + + // see https://github.com/conductor-oss/conductor/blob/main/deploy.gradle#L76-L129 + task promoteToMavenCentral { + group = 'publishing' + description = 'Promotes staged artifacts to Maven Central' + + onlyIf { + sonatypeCredentialsAvailable && !isSnapshot + } + + doLast { + // Create base64 encoded token for authentication + def token = "${sonatypeUsername}:${sonatypePassword}".bytes.encodeBase64().toString() + + // Get open staging repositories + def response = new URL("https://ossrh-staging-api.central.sonatype.com/manual/search/repositories") + .openConnection() + response.setRequestProperty("Authorization", "Basic ${token}") + response.setRequestProperty("Content-Type", "application/json") + + def repositories = new groovy.json.JsonSlurper().parse(response.inputStream) + + // Promote each open repository + repositories.repositories.each { repo -> + if (repo.state == "open") { + project.logger.lifecycle("Promoting repository ${repo.key}") + + def promoteUrl = new URL("https://ossrh-staging-api.central.sonatype.com/manual/upload/repository/${repo.key}?publishing_type=automatic") + def connection = promoteUrl.openConnection() + connection.setRequestMethod("POST") + connection.setRequestProperty("Authorization", "Basic ${token}") + connection.setRequestProperty("Content-Type", "application/json") + + def responseCode = connection.responseCode + if (responseCode == 200) { + project.logger.lifecycle("Successfully promoted repository ${repo.key}") + } else { + def errorStream = connection.errorStream + def errorBody = errorStream ? errorStream.text : "No error body available" + def errorMessage = "Failed to promote repository ${repo.key}. Response code: ${responseCode}. Response message: ${connection.responseMessage}. Error body: ${errorBody}" + project.logger.error(errorMessage) + //throw new GradleException(errorMessage) + } + } + } + } + } + tasks.matching { it.name == 'publish' }.configureEach { publishTask -> + publishTask.finalizedBy tasks.promoteToMavenCentral + } } def getGitCommit() {