From ce2cccba9fef14f98934cf26ad8ace27c3c0bceb Mon Sep 17 00:00:00 2001 From: chris Date: Fri, 26 Sep 2025 16:08:49 -0300 Subject: [PATCH 1/4] build: use android quality plugin --- rollbar-android/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rollbar-android/build.gradle.kts b/rollbar-android/build.gradle.kts index 781aea60..1cb0dd75 100644 --- a/rollbar-android/build.gradle.kts +++ b/rollbar-android/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("com.android.library") } -//apply(from = "$rootDir/gradle/android.quality.gradle") TODO: use the plugin +apply(from = "$rootDir/gradle/android.quality.gradle") android { namespace = "com.rollbar.android" From c6b44ef119609d60db47092b047030d3414a2b01 Mon Sep 17 00:00:00 2001 From: chris Date: Sat, 27 Sep 2025 17:24:00 -0300 Subject: [PATCH 2/4] refactor: use convention plugin --- build-logic/conventions/build.gradle.kts | 5 ++ .../src/main/kotlin/AndroidQualityPlugin.kt | 79 ++++++++++++++++++ gradle/android.quality.gradle | 82 ------------------- rollbar-android/build.gradle.kts | 3 +- 4 files changed, 85 insertions(+), 84 deletions(-) create mode 100644 build-logic/conventions/src/main/kotlin/AndroidQualityPlugin.kt delete mode 100644 gradle/android.quality.gradle diff --git a/build-logic/conventions/build.gradle.kts b/build-logic/conventions/build.gradle.kts index f0034f1b..2052464d 100644 --- a/build-logic/conventions/build.gradle.kts +++ b/build-logic/conventions/build.gradle.kts @@ -11,6 +11,7 @@ repositories { dependencies { implementation("com.vanniktech:gradle-maven-publish-plugin:0.34.0") + implementation("com.github.spotbugs.snom:spotbugs-gradle-plugin:6.3.0") } gradlePlugin { @@ -19,5 +20,9 @@ gradlePlugin { id = "com.rollbar.conventions.release" implementationClass = "RollbarPublishPlugin" } + register("androidQuality") { + id = "com.rollbar.android.quality" + implementationClass = "AndroidQualityPlugin" + } } } diff --git a/build-logic/conventions/src/main/kotlin/AndroidQualityPlugin.kt b/build-logic/conventions/src/main/kotlin/AndroidQualityPlugin.kt new file mode 100644 index 00000000..adc98497 --- /dev/null +++ b/build-logic/conventions/src/main/kotlin/AndroidQualityPlugin.kt @@ -0,0 +1,79 @@ +import com.github.spotbugs.snom.Confidence +import com.github.spotbugs.snom.Effort +import com.github.spotbugs.snom.SpotBugsTask +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.plugins.quality.Checkstyle +import org.gradle.api.plugins.quality.CheckstyleExtension +import org.gradle.testing.jacoco.tasks.JacocoReport + +class AndroidQualityPlugin : Plugin { + override fun apply(project: Project) { + with(project) { + + pluginManager.apply("checkstyle") + pluginManager.apply("com.github.spotbugs-base") + pluginManager.apply("jacoco") + + extensions.configure(CheckstyleExtension::class.java) { + configFile = rootProject.file("tools/checkstyle/google_checks.xml") + } + + tasks.register("checkstyleMain", Checkstyle::class.java) { + source("src") + include("**/*.java") + exclude("**/gen/**", "**/*Test.java", "**/annotation/*.java") + classpath = files() + reports { + xml.required.set(false) + html.required.set(true) + } + isIgnoreFailures = true + } + + extensions.configure("spotbugs") { + includeFilter.set(rootProject.file("tools/findbugs/findbugs.xml")) + } + + tasks.register("spotbugsMain", SpotBugsTask::class.java) { + dependsOn(tasks.matching { it.name.startsWith("assemble") }) + + ignoreFailures = true + effort.set(Effort.MAX) + reportLevel.set(Confidence.MEDIUM) + + classes = fileTree("build/intermediates/javac/debug/classes/") + sourceDirs.from(fileTree("src/main/java")) + auxClassPaths.from(files()) + + projectName.set(project.name) + release.set(project.version.toString()) + + reports.create("html") { + required.set(true) + outputLocation.set(layout.buildDirectory.file("reports/spotbugs/main/spotbugs.html").get().asFile) + setStylesheet("fancy-hist.xsl") + } + } + + extensions.configure("jacoco") { + toolVersion = "0.8.6" + } + + tasks.register("jacocoTestReport", JacocoReport::class.java) { + dependsOn("test") + + reports { + xml.required.set(false) + csv.required.set(false) + html.required.set(true) + html.outputLocation.set(layout.buildDirectory.dir("jacocoHtml")) + } + } + + tasks.named("check") { + dependsOn("checkstyleMain", "spotbugsMain") + } + } + } +} diff --git a/gradle/android.quality.gradle b/gradle/android.quality.gradle deleted file mode 100644 index 9f61977f..00000000 --- a/gradle/android.quality.gradle +++ /dev/null @@ -1,82 +0,0 @@ -import com.github.spotbugs.snom.SpotBugsTask - -buildscript { - repositories { - maven { - url "https://plugins.gradle.org/m2/" - } - } - dependencies { - classpath "gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.2.4" - } -} - -apply plugin: "checkstyle" -apply plugin: "com.github.spotbugs-base" -apply plugin: 'jacoco' - -checkstyle { - toolVersion = "8.2" - configFile = file("$rootDir/tools/checkstyle/google_checks.xml") -} - -tasks.register("checkstyleMain", Checkstyle) { - source 'src' - include '**/*.java' - exclude '**/gen/**' - exclude '**/*Test.java' - exclude '**/annotation/*.java' - classpath = files() - reports { - xml.required.set(false) - html.required.set(true) - } - // Set this to true until we fix our current errors. - ignoreFailures = true -} - -spotbugs { - toolVersion = '3.1.10' - includeFilter = file("$rootDir/tools/findbugs/findbugs.xml") -} - -tasks.register("spotbugsMain", SpotBugsTask) { - dependsOn tasks.matching { it.name.startsWith("assemble") } - - // Set this to true until we fix our current errors. - ignoreFailures = true - effort = "max" - reportLevel = "medium" - - classes.setFrom(fileTree("build/intermediates/javac/debug/classes/")) - source.setFrom(fileTree("src/main/java")) - classpath.setFrom(files()) - - projectName = project.name - release = VERSION_NAME - reports.html.required = true - reports.html.outputLocation = project.layout.buildDirectory.file("reports/spotbugs/main/spotbugs.html").get().asFile - reports.html.stylesheet = 'fancy-hist.xsl' -} - -jacoco { - toolVersion = '0.8.6' -} - -tasks.register("jacocoTestReport", JacocoReport) { - dependsOn "test" - - reports { - xml.required.set(false) - csv.required.set(false) - html.required.set(true) - html.outputLocation.set(project.layout.buildDirectory.dir("jacocoHtml")) - } -} -// adds checkstyle task to existing check task -afterEvaluate { - if (tasks.named("check")) { - check.dependsOn("checkstyleMain") - check.dependsOn("spotbugsMain") - } -} \ No newline at end of file diff --git a/rollbar-android/build.gradle.kts b/rollbar-android/build.gradle.kts index 1cb0dd75..5e1d9768 100644 --- a/rollbar-android/build.gradle.kts +++ b/rollbar-android/build.gradle.kts @@ -1,9 +1,8 @@ plugins { id("com.android.library") + id("com.rollbar.android.quality") } -apply(from = "$rootDir/gradle/android.quality.gradle") - android { namespace = "com.rollbar.android" compileSdk = 33 From 27be0adada00a267d7e386752dd072aaa650a3c7 Mon Sep 17 00:00:00 2001 From: chris Date: Sat, 27 Sep 2025 17:32:08 -0300 Subject: [PATCH 3/4] refactor: update convention plugin --- .../src/main/kotlin/AndroidQualityPlugin.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/build-logic/conventions/src/main/kotlin/AndroidQualityPlugin.kt b/build-logic/conventions/src/main/kotlin/AndroidQualityPlugin.kt index adc98497..93c4ad55 100644 --- a/build-logic/conventions/src/main/kotlin/AndroidQualityPlugin.kt +++ b/build-logic/conventions/src/main/kotlin/AndroidQualityPlugin.kt @@ -1,10 +1,12 @@ import com.github.spotbugs.snom.Confidence import com.github.spotbugs.snom.Effort +import com.github.spotbugs.snom.SpotBugsExtension import com.github.spotbugs.snom.SpotBugsTask import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.plugins.quality.Checkstyle import org.gradle.api.plugins.quality.CheckstyleExtension +import org.gradle.testing.jacoco.plugins.JacocoPluginExtension import org.gradle.testing.jacoco.tasks.JacocoReport class AndroidQualityPlugin : Plugin { @@ -16,11 +18,12 @@ class AndroidQualityPlugin : Plugin { pluginManager.apply("jacoco") extensions.configure(CheckstyleExtension::class.java) { + toolVersion = "8.2" configFile = rootProject.file("tools/checkstyle/google_checks.xml") } tasks.register("checkstyleMain", Checkstyle::class.java) { - source("src") + source = fileTree("src/main/java") include("**/*.java") exclude("**/gen/**", "**/*Test.java", "**/annotation/*.java") classpath = files() @@ -31,7 +34,8 @@ class AndroidQualityPlugin : Plugin { isIgnoreFailures = true } - extensions.configure("spotbugs") { + extensions.configure(SpotBugsExtension::class.java) { + toolVersion.set("6.3.0") includeFilter.set(rootProject.file("tools/findbugs/findbugs.xml")) } @@ -51,12 +55,12 @@ class AndroidQualityPlugin : Plugin { reports.create("html") { required.set(true) - outputLocation.set(layout.buildDirectory.file("reports/spotbugs/main/spotbugs.html").get().asFile) + outputLocation.set(layout.buildDirectory.file("reports/spotbugs/main/spotbugs.html")) setStylesheet("fancy-hist.xsl") } } - extensions.configure("jacoco") { + extensions.configure(JacocoPluginExtension::class.java) { toolVersion = "0.8.6" } From 673431744509ac4a743345626fa573bd550792cc Mon Sep 17 00:00:00 2001 From: chris Date: Sat, 27 Sep 2025 17:40:29 -0300 Subject: [PATCH 4/4] refactor: Exclude Jacoco instrumentation for Android Tests --- rollbar-android/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rollbar-android/build.gradle.kts b/rollbar-android/build.gradle.kts index 5e1d9768..e3e9fa45 100644 --- a/rollbar-android/build.gradle.kts +++ b/rollbar-android/build.gradle.kts @@ -21,7 +21,7 @@ android { } getByName("debug") { enableUnitTestCoverage = true - enableAndroidTestCoverage = true + enableAndroidTestCoverage = false } }