From 59131f8138abe9948fce0e36d652cafc0fca03b3 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Mon, 7 Nov 2022 18:51:22 +0100 Subject: [PATCH] Use BCV plugin to dump and check public API of Kotlin Gradle plugin-related artifacts --- .../build.gradle | 5 --- .../RuntimePublicAPITest.kt | 34 ------------------- .../api/kotlin-gradle-plugin-annotations.api} | 0 .../build.gradle.kts | 11 ++++++ .../tools/kotlin-gradle-plugin-api/ReadMe.md | 12 +++---- .../api/kotlin-gradle-plugin-api.api} | 0 .../kotlin-gradle-plugin-api/build.gradle.kts | 11 ++++++ .../api/kotlin-gradle-plugin-idea-proto.api} | 0 .../build.gradle.kts | 17 ++++++---- .../tools/kotlin-gradle-plugin-idea/ReadMe.md | 10 ++++-- .../api/kotlin-gradle-plugin-idea.api} | 0 .../build.gradle.kts | 11 ++++++ .../api/kotlin-tooling-core.api} | 0 .../kotlin-tooling-core/build.gradle.kts | 7 ++++ 14 files changed, 64 insertions(+), 54 deletions(-) rename libraries/tools/{binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-annotations.txt => kotlin-gradle-plugin-annotations/api/kotlin-gradle-plugin-annotations.api} (100%) rename libraries/tools/{binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-api.txt => kotlin-gradle-plugin-api/api/kotlin-gradle-plugin-api.api} (100%) rename libraries/tools/{binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-idea-proto.txt => kotlin-gradle-plugin-idea-proto/api/kotlin-gradle-plugin-idea-proto.api} (100%) rename libraries/tools/{binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-idea.txt => kotlin-gradle-plugin-idea/api/kotlin-gradle-plugin-idea.api} (100%) rename libraries/tools/{binary-compatibility-validator/reference-public-api/kotlin-tooling-core.txt => kotlin-tooling-core/api/kotlin-tooling-core.api} (100%) diff --git a/libraries/tools/binary-compatibility-validator/build.gradle b/libraries/tools/binary-compatibility-validator/build.gradle index 4b95337f327..40f7198c0d0 100644 --- a/libraries/tools/binary-compatibility-validator/build.gradle +++ b/libraries/tools/binary-compatibility-validator/build.gradle @@ -15,11 +15,6 @@ dependencies { testArtifacts project(':kotlin-stdlib-jdk7') testArtifacts project(':kotlin-stdlib-jdk8') testArtifacts project(':kotlin-reflect') - testArtifacts project(':kotlin-gradle-plugin-idea') - testArtifacts project(path: ":kotlin-gradle-plugin-idea-proto", configuration: "binaryValidationApiElements") - testArtifacts project(':kotlin-tooling-core') - testArtifacts project(':kotlin-gradle-plugin-api') - testArtifacts project(':kotlin-gradle-plugin-annotations') } pill { diff --git a/libraries/tools/binary-compatibility-validator/src/test/kotlin/org.jetbrains.kotlin.tools.tests/RuntimePublicAPITest.kt b/libraries/tools/binary-compatibility-validator/src/test/kotlin/org.jetbrains.kotlin.tools.tests/RuntimePublicAPITest.kt index e3c9227d8c5..5496f9338af 100644 --- a/libraries/tools/binary-compatibility-validator/src/test/kotlin/org.jetbrains.kotlin.tools.tests/RuntimePublicAPITest.kt +++ b/libraries/tools/binary-compatibility-validator/src/test/kotlin/org.jetbrains.kotlin.tools.tests/RuntimePublicAPITest.kt @@ -35,40 +35,6 @@ class RuntimePublicAPITest { snapshotAPIAndCompare("../../reflect/api/build/libs", "kotlin-reflect-api(?!-[-a-z]+)", nonPublicPackages = listOf("kotlin.reflect.jvm.internal")) } - @Test fun kotlinGradlePluginAnnotations() { - snapshotAPIAndCompare( - "../kotlin-gradle-plugin-annotations/build/libs", "kotlin-gradle-plugin-annotations(?!-[-a-z]+)", - nonPublicAnnotations = listOf("org/jetbrains/kotlin/gradle/InternalKotlinGradlePluginApi") - ) - } - - @Test fun kotlinGradlePluginApi() { - snapshotAPIAndCompare( - "../kotlin-gradle-plugin-api/build/libs", "kotlin-gradle-plugin-api(?!-[-a-z]+)", - nonPublicAnnotations = listOf("org/jetbrains/kotlin/gradle/InternalKotlinGradlePluginApi") - ) - } - - @Test fun kotlinGradlePluginIdea() { - snapshotAPIAndCompare( - "../kotlin-gradle-plugin-idea/build/libs", "kotlin-gradle-plugin-idea(?!-[-a-z]+)", - nonPublicAnnotations = listOf("org/jetbrains/kotlin/gradle/InternalKotlinGradlePluginApi") - ) - } - - @Test fun kotlinGradlePluginIdeaProto() { - snapshotAPIAndCompare( - basePath = "../kotlin-gradle-plugin-idea-proto/build/libs", - jarPattern = "kotlin-gradle-plugin-idea-proto-api(?!-[-a-z]+)", - nonPublicPackages = listOf("org/jetbrains/kotlin/gradle/idea/proto/generated"), - nonPublicAnnotations = listOf("org/jetbrains/kotlin/gradle/InternalKotlinGradlePluginApi") - ) - } - - @Test fun kotlinToolingCore() { - snapshotAPIAndCompare("../kotlin-tooling-core/build/libs", "kotlin-tooling-core(?!-[-a-z]+)") - } - private fun snapshotAPIAndCompare( basePath: String, jarPattern: String, diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-annotations.txt b/libraries/tools/kotlin-gradle-plugin-annotations/api/kotlin-gradle-plugin-annotations.api similarity index 100% rename from libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-annotations.txt rename to libraries/tools/kotlin-gradle-plugin-annotations/api/kotlin-gradle-plugin-annotations.api diff --git a/libraries/tools/kotlin-gradle-plugin-annotations/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-annotations/build.gradle.kts index 415bbcfd4fe..e555831a01c 100644 --- a/libraries/tools/kotlin-gradle-plugin-annotations/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-annotations/build.gradle.kts @@ -1,6 +1,7 @@ plugins { kotlin("jvm") id("jps-compatible") + id("org.jetbrains.kotlinx.binary-compatibility-validator") } configureKotlinCompileTasksGradleCompatibility() @@ -10,4 +11,14 @@ standardPublicJars() dependencies { compileOnly(kotlinStdlib()) +} + +apiValidation { + nonPublicMarkers += "org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi" +} + +tasks { + apiBuild { + inputJar.value(jar.flatMap { it.archiveFile }) + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-api/ReadMe.md b/libraries/tools/kotlin-gradle-plugin-api/ReadMe.md index b385f8b8fd9..423eb8aff82 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/ReadMe.md +++ b/libraries/tools/kotlin-gradle-plugin-api/ReadMe.md @@ -3,11 +3,11 @@ Lightweight module defining the API surface of the Kotlin Gradle Plugin. ### Binary Compatibility Validation -This module is tested for Binary Compatibility Validation by the :tools:binary-compatibility-validator module. -Please see [ReadMe.md](../binary-compatibility-validator/ReadMe.md) -You can execute binary compatibility validation by a shared run-configuration in the IDE -`/Tests/Test: binary compatibility` +The public API surface of this module is checked for stability +using the [binary compatibility validator](https://github.com/Kotlin/binary-compatibility-validator/) plugin +to prevent accidental public API changes. -In order to check in changes you can launch -`Test/Test: binary compatibility [overwrite]` \ No newline at end of file +You can execute public API validation by running `apiCheck` task (also executed when `check` task runs). + +In order to overwrite the reference API snapshot, you can launch `apiDump` task. diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-api.txt b/libraries/tools/kotlin-gradle-plugin-api/api/kotlin-gradle-plugin-api.api similarity index 100% rename from libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-api.txt rename to libraries/tools/kotlin-gradle-plugin-api/api/kotlin-gradle-plugin-api.api diff --git a/libraries/tools/kotlin-gradle-plugin-api/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-api/build.gradle.kts index 3ea320050ee..e550d698c88 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-api/build.gradle.kts @@ -1,6 +1,7 @@ plugins { id("gradle-plugin-dependency-configuration") id("jps-compatible") + id("org.jetbrains.kotlinx.binary-compatibility-validator") } dependencies { @@ -21,3 +22,13 @@ dependencies { embedded(project(":kotlin-gradle-compiler-types")) { isTransitive = false } } + +apiValidation { + nonPublicMarkers += "org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi" +} + +tasks { + apiBuild { + inputJar.value(jar.flatMap { it.archiveFile }) + } +} \ No newline at end of file diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-idea-proto.txt b/libraries/tools/kotlin-gradle-plugin-idea-proto/api/kotlin-gradle-plugin-idea-proto.api similarity index 100% rename from libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-idea-proto.txt rename to libraries/tools/kotlin-gradle-plugin-idea-proto/api/kotlin-gradle-plugin-idea-proto.api diff --git a/libraries/tools/kotlin-gradle-plugin-idea-proto/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-idea-proto/build.gradle.kts index 6901ee924b0..13385800405 100644 --- a/libraries/tools/kotlin-gradle-plugin-idea-proto/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-idea-proto/build.gradle.kts @@ -4,6 +4,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { kotlin("jvm") + id("org.jetbrains.kotlinx.binary-compatibility-validator") } kotlin { @@ -46,17 +47,21 @@ runtimeJar(tasks.register("embeddable")) { /* Setup configuration for binary compatibility tests */ run { - val binaryValidationApiElements by configurations.creating { - isCanBeResolved = false - isCanBeConsumed = true - } - val binaryValidationApiJar = tasks.register("binaryValidationApiJar") { this.archiveBaseName.set(project.name + "-api") from(mainSourceSet.output) } - artifacts.add(binaryValidationApiElements.name, binaryValidationApiJar) + apiValidation { + ignoredPackages += "org.jetbrains.kotlin.gradle.idea.proto.generated" + nonPublicMarkers += "org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi" + } + + tasks { + apiBuild { + inputJar.value(binaryValidationApiJar.flatMap { it.archiveFile }) + } + } } /* Setup protoc */ diff --git a/libraries/tools/kotlin-gradle-plugin-idea/ReadMe.md b/libraries/tools/kotlin-gradle-plugin-idea/ReadMe.md index fb84a51355d..ccdc0738806 100644 --- a/libraries/tools/kotlin-gradle-plugin-idea/ReadMe.md +++ b/libraries/tools/kotlin-gradle-plugin-idea/ReadMe.md @@ -3,11 +3,15 @@ The classes defined in this module will be available inside the Kotlin Gradle Plugin (KGP) as well as in the IDE import (GradleProject). -## Binary Compatibility: +## Binary Compatibility -Binary compatibility can be tested by +The public API surface of this module is checked for stability +using the [binary compatibility validator](https://github.com/Kotlin/binary-compatibility-validator/) plugin +to prevent accidental public API changes. -`./gradlew :tools:binary-compatibility-validator:clean :tools:binary-compatibility-validator:test` +You can execute public API validation by running `apiCheck` task (also executed when `check` task runs). + +In order to overwrite the reference API snapshot, you can launch `apiDump` task. Binary incompatible changes have to go through a proper deprecation cycle after releases diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-idea.txt b/libraries/tools/kotlin-gradle-plugin-idea/api/kotlin-gradle-plugin-idea.api similarity index 100% rename from libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-idea.txt rename to libraries/tools/kotlin-gradle-plugin-idea/api/kotlin-gradle-plugin-idea.api diff --git a/libraries/tools/kotlin-gradle-plugin-idea/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-idea/build.gradle.kts index 704db8c5eeb..1d91ab4c96d 100644 --- a/libraries/tools/kotlin-gradle-plugin-idea/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-idea/build.gradle.kts @@ -4,6 +4,7 @@ plugins { kotlin("jvm") `java-test-fixtures` `maven-publish` + id("org.jetbrains.kotlinx.binary-compatibility-validator") } kotlin.sourceSets.configureEach { @@ -61,6 +62,16 @@ publish(moduleMetadata = true) { javadocJar() sourcesJar() +apiValidation { + nonPublicMarkers += "org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi" +} + +tasks { + apiBuild { + inputJar.value(jar.flatMap { it.archiveFile }) + } +} + //region Setup: Backwards compatibility tests run { diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-tooling-core.txt b/libraries/tools/kotlin-tooling-core/api/kotlin-tooling-core.api similarity index 100% rename from libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-tooling-core.txt rename to libraries/tools/kotlin-tooling-core/api/kotlin-tooling-core.api diff --git a/libraries/tools/kotlin-tooling-core/build.gradle.kts b/libraries/tools/kotlin-tooling-core/build.gradle.kts index 456c03713a8..28e3374e4d0 100644 --- a/libraries/tools/kotlin-tooling-core/build.gradle.kts +++ b/libraries/tools/kotlin-tooling-core/build.gradle.kts @@ -1,6 +1,7 @@ plugins { kotlin("jvm") id("jps-compatible") + id("org.jetbrains.kotlinx.binary-compatibility-validator") } publish() @@ -17,3 +18,9 @@ dependencies { compileOnly(kotlinStdlib()) testImplementation(project(":kotlin-test:kotlin-test-junit")) } + +tasks { + apiBuild { + inputJar.value(jar.flatMap { it.archiveFile }) + } +} \ No newline at end of file