Skip to content

Instantly share code, notes, and snippets.

@tabasavr
Last active January 18, 2023 09:39
Show Gist options
  • Save tabasavr/5c14485aec4fdf8a03173aeffd0f978a to your computer and use it in GitHub Desktop.
Save tabasavr/5c14485aec4fdf8a03173aeffd0f978a to your computer and use it in GitHub Desktop.
Detekt report merge via artifact sharing (almost working)
import io.gitlab.arturbosch.detekt.Detekt
import io.gitlab.arturbosch.detekt.DetektCreateBaselineTask
import io.gitlab.arturbosch.detekt.report.ReportMergeTask
plugins {
id("releasing")
id("io.gitlab.arturbosch.detekt")
alias(libs.plugins.gradleVersions)
}
configurations {
create("reportMergeInputs") {
setCanBeResolved(true)
setCanBeConsumed(false)
setVisible(false)
attributes.attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category::class, Category.VERIFICATION))
attributes.attribute(VerificationType.VERIFICATION_TYPE_ATTRIBUTE, objects.named(VerificationType::class, "detekt-report"))
}
}
// this works and calls `detekt` tasks if necessary,
// but it doesn't merge reports if any of them fail
val detektReportMergeSarif = tasks.register("mergeDetektReports", ReportMergeTask::class) {
//input.from({ configurations.getByName("reportMergeInputs").incoming.artifactView {
// componentFilter{ id -> id is ProjectComponentIdentifier }
// setLenient(true)
//}.files })
input.from(configurations.getByName("reportMergeInputs").incoming.artifacts.artifactFiles)
output.set(rootProject.layout.buildDirectory.file("reports/detekt/merge.sarif"))
}
allprojects {
group = "io.gitlab.arturbosch.detekt"
version = Versions.currentOrSnapshot()
apply(plugin = "io.gitlab.arturbosch.detekt")
detekt {
source = objects.fileCollection().from(
io.gitlab.arturbosch.detekt.extensions.DetektExtension.DEFAULT_SRC_DIR_JAVA,
io.gitlab.arturbosch.detekt.extensions.DetektExtension.DEFAULT_TEST_SRC_DIR_JAVA,
io.gitlab.arturbosch.detekt.extensions.DetektExtension.DEFAULT_SRC_DIR_KOTLIN,
io.gitlab.arturbosch.detekt.extensions.DetektExtension.DEFAULT_TEST_SRC_DIR_KOTLIN,
)
buildUponDefaultConfig = true
baseline = file("$rootDir/config/detekt/baseline.xml")
}
dependencies {
detekt(project(":detekt-cli"))
detektPlugins(project(":detekt-formatting"))
detektPlugins(project(":detekt-rules-libraries"))
detektPlugins(project(":detekt-rules-ruleauthors"))
}
val subproject = this
val configurationName = subproject.name + "DetektOutput"
subproject.configurations {
create(configurationName) {
println(subproject.name)
println(configurationName)
setCanBeResolved(false)
setCanBeConsumed(true)
setVisible(false)
attributes.attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category::class, Category.VERIFICATION))
attributes.attribute(VerificationType.VERIFICATION_TYPE_ATTRIBUTE, objects.named(VerificationType::class, "detekt-report"))
}
}
tasks.withType<Detekt> detekt@{
val task = this
jvmTarget = "1.8"
reports {
xml.required.set(true)
html.required.set(true)
txt.required.set(true)
sarif.required.set(true)
md.required.set(true)
}
basePath = rootProject.projectDir.absolutePath
// without afterEvaluate it will merge only `detekt.sarif` files
// but not any of the outputs with type resolution (e.g. `main.sarif`)
subproject.afterEvaluate {
subproject.configurations.getByName(configurationName).outgoing {
artifact(task.sarifReportFile) {
setType(ArtifactTypeDefinition.BINARY_DATA_TYPE)
builtBy(task) // task will be executed if we need its report
}
}
}
}
tasks.withType<DetektCreateBaselineTask>().configureEach {
jvmTarget = "1.8"
}
rootProject.dependencies {
"reportMergeInputs"(subproject)
}
}
subprojects {
tasks.withType<Test>().configureEach {
predictiveSelection {
enabled.set(System.getenv("CI") == null)
}
}
}
tasks.register("build") {
dependsOn(gradle.includedBuild("detekt-gradle-plugin").task(":build"))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment