Skip to content

Instantly share code, notes, and snippets.

@zsmb13
Last active August 10, 2023 17:55
  • Star 9 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save zsmb13/56ed98c8fe916de441f2a9d8e060cd4a to your computer and use it in GitHub Desktop.
Gradle config files for publishing to MavenCentral. Full article https://proandroiddev.com/publishing-android-libraries-to-mavencentral-in-2021-8ac9975c3e52 , latest live versions of these in a working repo https://github.com/GetStream/stream-chat-android/tree/develop/scripts
// Lines to add in module level build.gradle file for modules you publish
ext {
// Provide your own coordinates here
PUBLISH_GROUP_ID = 'io.getstream'
PUBLISH_VERSION = '4.8.1'
PUBLISH_ARTIFACT_ID = 'stream-chat-android-client'
}
apply from: "${rootProject.projectDir}/scripts/publish-module.gradle"
// Lines to add to the project level (root) build.gradle file
// 1a: plugins block application of the publishing plugin
plugins {
id("io.github.gradle-nexus.publish-plugin") version "1.1.0"
}
// 1b: old plugin syntax for publishing plugin
buildscript {
dependencies {
classpath 'io.github.gradle-nexus:publish-plugin:1.1.0'
}
}
apply plugin: 'io.github.gradle-nexus.publish-plugin'
// 2: applying separate publishing script
apply from: "${rootDir}/scripts/publish-root.gradle"
apply plugin: 'maven-publish'
apply plugin: 'signing'
task androidSourcesJar(type: Jar) {
archiveClassifier.set('sources')
if (project.plugins.findPlugin("com.android.library")) {
// For Android libraries
from android.sourceSets.main.java.srcDirs
from android.sourceSets.main.kotlin.srcDirs
} else {
// For pure Kotlin libraries, in case you have them
from sourceSets.main.java.srcDirs
from sourceSets.main.kotlin.srcDirs
}
}
artifacts {
archives androidSourcesJar
}
group = PUBLISH_GROUP_ID
version = PUBLISH_VERSION
afterEvaluate {
publishing {
publications {
release(MavenPublication) {
// The coordinates of the library, being set from variables that
// we'll set up later
groupId PUBLISH_GROUP_ID
artifactId PUBLISH_ARTIFACT_ID
version PUBLISH_VERSION
// Two artifacts, the `aar` (or `jar`) and the sources
if (project.plugins.findPlugin("com.android.library")) {
from components.release
} else {
from components.java
}
artifact androidSourcesJar
artifact javadocJar
// Mostly self-explanatory metadata
pom {
name = PUBLISH_ARTIFACT_ID
description = 'Stream Chat official Android SDK'
url = 'https://github.com/getstream/stream-chat-android'
licenses {
license {
name = 'Stream License'
url = 'https://github.com/GetStream/stream-chat-android/blob/main/LICENSE'
}
}
developers {
developer {
id = 'zsmb13'
name = 'Márton Braun'
email = 'marton@getstream.io'
}
// Add all other devs here...
}
// Version control info - if you're using GitHub, follow the
// format as seen here
scm {
connection = 'scm:git:github.com/getstream/stream-chat-android.git'
developerConnection = 'scm:git:ssh://github.com/getstream/stream-chat-android.git'
url = 'https://github.com/getstream/stream-chat-android/tree/main'
}
}
}
}
}
}
signing {
useInMemoryPgpKeys(
rootProject.ext["signing.keyId"],
rootProject.ext["signing.key"],
rootProject.ext["signing.password"],
)
sign publishing.publications
}
// Create variables with empty default values
ext["ossrhUsername"] = ''
ext["ossrhPassword"] = ''
ext["sonatypeStagingProfileId"] = ''
ext["signing.keyId"] = ''
ext["signing.password"] = ''
ext["signing.key"] = ''
File secretPropsFile = project.rootProject.file('local.properties')
if (secretPropsFile.exists()) {
// Read local.properties file first if it exists
Properties p = new Properties()
new FileInputStream(secretPropsFile).withCloseable { is -> p.load(is) }
p.each { name, value -> ext[name] = value }
} else {
// Use system environment variables
ext["ossrhUsername"] = System.getenv('OSSRH_USERNAME')
ext["ossrhPassword"] = System.getenv('OSSRH_PASSWORD')
ext["sonatypeStagingProfileId"] = System.getenv('SONATYPE_STAGING_PROFILE_ID')
ext["signing.keyId"] = System.getenv('SIGNING_KEY_ID')
ext["signing.password"] = System.getenv('SIGNING_PASSWORD')
ext["signing.key"] = System.getenv('SIGNING_KEY')
}
// Set up Sonatype repository
nexusPublishing {
repositories {
sonatype {
stagingProfileId = sonatypeStagingProfileId
username = ossrhUsername
password = ossrhPassword
// Add these lines if using new Sonatype infra
// nexusUrl.set(uri("https://s01.oss.sonatype.org/service/local/"))
// snapshotRepositoryUrl.set(uri("https://s01.oss.sonatype.org/content/repositories/snapshots/"))
}
}
}
@gargVader
Copy link

