[andoid] publishing to maven central (#53568)
Summary:
Pull Request resolved: https://github.com/pytorch/pytorch/pull/53568
Bintray, JCenter are going to be unavailable on May 1st
https://jfrog.com/blog/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter/
Migrating publishing to Maven Central the same way as other fb oss projects, reference PR https://github.com/pytorch/pytorch/pull/53568/files
to publish
```
./android/gradlew -p android publish
```
<img width="697" alt="Screen Shot 2021-03-09 at 3 14 08 PM" src="https://user-images.githubusercontent.com/6638825/110551387-3e3fc000-80ea-11eb-9604-4e69d6e6d085.png">
Test Plan: Imported from OSS
Reviewed By: dreiss
Differential Revision: D26928884
Pulled By: IvanKobzarev
fbshipit-source-id: 8754c93a2542405870e2621be5b3f14e3d0081b9
diff --git a/.circleci/docker/android/build.gradle b/.circleci/docker/android/build.gradle
index 96f7371..6b876b4 100644
--- a/.circleci/docker/android/build.gradle
+++ b/.circleci/docker/android/build.gradle
@@ -21,9 +21,7 @@
dependencies {
classpath 'com.android.tools.build:gradle:4.1.2'
- classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0"
- classpath "com.github.dcendents:android-maven-gradle-plugin:2.1"
- classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.9.8"
+ classpath 'com.vanniktech:gradle-maven-publish-plugin:0.14.2'
}
}
diff --git a/.circleci/scripts/publish_android_snapshot.sh b/.circleci/scripts/publish_android_snapshot.sh
index 81f79d5..352b9d5 100755
--- a/.circleci/scripts/publish_android_snapshot.sh
+++ b/.circleci/scripts/publish_android_snapshot.sh
@@ -35,7 +35,9 @@
echo "ndk.dir=/opt/ndk" >> $GRADLE_LOCAL_PROPERTIES
echo "SONATYPE_NEXUS_USERNAME=${SONATYPE_NEXUS_USERNAME}" >> $GRADLE_PROPERTIES
+ echo "mavenCentralRepositoryUsername=${SONATYPE_NEXUS_USERNAME}" >> $GRADLE_PROPERTIES
echo "SONATYPE_NEXUS_PASSWORD=${SONATYPE_NEXUS_PASSWORD}" >> $GRADLE_PROPERTIES
+ echo "mavenCentralRepositoryPassword=${SONATYPE_NEXUS_PASSWORD}" >> $GRADLE_PROPERTIES
echo "signing.keyId=${ANDROID_SIGN_KEY}" >> $GRADLE_PROPERTIES
echo "signing.password=${ANDROID_SIGN_PASS}" >> $GRADLE_PROPERTIES
diff --git a/android/build.gradle b/android/build.gradle
index 458222f..60cd969 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -26,9 +26,7 @@
dependencies {
classpath 'com.android.tools.build:gradle:4.1.2'
- classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:${GRADLE_BINTRAY_PLUGIN_VERSION}"
- classpath "com.github.dcendents:android-maven-gradle-plugin:${ANDROID_MAVEN_GRADLE_PLUGIN_VERSION}"
- classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.9.8"
+ classpath 'com.vanniktech:gradle-maven-publish-plugin:0.14.2'
}
}
diff --git a/android/gradle.properties b/android/gradle.properties
index 0ab42c5..f99b640 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -3,6 +3,7 @@
VERSION_NAME=1.8.0-SNAPSHOT
GROUP=org.pytorch
MAVEN_GROUP=org.pytorch
+SONATYPE_STAGING_PROFILE=orgpytorch
POM_URL=https://github.com/pytorch/pytorch/tree/master/android
POM_SCM_URL=https://github.com/pytorch/pytorch.git
POM_SCM_CONNECTION=scm:git:https://github.com/pytorch/pytorch
@@ -13,11 +14,6 @@
POM_LICENSE_DIST=repo
POM_DEVELOPER_ID=pytorch
POM_DEVELOPER_NAME=pytorch
-syncWithMavenCentral=true
-
-GRADLE_BINTRAY_PLUGIN_VERSION=1.8.0
-GRADLE_VERSIONS_PLUGIN_VERSION=0.15.0
-ANDROID_MAVEN_GRADLE_PLUGIN_VERSION=2.1
# Gradle internals
org.gradle.internal.repository.max.retries=1
diff --git a/android/gradle/android_maven_install.gradle b/android/gradle/android_maven_install.gradle
deleted file mode 100644
index ce80472..0000000
--- a/android/gradle/android_maven_install.gradle
+++ /dev/null
@@ -1,38 +0,0 @@
-apply plugin: 'com.github.dcendents.android-maven'
-
-version = VERSION_NAME
-group = GROUP
-project.archivesBaseName = POM_ARTIFACT_ID
-
-install {
- repositories.mavenInstaller {
- pom.project {
- name POM_NAME
- artifactId POM_ARTIFACT_ID
- packaging POM_PACKAGING
- description POM_DESCRIPTION
- url projectUrl
-
- scm {
- url scmUrl
- connection scmConnection
- developerConnection scmDeveloperConnection
- }
-
- licenses {
- license {
- name = POM_LICENSE_NAME
- url = POM_LICENSE_URL
- distribution = POM_LICENSE_DIST
- }
- }
-
- developers {
- developer {
- id developerId
- name developerName
- }
- }
- }
- }
-}
diff --git a/android/gradle/android_tasks.gradle b/android/gradle/android_tasks.gradle
index 0d59325..6bba126 100644
--- a/android/gradle/android_tasks.gradle
+++ b/android/gradle/android_tasks.gradle
@@ -1,94 +1,11 @@
-import java.nio.file.Files
-import java.nio.file.Paths
-import java.io.FileOutputStream
-import java.util.zip.ZipFile
-
-// Android tasks for Javadoc and sources.jar generation
-
afterEvaluate { project ->
if (POM_PACKAGING == 'aar') {
- task androidJavadoc(type: Javadoc, dependsOn: assembleDebug) {
- source += files(android.sourceSets.main.java.srcDirs)
- failOnError false
- // This task will try to compile *everything* it finds in the above directory and
- // will choke on text files it doesn't understand.
- exclude '**/BUCK'
- exclude '**/*.md'
- }
-
- task androidJavadocJar(type: Jar, dependsOn: androidJavadoc) {
- classifier = 'javadoc'
- from androidJavadoc.destinationDir
- }
-
- task androidSourcesJar(type: Jar) {
- classifier = 'sources'
- from android.sourceSets.main.java.srcDirs
- }
-
- android.libraryVariants.all { variant ->
- def name = variant.name.capitalize()
- task "jar${name}"(type: Jar, dependsOn: variant.javaCompileProvider) {
- from variant.javaCompileProvider.get().destinationDir
- }
-
- androidJavadoc.doFirst {
- classpath += files(android.bootClasspath)
- classpath += files(variant.javaCompileProvider.get().classpath.files)
- // This is generated by `assembleDebug` and holds the JARs generated by the APT.
- classpath += fileTree(dir: "$buildDir/intermediates/bundles/debug/", include: '**/*.jar')
-
- // Process AAR dependencies
- def aarDependencies = classpath.filter { it.name.endsWith('.aar') }
- classpath -= aarDependencies
- aarDependencies.each { aar ->
- // Extract classes.jar from the AAR dependency, and add it to the javadoc classpath
- def outputPath = "$buildDir/tmp/aarJar/${aar.name.replace('.aar', '.jar')}"
- classpath += files(outputPath)
-
- // Use a task so the actual extraction only happens before the javadoc task is run
- dependsOn task(name: "extract ${aar.name}").doLast {
- extractEntry(aar, 'classes.jar', outputPath)
- }
- }
+ task headersJar(type: Jar) {
+ archiveClassifier.set('headers')
+ from("$rootDir/cxx/") {
+ include '**/*.h'
}
}
-
- artifacts.add('archives', androidJavadocJar)
- artifacts.add('archives', androidSourcesJar)
+ artifacts.add('archives', headersJar)
}
-
- if (POM_PACKAGING == 'jar') {
- task javadocJar(type: Jar, dependsOn: javadoc) {
- classifier = 'javadoc'
- from javadoc.destinationDir
- }
-
- task sourcesJar(type: Jar, dependsOn: classes) {
- classifier = 'sources'
- from sourceSets.main.allSource
- }
-
- artifacts.add('archives', javadocJar)
- artifacts.add('archives', sourcesJar)
- }
-}
-
-// Utility method to extract only one entry in a zip file
-private def extractEntry(archive, entryPath, outputPath) {
- if (!archive.exists()) {
- throw new GradleException("archive $archive not found")
- }
-
- def zip = new ZipFile(archive)
- zip.entries().each {
- if (it.name == entryPath) {
- def path = Paths.get(outputPath)
- if (!Files.exists(path)) {
- Files.createDirectories(path.getParent())
- Files.copy(zip.getInputStream(it), path)
- }
- }
- }
- zip.close()
}
diff --git a/android/gradle/bintray.gradle b/android/gradle/bintray.gradle
deleted file mode 100644
index c200739..0000000
--- a/android/gradle/bintray.gradle
+++ /dev/null
@@ -1,64 +0,0 @@
-apply plugin: 'com.jfrog.bintray'
-
-def getBintrayUsername() {
- return project.hasProperty('bintrayUsername') ? property('bintrayUsername') : System.getenv('BINTRAY_USERNAME')
-}
-
-def getBintrayApiKey() {
- return project.hasProperty('bintrayApiKey') ? property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY')
-}
-
-def getBintrayGpgPassword() {
- return project.hasProperty('bintrayGpgPassword') ? property('bintrayGpgPassword') : System.getenv('BINTRAY_GPG_PASSWORD')
-}
-
-def getMavenCentralUsername() {
- return project.hasProperty('mavenCentralUsername') ? property('mavenCentralUsername') : System.getenv('MAVEN_CENTRAL_USERNAME')
-}
-
-def getMavenCentralPassword() {
- return project.hasProperty('mavenCentralPassword') ? property('mavenCentralPassword') : System.getenv('MAVEN_CENTRAL_PASSWORD')
-}
-
-def shouldSyncWithMavenCentral() {
- return project.hasProperty('syncWithMavenCentral') ? property('syncWithMavenCentral').toBoolean() : false
-}
-
-def dryRunOnly() {
- return project.hasProperty('dryRun') ? property('dryRun').toBoolean() : false
-}
-
-bintray {
- user = getBintrayUsername()
- key = getBintrayApiKey()
- override = false
- configurations = ['archives']
- pkg {
- repo = bintrayRepo
- userOrg = bintrayUserOrg
- name = bintrayName
- desc = bintrayDescription
- websiteUrl = projectUrl
- issueTrackerUrl = issuesUrl
- vcsUrl = scmUrl
- licenses = [ POM_LICENSE_NAME ]
- dryRun = dryRunOnly()
- override = false
- publish = true
- publicDownloadNumbers = true
- version {
- name = versionName
- desc = bintrayDescription
- gpg {
- sign = true
- passphrase = getBintrayGpgPassword()
- }
- mavenCentralSync {
- sync = shouldSyncWithMavenCentral()
- user = getMavenCentralUsername()
- password = getMavenCentralPassword()
- close = '1' // If set to 0, you have to manually click release
- }
- }
- }
-}
diff --git a/android/gradle/gradle_maven_push.gradle b/android/gradle/gradle_maven_push.gradle
deleted file mode 100644
index 5fdd8fb..0000000
--- a/android/gradle/gradle_maven_push.gradle
+++ /dev/null
@@ -1,99 +0,0 @@
-apply plugin: 'signing'
-
-version = VERSION_NAME
-group = MAVEN_GROUP
-
-def isReleaseBuild() {
- return !VERSION_NAME.contains('SNAPSHOT')
-}
-
-def getReleaseRepositoryUrl() {
- return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL
- : "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
-}
-
-def getSnapshotRepositoryUrl() {
- return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL
- : "https://oss.sonatype.org/content/repositories/snapshots/"
-}
-
-def getRepositoryUsername() {
- return hasProperty('SONATYPE_NEXUS_USERNAME') ? SONATYPE_NEXUS_USERNAME : ""
-}
-
-def getRepositoryPassword() {
- return hasProperty('SONATYPE_NEXUS_PASSWORD') ? SONATYPE_NEXUS_PASSWORD : ""
-}
-
-def getHttpProxyHost() {
- return project.properties['systemProp.http.proxyHost']
-}
-
-def getHttpProxyPort() {
- return project.properties['systemProp.http.proxyPort']
-}
-
-def needProxy() {
- return (getHttpProxyHost() != null) && (getHttpProxyPort() != null)
-}
-
-afterEvaluate { project ->
- uploadArchives {
- repositories {
- mavenDeployer {
- beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
-
- pom.groupId = MAVEN_GROUP
- pom.artifactId = POM_ARTIFACT_ID
- pom.version = VERSION_NAME
-
- repository(url: getReleaseRepositoryUrl()) {
- authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
- if (needProxy()) {
- proxy(host: getHttpProxyHost(), port: getHttpProxyPort() as Integer, type: 'http')
- }
- }
- snapshotRepository(url: getSnapshotRepositoryUrl()) {
- authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
- if (needProxy()) {
- proxy(host: getHttpProxyHost(), port: getHttpProxyPort() as Integer, type: 'http')
- }
- }
-
- pom.project {
- name POM_NAME
- packaging POM_PACKAGING
- description POM_DESCRIPTION
- url POM_URL
-
- scm {
- url POM_SCM_URL
- connection POM_SCM_CONNECTION
- developerConnection POM_SCM_DEV_CONNECTION
- }
-
- licenses {
- license {
- name POM_LICENSE_NAME
- url POM_LICENSE_URL
- distribution POM_LICENSE_DIST
- }
- }
-
- developers {
- developer {
- id POM_DEVELOPER_ID
- name POM_DEVELOPER_NAME
- }
- }
- }
- }
- }
- }
-
- signing {
- required { isReleaseBuild() && gradle.taskGraph.hasTask('uploadArchives') }
- sign configurations.archives
- }
-
-}
diff --git a/android/gradle/release.gradle b/android/gradle/release.gradle
index 5709a2c..7a69483 100644
--- a/android/gradle/release.gradle
+++ b/android/gradle/release.gradle
@@ -1,5 +1,3 @@
apply from: rootProject.file('gradle/android_tasks.gradle')
-apply from: rootProject.file('gradle/release_bintray.gradle')
-
-apply from: rootProject.file('gradle/gradle_maven_push.gradle')
+apply plugin: 'com.vanniktech.maven.publish'
diff --git a/android/gradle/release_bintray.gradle b/android/gradle/release_bintray.gradle
deleted file mode 100644
index dc2bcc3..0000000
--- a/android/gradle/release_bintray.gradle
+++ /dev/null
@@ -1,32 +0,0 @@
-ext {
- bintrayRepo = 'maven'
- bintrayUserOrg = 'pytorch'
- bintrayName = "${GROUP}:${POM_ARTIFACT_ID}"
- bintrayDescription = POM_DESCRIPTION
- projectUrl = POM_URL
- issuesUrl = POM_ISSUES_URL
- scmUrl = POM_SCM_URL
- scmConnection = POM_SCM_CONNECTION
- scmDeveloperConnection = POM_SCM_DEV_CONNECTION
-
- publishedGroupId = GROUP
- libraryName = 'pytorch_android'
- artifact = 'pytorch_android'
-
- developerId = POM_DEVELOPER_ID
- developerName = POM_DEVELOPER_NAME
-
- versionName = VERSION_NAME
-
- projectLicenses = {
- license = {
- name = POM_LICENSE_NAME
- url = POM_LICENSE_URL
- distribution = POM_LICENSE_DIST
- }
- }
-}
-
-apply from: rootProject.file('gradle/android_maven_install.gradle')
-
-apply from: rootProject.file('gradle/bintray.gradle')