From 8dcf45b8d5beaf8b2ebe7388da8f87e59833fb3b Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sat, 6 Mar 2021 20:50:17 +0300 Subject: [PATCH] Change publishing scheme --- CHANGELOG.md | 3 + build.gradle.kts | 2 +- .../mipt/npm/gradle/KScienceProjectPlugin.kt | 59 +++-- .../npm/gradle/KSciencePublishingPlugin.kt | 229 +----------------- .../ru/mipt/npm/gradle/internal/common.kt | 5 +- .../ru/mipt/npm/gradle/internal/publishing.kt | 210 ++++++++++++++++ 6 files changed, 261 insertions(+), 247 deletions(-) create mode 100644 src/main/kotlin/ru/mipt/npm/gradle/internal/publishing.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 773efed..9136fcf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,10 +9,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Changed +- Publishing repositories are explicit and defined in the top level project ### Deprecated +- Publishing plugin ### Removed +- Bintray publishing ### Fixed diff --git a/build.gradle.kts b/build.gradle.kts index 12919b7..e86d244 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ plugins { } group = "ru.mipt.npm" -version = "0.8.4" +version = "0.9.0-dev-1" description = "Build tools for DataForge and kscience projects" diff --git a/src/main/kotlin/ru/mipt/npm/gradle/KScienceProjectPlugin.kt b/src/main/kotlin/ru/mipt/npm/gradle/KScienceProjectPlugin.kt index c513d17..73f036a 100644 --- a/src/main/kotlin/ru/mipt/npm/gradle/KScienceProjectPlugin.kt +++ b/src/main/kotlin/ru/mipt/npm/gradle/KScienceProjectPlugin.kt @@ -8,29 +8,52 @@ import org.gradle.kotlin.dsl.* import org.jetbrains.changelog.ChangelogPlugin import org.jetbrains.dokka.gradle.DokkaPlugin import org.jetbrains.dokka.gradle.DokkaTask +import ru.mipt.npm.gradle.internal.addGithubPublishing +import ru.mipt.npm.gradle.internal.addSonatypePublishing +import ru.mipt.npm.gradle.internal.addSpacePublishing +import ru.mipt.npm.gradle.internal.setupPublication @Suppress("unused") class KSciencePublishingExtension(val project: Project) { - var vcs: String? by project.extra + private var initializedFlag = false - // github publishing - var githubOrg: String? by project.extra - var githubProject: String? by project.extra + fun setup(vcsUrl: String){ + project.setupPublication(vcsUrl) + initializedFlag = true + } - // Space publishing - var spaceRepo: String? by project.extra - var spaceUser: String? by project.extra - var spaceToken: String? by project.extra + /** + * github publishing + */ + fun github(githubProject: String, githubOrg: String = "mipt-npm") { + //automatically initialize vcs using github + if(!initializedFlag){ + setup("https://github.com/$githubOrg/$githubProject") + } + project.addGithubPublishing(githubOrg, githubProject) + } - // Bintray publishing - var bintrayOrg: String? by project.extra - var bintrayUser: String? by project.extra - var bintrayApiKey: String? by project.extra - var bintrayRepo: String? by project.extra + /** + * Space publishing + */ + fun space(spaceRepo: String = "https://maven.pkg.jetbrains.space/mipt-npm/p/sci/maven") { + require(initializedFlag){"The publishing is not set up use 'setup' method to do so"} + project.addSpacePublishing(spaceRepo) + } - // Sonatype publising - var sonatypeUser: String? by project.extra - var sonatypePassword: String? by project.extra +// // Bintray publishing +// var bintrayOrg: String? by project.extra +// var bintrayUser: String? by project.extra +// var bintrayApiKey: String? by project.extra +// var bintrayRepo: String? by project.extra + + /** + * Sonatype publising + */ + fun sonatype(){ + require(initializedFlag){"The publishing is not set up use 'setup' method to do so"} + project.addSonatypePublishing() + } } @@ -110,9 +133,9 @@ open class KScienceProjectPlugin : Plugin { if (rootReadmeExtension.readmeTemplate.exists()) { val modulesString = buildString { - subprojects.forEach { subproject-> + subprojects.forEach { subproject -> val name = subproject.name - val path = subproject.path.replaceFirst(":","").replace(":","/") + val path = subproject.path.replaceFirst(":", "").replace(":", "/") val ext = subproject.extensions.findByType() appendln("
") appendln("\n* ### [$name]($path)") diff --git a/src/main/kotlin/ru/mipt/npm/gradle/KSciencePublishingPlugin.kt b/src/main/kotlin/ru/mipt/npm/gradle/KSciencePublishingPlugin.kt index 109b065..7946020 100644 --- a/src/main/kotlin/ru/mipt/npm/gradle/KSciencePublishingPlugin.kt +++ b/src/main/kotlin/ru/mipt/npm/gradle/KSciencePublishingPlugin.kt @@ -2,235 +2,16 @@ package ru.mipt.npm.gradle import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.api.publish.PublishingExtension -import org.gradle.api.publish.maven.MavenPublication -import org.gradle.api.tasks.bundling.Jar -import org.gradle.kotlin.dsl.* -import org.gradle.plugins.signing.SigningExtension -import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension -import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension - - -private fun Project.isSnapshot() = version.toString().contains("dev") || version.toString().endsWith("SNAPSHOT") +@Deprecated("To be replaced by maven-publish") open class KSciencePublishingPlugin : Plugin { - override fun apply(project: Project): Unit { - - //Add publishing plugin and new publications - project.run { - if (plugins.findPlugin("maven-publish") == null) { - plugins.apply("maven-publish") - } - - configure { - plugins.withId("ru.mipt.npm.gradle.js") { - val kotlin = extensions.findByType()!! - - val sourcesJar: Jar by project.tasks.creating(Jar::class) { - archiveClassifier.set("sources") - from(kotlin.sourceSets["main"].kotlin) - } - - publications { - create("js", MavenPublication::class) { - from(components["kotlin"]) - artifact(sourcesJar) - } - } - } - - plugins.withId("ru.mipt.npm.gradle.jvm") { - val kotlin = extensions.findByType()!! - - val sourcesJar: Jar by project.tasks.creating(Jar::class) { - archiveClassifier.set("sources") - from(kotlin.sourceSets["main"].kotlin) - } - - publications { - create("jvm", MavenPublication::class) { - from(components["kotlin"]) - artifact(sourcesJar) - } - } - } - } - } - - //configure publications after everything is set in the root project - project.rootProject.afterEvaluate { - //root project release task - val release by tasks.getting - project.run { - val githubOrg: String = project.findProperty("githubOrg") as? String ?: "mipt-npm" - val githubProject: String? by project - val vcs = findProperty("vcs") as? String - ?: githubProject?.let { "https://github.com/$githubOrg/$it" } - - configure { - val dokkaJar: Jar by tasks.creating(Jar::class) { - group = "documentation" - archiveClassifier.set("javadoc") - from(tasks.findByName("dokkaHtml")) - } - - // Process each publication we have in this project - publications.withType().forEach { publication -> - publication.artifact(dokkaJar) - publication.pom { - name.set(project.name) - description.set(project.description ?: project.name) - vcs?.let { url.set(vcs) } - - licenses { - license { - name.set("The Apache Software License, Version 2.0") - url.set("http://www.apache.org/licenses/LICENSE-2.0.txt") - distribution.set("repo") - } - } - developers { - developer { - id.set("MIPT-NPM") - name.set("MIPT nuclear physics methods laboratory") - organization.set("MIPT") - organizationUrl.set("http://npm.mipt.ru") - } - - } - vcs?.let { - scm { - url.set(vcs) - tag.set(project.version.toString()) - //developerConnection = "scm:git:[fetch=]/*ВАША ССЫЛКА НА .git файл*/[push=]/*Повторить предыдущую ссылку*/" - } - } - } - } - - val githubUser: String? by project - val githubToken: String? by project - - if (githubProject != null && githubUser != null && githubToken != null) { - project.logger.info("Adding github publishing to project [${project.name}]") - repositories { - maven { - name = "github" - url = uri("https://maven.pkg.github.com/mipt-npm/$githubProject/") - credentials { - username = githubUser - password = githubToken - } - } - } - } - - val spaceRepo: String? by project - val spaceUser: String? by project - val spaceToken: String? by project - - if (spaceRepo != null && spaceUser != null && spaceToken != null) { - project.logger.info("Adding mipt-npm Space publishing to project [${project.name}]") - repositories { - maven { - name = "space" - url = uri(spaceRepo!!) - credentials { - username = spaceUser - password = spaceToken - } - - } - } - } - - val bintrayOrg = project.findProperty("bintrayOrg") as? String ?: "mipt-npm" - val bintrayUser: String? by project - val bintrayApiKey: String? by project - val bintrayPublish: String? by project - - val bintrayRepo = if (isSnapshot()) { - "dev" - } else { - findProperty("bintrayRepo") as? String - } - - val projectName = project.name - - if (bintrayPublish == "true" && bintrayRepo != null && bintrayUser != null && bintrayApiKey != null) { - project.logger.info("Adding bintray publishing to project [$projectName]") - - repositories { - maven { - name = "bintray" - url = uri( - "https://api.bintray.com/maven/$bintrayOrg/$bintrayRepo/$projectName/;publish=1;override=1" - ) - credentials { - username = bintrayUser - password = bintrayApiKey - } - } - } - } - - val sonatypePublish: String? by project - val sonatypeUser: String? by project - val sonatypePassword: String? by project - - val keyId: String? by project - val signingKey: String? = - project.findProperty("signingKey") as? String ?: System.getenv("signingKey") - val signingKeyPassphrase: String? by project - - if (sonatypePublish == "true" && sonatypeUser != null && sonatypePassword != null && !isSnapshot()) { - val sonatypeRepo: String = "https://oss.sonatype.org/service/local/staging/deploy/maven2" - - if (plugins.findPlugin("signing") == null) { - plugins.apply("signing") - } - - extensions.configure("signing") { - if (!signingKey.isNullOrBlank()) { - //if key is provided, use it - @Suppress("UnstableApiUsage") - useInMemoryPgpKeys(keyId, signingKey, signingKeyPassphrase) - } // else use file signing - sign(publications) - } - - repositories { - maven { - name = "sonatype" - url = uri(sonatypeRepo) - credentials { - username = sonatypeUser - password = sonatypePassword - } - } - } - } - } - - - val publicationPlatform = project.findProperty("publication.platform") as? String - val publicationName = if (publicationPlatform == null) { - "AllPublications" - } else { - publicationPlatform.capitalize() + "Publication" - } - - tasks.findByName("publish${publicationName}ToSonatypeRepository")?.let { - release.dependsOn(it) - } - - tasks.findByName("publish${publicationName}ToSpaceRepository")?.let { - release.dependsOn(it) - } - } + override fun apply(project: Project): Unit = project.run { + if (plugins.findPlugin("maven-publish") == null) { + plugins.apply("maven-publish") } } + } diff --git a/src/main/kotlin/ru/mipt/npm/gradle/internal/common.kt b/src/main/kotlin/ru/mipt/npm/gradle/internal/common.kt index ab26d38..21ca61d 100644 --- a/src/main/kotlin/ru/mipt/npm/gradle/internal/common.kt +++ b/src/main/kotlin/ru/mipt/npm/gradle/internal/common.kt @@ -21,14 +21,11 @@ internal fun LanguageSettingsBuilder.applySettings(): Unit { internal fun RepositoryHandler.applyRepos(): Unit { mavenCentral() + maven("https://repo.kotlin.link") maven("https://dl.bintray.com/kotlin/kotlin-eap") maven("https://dl.bintray.com/kotlin/kotlin-dev") maven("https://kotlin.bintray.com/kotlinx") maven("https://kotlin.bintray.com/kotlin-js-wrappers/") - maven("https://dl.bintray.com/mipt-npm/kscience") - maven("https://dl.bintray.com/mipt-npm/dev") - maven("https://dl.bintray.com/mipt-npm/dataforge") - maven("https://repo.kotlin.link") } internal fun Copy.fromJsDependencies(configurationName: String) = project.afterEvaluate { diff --git a/src/main/kotlin/ru/mipt/npm/gradle/internal/publishing.kt b/src/main/kotlin/ru/mipt/npm/gradle/internal/publishing.kt new file mode 100644 index 0000000..9e3c310 --- /dev/null +++ b/src/main/kotlin/ru/mipt/npm/gradle/internal/publishing.kt @@ -0,0 +1,210 @@ +package ru.mipt.npm.gradle.internal + +import org.gradle.api.Project +import org.gradle.api.publish.PublishingExtension +import org.gradle.api.publish.maven.MavenPublication +import org.gradle.api.tasks.bundling.Jar +import org.gradle.kotlin.dsl.* +import org.gradle.plugins.signing.SigningExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension +import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension + +private fun Project.requestPropertyOrNull(propertyName: String): String? = findProperty(propertyName) as? String + ?: System.getenv(propertyName) + +private fun Project.requestProperty(propertyName: String): String = requestPropertyOrNull(propertyName) + ?: error("Property $propertyName not defined") + + +internal fun Project.setupPublication(vcs: String) = allprojects { + plugins.withId("maven-publish") { + configure { + + plugins.withId("ru.mipt.npm.gradle.js") { + val kotlin = extensions.findByType()!! + + val sourcesJar: Jar by tasks.creating(Jar::class) { + archiveClassifier.set("sources") + from(kotlin.sourceSets["main"].kotlin) + } + + publications { + create("js", MavenPublication::class) { + from(components["kotlin"]) + artifact(sourcesJar) + } + } + } + + plugins.withId("ru.mipt.npm.gradle.jvm") { + val kotlin = extensions.findByType()!! + + val sourcesJar: Jar by tasks.creating(Jar::class) { + archiveClassifier.set("sources") + from(kotlin.sourceSets["main"].kotlin) + } + + publications { + create("jvm", MavenPublication::class) { + from(components["kotlin"]) + artifact(sourcesJar) + } + } + } + + val dokkaJar: Jar by tasks.creating(Jar::class) { + group = "documentation" + archiveClassifier.set("javadoc") + from(tasks.findByName("dokkaHtml")) + } + + // Process each publication we have in this project + publications.withType().forEach { publication -> + publication.artifact(dokkaJar) + publication.pom { + name.set(project.name) + description.set(project.description ?: project.name) + url.set(vcs) + + licenses { + license { + name.set("The Apache Software License, Version 2.0") + url.set("http://www.apache.org/licenses/LICENSE-2.0.txt") + distribution.set("repo") + } + } + developers { + developer { + id.set("MIPT-NPM") + name.set("MIPT nuclear physics methods laboratory") + organization.set("MIPT") + organizationUrl.set("http://npm.mipt.ru") + } + + } + scm { + url.set(vcs) + tag.set(project.version.toString()) + //developerConnection = "scm:git:[fetch=]/*ВАША ССЫЛКА НА .git файл*/[push=]/*Повторить предыдущую ссылку*/" + } + + } + } + } + } +} + +internal fun Project.isSnapshot() = version.toString().contains("dev") || version.toString().endsWith("SNAPSHOT") + +internal val Project.publicationTarget: String + get() { + val publicationPlatform = project.findProperty("publication.platform") as? String + return if (publicationPlatform == null) { + "AllPublications" + } else { + publicationPlatform.capitalize() + "Publication" + } + } + +internal fun Project.addGithubPublishing( + githubOrg: String, + githubProject: String +) { + val githubUser: String = requestProperty("publishing.github.user") + val githubToken: String = requestProperty("publishing.github.token") + + allprojects { + plugins.withId("maven-publish") { + configure { + logger.info("Adding github publishing to project [${project.name}]") + repositories { + maven { + name = "github" + url = uri("https://maven.pkg.github.com/$githubOrg/$githubProject/") + credentials { + username = githubUser + password = githubToken + } + } + } + } + val publicationTask = tasks.getByName("publish${publicationTarget}ToGithubRepository") + rootProject.tasks.findByName("release")?.dependsOn(publicationTask) + } + } +} + +internal fun Project.addSpacePublishing(spaceRepo: String) { + val spaceUser: String = requestProperty("publishing.space.user") + val spaceToken: String = requestProperty("publishing.space.token") + + allprojects { + plugins.withId("maven-publish") { + configure { + project.logger.info("Adding mipt-npm Space publishing to project [${project.name}]") + repositories { + maven { + name = "space" + url = uri(spaceRepo) + credentials { + username = spaceUser + password = spaceToken + } + + } + } + } + val publicationTask = tasks.getByName("publish${publicationTarget}ToSpaceRepository") + rootProject.tasks.findByName("release")?.dependsOn(publicationTask) + } + } +} + +internal fun Project.addSonatypePublishing() { + val sonatypeUser: String = requestProperty("publishing.sonatype.user") + val sonatypePassword: String = requestProperty("publishing.sonatype.password") + val signingId: String? = requestPropertyOrNull("publishing.signing.id") + + + allprojects { + plugins.withId("maven-publish") { + configure { + val sonatypeRepo: String = "https://oss.sonatype.org/service/local/staging/deploy/maven2" + + if (plugins.findPlugin("signing") == null) { + plugins.apply("signing") + } + extensions.configure("signing") { + if (!signingId.isNullOrBlank()) { + val signingKey: String = requestProperty("publishing.signing.key") + val signingPassphrase: String = requestProperty("publishing.signing.passPhrase") + + //if key is provided, use it + @Suppress("UnstableApiUsage") + useInMemoryPgpKeys(signingId, signingKey, signingPassphrase) + } // else use file signing + sign(publications) + } + + repositories { + maven { + name = "sonatype" + url = uri(sonatypeRepo) + credentials { + username = sonatypeUser + password = sonatypePassword + } + } + } + } + val publicationTask = tasks.getByName("publish${publicationTarget}ToSonatypeRepository") + rootProject.tasks.findByName("release")?.dependsOn(publicationTask) + } + } +} + +//internal val Project.bintrayPublish: Boolean +// get() = (findProperty("publishing.bintray.publish") as? String)?.toBoolean() ?: false +//internal val Project.bintrayOrg: String? get() = findProperty("publishing.bintray.org") as? String +//internal val Project.bintrayUser: String? get() = findProperty("publishing.bintray.user") as? String +//internal val Project.bintrayApiKey: String? get() = findProperty("publishing.bintray.apiKey") as? String