I get the following error when I try to include the publish-module.gradle file in build.gradle file of my library module

Caused by: groovy.lang.MissingPropertyException: Could not get unknown property 'kotlin' for source set main of type com.android.build.gradle.internal.api.DefaultAndroidSourceSet.

@zsmb13
Copy link
Author

zsmb13 commented Jun 29, 2021

@gargVader if you're not using a Kotlin source set, simply remove the lines that refer to it.

@ThomasGorisse
Copy link

Thanks a lot @zsmb13.

Just a quick note for people having issue with the signing.key format, if you want to put it in the local.properties, the format should look like this:

signing.key=\n-----BEGIN PGP PRIVATE KEY BLOCK-----\n\nxxx\nyyy\n-----END PGP PRIVATE KEY BLOCK-----\n

@yogeshpaliyal
Copy link

@zsmb13
Facing this issue on Github Action only

Cannot perform signing task ':universal_adapter:signReleasePublication' because it has no configured signatory

@plusmobileapps
Copy link

One thing I had to do since the project I was making was provisioned after Feb 2021 was configuring the nexus publish plugin to point to the updated urls, otherwise it was failing authentication trying to reach the legacy server.

nexusPublishing {
    repositories {
        sonatype {  //only for users registered in Sonatype after 24 Feb 2021
            nexusUrl.set(uri("https://s01.oss.sonatype.org/service/local/"))
            snapshotRepositoryUrl.set(uri("https://s01.oss.sonatype.org/content/repositories/snapshots/"))
        }
    }
}

https://github.com/gradle-nexus/publish-plugin/#publishing-to-maven-central-via-sonatype-ossrh

@jayanthjj
Copy link

@zsmb13
Hey there, thanks for your article.
I came across this issue,
Could not find method useInMemoryPgpKeys() for arguments [XXXXXXX, <Key which I get from gpg --export-secret-keys XXXXXXX | base64> , passphrase] on object of type org.gradle.plugins.signing.SigningExtension.
Could you please help with the same?

@iffanmajid
Copy link

I have this issue too

@zsmb13 Hey there, thanks for your article. I came across this issue, Could not find method useInMemoryPgpKeys() for arguments [XXXXXXX, <Key which I get from gpg --export-secret-keys XXXXXXX | base64> , passphrase] on object of type org.gradle.plugins.signing.SigningExtension. Could you please help with the same?

@aabhasr1
Copy link

aabhasr1 commented Dec 21, 2022

i am getting this error.

:base:generatePomFileForMavenAarPublication.
> Cannot query the value of this property because it has no value available.

Can you help me understand how to debug this error as i am not able to catch the exact problem.

@being-eyram
Copy link

Thanks @zsmb13.

@Divya0319
Copy link

Thanks @ThomasGorisse , it really helped me escape the error of 'Could not read PGP secret key'. And build is successful after long time.

@MadFlasheroo7
Copy link

@zsmb13 Facing this issue on Github Action only

Cannot perform signing task ':universal_adapter:signReleasePublication' because it has no configured signatory

did u find any fix? i am getting same error but on local machine

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment