Skip to content

Commit

Permalink
Add functionality to generate API changes (#4285)
Browse files Browse the repository at this point in the history
* Add functionality to generate API changes

* Update conventions/src/main/kotlin/otel.japicmp-conventions.gradle.kts

Co-authored-by: John Watson <jkwatson@gmail.com>

* Do not commit any API changes until we have stable release

Co-authored-by: John Watson <jkwatson@gmail.com>
  • Loading branch information
iNikem and jkwatson authored Oct 6, 2021
1 parent 66d58aa commit c283746
Show file tree
Hide file tree
Showing 7 changed files with 89 additions and 0 deletions.
1 change: 1 addition & 0 deletions conventions/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ dependencies {
implementation("me.champeau.jmh:jmh-gradle-plugin:0.6.5")
implementation("net.ltgt.gradle:gradle-errorprone-plugin:2.0.1")
implementation("net.ltgt.gradle:gradle-nullaway-plugin:1.1.0")
implementation("me.champeau.gradle:japicmp-gradle-plugin:0.3.0")

testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.2")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.2")
Expand Down
83 changes: 83 additions & 0 deletions conventions/src/main/kotlin/otel.japicmp-conventions.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import me.champeau.gradle.japicmp.JapicmpTask

plugins {
base

id("me.champeau.gradle.japicmp")
}

/**
* The latest *released* version of the project. Evaluated lazily so the work is only done if necessary.
*/
val latestReleasedVersion: String by lazy {
// hack to find the current released version of the project
val temp: Configuration = configurations.create("tempConfig")
// pick the agent, since it's always there.
dependencies.add(temp.name,"io.opentelemetry.javaagent:opentelemetry-javaagent:latest.release")
val moduleVersion = configurations["tempConfig"].resolvedConfiguration.firstLevelModuleDependencies.elementAt(0).moduleVersion

configurations.remove(temp)
logger.info("Discovered latest release version: $moduleVersion")
moduleVersion
}

/**
* Locate the project's artifact of a particular version.
*/
fun findArtifact(version: String): File {
val existingGroup = group
try {
val depModule = "${project.group}:${base.archivesName.get()}:$version@jar"
// Temporarily change the group name because we want to fetch an artifact with the same
// Maven coordinates as the project, which Gradle would not allow otherwise.
group = "virtual_group"
val depJar = "${base.archivesName.get()}-${version}.jar"
val configuration: Configuration = configurations.detachedConfiguration(
dependencies.create(depModule)
)
return files(configuration.files).filter {
it.name.equals(depJar)
}.singleFile
} finally {
group = existingGroup
}
}

tasks {
val jApiCmp by registering(JapicmpTask::class) {
dependsOn("jar")

// the japicmp "new" version is either the user-specified one, or the locally built jar.
val apiNewVersion: String? by project
val newArtifact = apiNewVersion?.let { findArtifact(it) }
?: file(getByName<Jar>("jar").archiveFile)
newClasspath = files(newArtifact)

//only output changes, not everything
isOnlyModified = true

// the japicmp "old" version is either the user-specified one, or the latest release.
val apiBaseVersion: String? by project
val baselineVersion = apiBaseVersion ?: latestReleasedVersion
oldClasspath = try {
files(findArtifact(baselineVersion))
} catch (e: Exception) {
//if we can't find the baseline artifact, this is probably one that's never been published before,
//so publish the whole API. We do that by flipping this flag, and comparing the current against nothing.
isOnlyModified = false
files()
}

//this is needed so that we only consider the current artifact, and not dependencies
isIgnoreMissingClasses = true
packageExcludes = listOf("*.internal", "*.internal.*")
val baseVersionString = if (apiBaseVersion == null) "latest" else baselineVersion
val newVersionString = if (apiNewVersion == null) "current" else apiNewVersion
txtOutputFile = file("$rootDir/docs/apidiffs/${newVersionString}_vs_${baseVersionString}/${base.archivesName.get()}.txt")
}
// have the check task depend on the api comparison task, to make it more likely it will get used.
named("check") {
dependsOn(jApiCmp)
}
}

1 change: 1 addition & 0 deletions instrumentation-api-annotation-support/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
plugins {
id("otel.java-conventions")
id("otel.jacoco-conventions")
id("otel.japicmp-conventions")
id("otel.publish-conventions")
}

Expand Down
1 change: 1 addition & 0 deletions instrumentation-api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ plugins {

id("otel.java-conventions")
id("otel.jacoco-conventions")
id("otel.japicmp-conventions")
id("otel.publish-conventions")
}

Expand Down
1 change: 1 addition & 0 deletions javaagent-extension-api/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
plugins {
id("otel.java-conventions")
id("otel.japicmp-conventions")
id("otel.publish-conventions")
}

Expand Down
1 change: 1 addition & 0 deletions javaagent-instrumentation-api/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
plugins {
id("otel.java-conventions")
id("otel.jacoco-conventions")
id("otel.japicmp-conventions")
id("otel.publish-conventions")
}

Expand Down
1 change: 1 addition & 0 deletions muzzle/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
plugins {
id("otel.java-conventions")
id("otel.japicmp-conventions")
id("otel.publish-conventions")
}

Expand Down

0 comments on commit c283746

Please sign in to comment.