intellij-plugin-structure/build.gradle.kts (253 lines of code) (raw):

import okhttp3.MultipartBody import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody.Companion.asRequestBody import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import java.util.* plugins { `maven-publish` signing alias(sharedLibs.plugins.kotlin.jvm) alias(sharedLibs.plugins.versions) } buildscript { repositories { maven { url = uri("https://packages.jetbrains.team/maven/p/jcs/maven") } } dependencies { classpath("com.squareup.okhttp3:okhttp:4.12.0") } } var intellijPluginStructureVersion = "dev" if (project.hasProperty("structureVersion")) { val structureVersion = project.properties["structureVersion"].toString() intellijPluginStructureVersion = structureVersion } allprojects { group = "org.jetbrains.intellij.plugins" version = intellijPluginStructureVersion apply { plugin("java") plugin("kotlin") plugin("com.github.ben-manes.versions") } java { toolchain { languageVersion = JavaLanguageVersion.of(11) } } tasks.withType<JavaCompile>().configureEach { options.release = 11 } repositories { maven("https://cache-redirector.jetbrains.com/intellij-repository/releases") maven("https://cache-redirector.jetbrains.com/intellij-dependencies") mavenCentral() } dependencies { implementation(rootProject.sharedLibs.jackson.module.kotlin) implementation(rootProject.sharedLibs.kotlin.reflect) } val sourcesJar by tasks.registering(Jar::class) { dependsOn("classes") archiveClassifier = "sources" from(sourceSets.main.get().allSource) } val javadocJar by tasks.registering(Jar::class) { val javadoc = tasks.javadoc dependsOn(javadoc) archiveClassifier = "javadoc" from(javadoc) } artifacts { archives(sourcesJar) archives(javadocJar) } tasks.withType<KotlinCompile> { kotlinOptions { jvmTarget = "11" apiVersion = "1.4" languageVersion = "1.4" } } } val publicationConfigurations = mapOf( "BasePublication" to Triple("structure-base", "JetBrains Plugins Structure Base", "Base library for parsing JetBrains plugins. Used by other JetBrains Plugins structure libraries."), "ClassesPublication" to Triple("structure-classes", "JetBrains Plugins Structure Classes", "Base library for resolving class files and resources. Used by other JetBrains Plugins Structure Classes libraries."), "IntellijPublication" to Triple("structure-intellij", "JetBrains Plugins Structure IntelliJ", "Library for parsing JetBrains IDE plugins. Can be used to verify that plugin complies with JetBrains Marketplace requirements."), "IntellijClassesPublication" to Triple("structure-intellij-classes", "JetBrains Plugins Structure IntelliJ Classes", "Library for resolving class files and resources of JetBrains plugins."), "IdePublication" to Triple("structure-ide", "JetBrains Plugins Structure IntelliJ IDE", "Library for resolving class files and resources of IntelliJ Platform IDEs."), "IdeClassesPublication" to Triple("structure-ide-classes", "JetBrains Plugins Structure IntelliJ IDE Classes", "Library for resolving class files and resources of IntelliJ Platform IDEs."), "TeamCityPublication" to Triple("structure-teamcity", "JetBrains Plugins Structure TeamCity", "Library for parsing JetBrains TeamCity plugins. Can be used to verify that plugin complies with JetBrains Marketplace requirements."), "DotNetPublication" to Triple("structure-dotnet", "JetBrains Plugins Structure DotNet", "Library for parsing JetBrains DotNet plugins. Can be used to verify that plugin complies with JetBrains Marketplace requirements."), "HubPublication" to Triple("structure-hub", "JetBrains Plugins Structure Hub", "Library for parsing JetBrains Hub widgets. Can be used to verify that widget complies with JetBrains Marketplace requirements."), "EduPublication" to Triple("structure-edu", "JetBrains Plugins Structure Edu", "Library for parsing JetBrains Edu plugins. Can be used to verify that plugin complies with JetBrains Marketplace requirements."), "FleetPublication" to Triple("structure-fleet", "JetBrains Plugins Structure Fleet", "Library for parsing JetBrains Fleet plugins. Can be used to verify that plugin complies with JetBrains Marketplace requirements."), "ToolboxPublication" to Triple("structure-toolbox", "JetBrains Plugins Structure Toolbox", "Library for parsing JetBrains Toolbox plugins. Can be used to verify that plugin complies with JetBrains Marketplace requirements."), "TeamCityRecipesPublications" to Triple("structure-teamcity-recipes", "JetBrains Plugins Structure TeamCity Recipes", "Library for parsing JetBrains TeamCity recipes. Can be used to verify that plugin complies with JetBrains Marketplace requirements."), "YoutrackPublication" to Triple("structure-youtrack", "JetBrains Plugins Structure YouTrack Apps", "Library for parsing JetBrains YouTrack Apps. Can be used to verify that plugin complies with JetBrains Marketplace requirements.") ) publishing { repositories { maven { name = "artifacts" url = uri(layout.buildDirectory.dir("artifacts/maven")) } } publications { fun configurePublication(publicationName: String): MavenPublication { val (projectName, pubName, pubDesc) = requireNotNull(publicationConfigurations[publicationName]) return create<MavenPublication>(publicationName) { val proj = project(":$projectName") groupId = proj.group.toString() artifactId = proj.name version = proj.version.toString() from(proj.components["java"]) artifact(proj.tasks["sourcesJar"]) artifact(proj.tasks["javadocJar"]) pom { name = pubName description = pubDesc url = "https://github.com/JetBrains/intellij-plugin-verifier/tree/master/intellij-plugin-structure/$projectName" licenses { license { name = "The Apache Software License, Version 2.0" url = "https://www.apache.org/licenses/LICENSE-2.0.txt" } } developers { developer { id = "satamas" name = "Semyon Atamas" organization = "JetBrains" } developer { id = "AlexanderPrendota" name = "Alexander Prendota" organization = "JetBrains" } developer { id = "ktisha" name = "Ekaterina Smal" organization = "JetBrains" } developer { id = "chashnikov" name = "Nikolay Chashnikov" organization = "JetBrains" } developer { id = "chrkv" name = "Ivan Chirkov" organization = "JetBrains" } developer { id = "Ololoshechkin" name = "Brilyantov Vadim" organization = "JetBrains" } developer { id = "shalupov" name = "Leonid Shalupov" organization = "JetBrains" } developer { id = "hsz" name = "Jakub Chrzanowski" organization = "JetBrains" } developer { id = "kesarevs" name = "Kesarev Sergey" organization = "JetBrains" } developer { id = "LChernigovskaya" name = "Lidiya Chernigovskaya" organization = "JetBrains" } developer { id = "novotnyr" name = "Robert Novotny" organization = "JetBrains" } } scm { connection = "scm:git:git://github.com/JetBrains/intellij-plugin-verifier.git" developerConnection = "scm:git:ssh://github.com/JetBrains/intellij-plugin-verifier.git" url = "https://github.com/JetBrains/intellij-plugin-verifier" } } } } publicationConfigurations.keys.forEach { configurePublication(it) } } } signing { isRequired = System.getenv("TEAMCITY_VERSION") != null val signingKey: String? by project val signingPassword: String? by project useInMemoryPgpKeys(signingKey, signingPassword) publicationConfigurations.keys.forEach { sign(publishing.publications[it]) } } tasks { test { dependsOn(":tests:test") } publishToMavenLocal { dependsOn(test) } publish { dependsOn(test) } } tasks { val packSonatypeCentralBundle by registering(Zip::class) { group = "publishing" dependsOn(":publishAllPublicationsToArtifactsRepository") from(layout.buildDirectory.dir("artifacts/maven")) archiveFileName.set("bundle.zip") destinationDirectory.set(layout.buildDirectory) } val publishMavenToCentralPortal by registering { group = "publishing" dependsOn(packSonatypeCentralBundle) doLast { val uriBase = "https://central.sonatype.com/api/v1/publisher/upload" val publishingType = "USER_MANAGED" val deploymentName = "${project.name}-$version" val uri = "$uriBase?name=$deploymentName&publishingType=$publishingType" val centralPortalUserName: String? by project val centralPortalToken: String? by project val base64Auth = Base64 .getEncoder() .encode("$centralPortalUserName:$centralPortalToken".toByteArray()) .toString(Charsets.UTF_8) val bundleFile = packSonatypeCentralBundle.get().archiveFile.get().asFile println("Sending request to $uri...") val client = OkHttpClient() val request = Request.Builder() .url(uri) .header("Authorization", "Bearer $base64Auth") .post( MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("bundle", bundleFile.name, bundleFile.asRequestBody()) .build() ) .build() client.newCall(request).execute().use { response -> val statusCode = response.code println("Upload status code: $statusCode") println("Upload result: ${response.body!!.string()}") if (statusCode != 201) { error("Upload error to Central repository. Status code $statusCode.") } } } } }