xvik / gradle-quality-plugin

Gradle quality plugin for Java and Groovy
http://xvik.github.io/gradle-quality-plugin
MIT License
134 stars 11 forks source link

Combining quality plugin with testsets plugin and build dashboard #24

Closed boxleytw closed 4 years ago

boxleytw commented 4 years ago

This is an awesome plugin -- thank you!

On a project with separate integration tests from unit tests, I use the testsets plugin to setup a separate source root for integration tests, separate from unit tests. (See https://github.com/unbroken-dome/gradle-testsets-plugin).

I'm adding in the quality plugin, and encounter this Gradle error:

Execution failed for task ':buildDashboard'.
> Could not create task ':a:spotbugsIntegrationTest'.
   > Cannot change dependencies of dependency configuration ':a:spotbugs' after it has been resolved.

Is this something I can resolve myself?

Disabling the build dashboard plugin worked, but I lose the single HTML page to see all build reports.

The project is https://github.com/binkley/gradle-multiple-test-roots. I have not pushed commits to use the quality plugin (waiting to have a green build first).


Build files, not pushed:

build.gradle:

plugins {
    id "build-dashboard"
    id "jacoco"
    id "ru.vyarus.quality"
    id "org.unbroken-dome.test-sets"
    id "com.dorongold.task-tree"
    id "com.github.ben-manes.versions"
    id "se.patrikerdes.use-latest-versions"
}

apply plugin: BasePlugin

allprojects {
    group = "x"
    version = "0"

    jacoco {
        toolVersion = "${jacocoVersion}"
    }

    task jacoco {
        group = "Verification"
        description = "Checks Java test coverage."

        dependsOn tasks.withType(JacocoReportBase)
    }

    repositories {
        mavenCentral()
        jcenter()
    }
}

subprojects {
    apply plugin: "java"
    apply plugin: "jacoco"
    apply plugin: "ru.vyarus.quality"
    apply plugin: "org.unbroken-dome.test-sets"

    sourceCompatibility = 11
    targetCompatibility = 11

    dependencies {
        annotationProcessor "org.projectlombok:lombok:${lombokVersion}"

        compileOnly "org.projectlombok:lombok:${lombokVersion}"

        testAnnotationProcessor "org.projectlombok:lombok:${lombokVersion}"

        testCompileOnly "org.projectlombok:lombok:${lombokVersion}"

        testImplementation "org.junit.jupiter:junit-jupiter:${junitVersion}"
        testImplementation "org.assertj:assertj-core:${assertJVersion}"
    }

    tasks.withType(Test) {
        useJUnitPlatform()

        finalizedBy jacocoTestReport
    }

    tasks.withType(JacocoReportBase) {
        executionData(fileTree(buildDir).include("/jacoco/*.exec"))
    }

    jacocoTestCoverageVerification {
        violationRules {
            rule {
                limit {
                    counter = "LINE"
                    value = "COVEREDRATIO"
                    minimum = 1.00
                }
            }
        }

        dependsOn jacocoTestReport
    }

    quality {
        strict = false
    }

    check {
        dependsOn jacocoTestCoverageVerification
    }
}

task jacocoMerge(type: JacocoMerge) {
    subprojects.each { subproject ->
        executionData subproject.tasks.withType(Test)
    }
}

task jacocoMergedTestReport(type: JacocoReport) {
    dependsOn jacocoMerge

    executionData fileTree(buildDir).include("/jacoco/*.exec")
    sourceDirectories.setFrom(files(subprojects.sourceSets.main.allSource.srcDirs))
    classDirectories.setFrom(files(subprojects.sourceSets.main.output))

    reports {
        html.enabled = true
    }
}

check {
    dependsOn jacocoMergedTestReport
    finalizedBy buildDashboard
}

wrapper {
    distributionType = Wrapper.DistributionType.ALL
    gradleVersion = "${gradleWrapperVersion}"
}

settings.gradle:

pluginManagement {
    plugins {
        id "ru.vyarus.quality" version "${qualityPluginVersion}"
        id "org.unbroken-dome.test-sets" version "${testsetsPluginVersion}"
        id "com.dorongold.task-tree" version "${taskTreePluginVersion}"
        id "com.github.ben-manes.versions" version "${versionsPluginVersion}"
        id "se.patrikerdes.use-latest-versions" version "${useLatestVersionsPluginVersion}"
    }
}

rootProject.name = "gradle-multiple-test-roots"

include "a"
include "b"

gradle.properties:

org.gradle.caching=true
org.gradle.jvmargs=-Dfile.encoding=UTF-8
org.gradle.parallel=true
# Gradle versions
gradleWrapperVersion=6.3
# Plugin versions
qualityPluginVersion=4.2.1
taskTreePluginVersion=1.5
testsetsPluginVersion=3.0.1
useLatestVersionsPluginVersion=0.2.13
versionsPluginVersion=0.28.0
# Dependency versions
assertJVersion=3.15.0
jacocoVersion=0.8.5
junitVersion=5.6.2
lombokVersion=1.18.12

Gradle stacktrace says:

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':buildDashboard'.
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:38)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:372)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:359)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:352)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: org.gradle.api.internal.tasks.DefaultTaskContainer$TaskCreationException: Could not create task ':a:spotbugsIntegrationTest'.
        at org.gradle.api.internal.tasks.DefaultTaskContainer.taskCreationException(DefaultTaskContainer.java:720)
        at org.gradle.api.internal.tasks.DefaultTaskContainer.access$600(DefaultTaskContainer.java:77)
        at org.gradle.api.internal.tasks.DefaultTaskContainer$TaskCreatingProvider.domainObjectCreationException(DefaultTaskContainer.java:712)
        at org.gradle.api.internal.DefaultNamedDomainObjectCollection$AbstractDomainObjectCreatingProvider.tryCreate(DefaultNamedDomainObjectCollection.java:946)
        at org.gradle.api.internal.tasks.DefaultTaskContainer$TaskCreatingProvider.access$1401(DefaultTaskContainer.java:658)
        at org.gradle.api.internal.tasks.DefaultTaskContainer$TaskCreatingProvider$1.run(DefaultTaskContainer.java:685)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.DefaultTaskContainer$TaskCreatingProvider.tryCreate(DefaultTaskContainer.java:681)
        at org.gradle.api.internal.DefaultNamedDomainObjectCollection$AbstractDomainObjectCreatingProvider.calculateOwnValue(DefaultNamedDomainObjectCollection.java:927)
        at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:109)
        at org.gradle.api.internal.provider.Collectors$ElementFromProvider.collectEntries(Collectors.java:110)
        at org.gradle.api.internal.provider.Collectors$TypedCollector.collectEntries(Collectors.java:372)
        at org.gradle.api.internal.provider.Collectors$TypedCollector.collectInto(Collectors.java:367)
        at org.gradle.api.internal.collections.DefaultPendingSource.realize(DefaultPendingSource.java:61)
        at org.gradle.api.internal.collections.DefaultPendingSource.realizePending(DefaultPendingSource.java:52)
        at org.gradle.api.internal.collections.SortedSetElementSource.realizePending(SortedSetElementSource.java:111)
        at org.gradle.api.internal.DefaultDomainObjectCollection.addEagerAction(DefaultDomainObjectCollection.java:226)
        at org.gradle.api.internal.DefaultDomainObjectCollection.all(DefaultDomainObjectCollection.java:144)
        at org.gradle.api.reporting.GenerateBuildDashboard$2.execute(GenerateBuildDashboard.java:100)
        at org.gradle.api.reporting.GenerateBuildDashboard$2.execute(GenerateBuildDashboard.java:97)
        at org.gradle.api.internal.DefaultMutationGuard$2.execute(DefaultMutationGuard.java:42)
        at org.gradle.internal.Actions.with(Actions.java:251)
        at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator$2$1.run(BuildOperationCrossProjectConfigurator.java:79)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator$2.run(BuildOperationCrossProjectConfigurator.java:76)
        at org.gradle.internal.Factories$1.create(Factories.java:26)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:189)
        at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:40)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withProjectLock(DefaultProjectStateRegistry.java:271)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.access$500(DefaultProjectStateRegistry.java:145)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl$1.create(DefaultProjectStateRegistry.java:260)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:260)
        at org.gradle.internal.work.StopShieldingWorkerLeaseService.withoutLocks(StopShieldingWorkerLeaseService.java:50)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withMutableState(DefaultProjectStateRegistry.java:256)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.withMutableState(DefaultProjectStateRegistry.java:226)
        at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator.runProjectConfigureAction(BuildOperationCrossProjectConfigurator.java:73)
        at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator.access$400(BuildOperationCrossProjectConfigurator.java:32)
        at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator$1.doRunProjectConfigure(BuildOperationCrossProjectConfigurator.java:67)
        at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator$BlockConfigureBuildOperation.run(BuildOperationCrossProjectConfigurator.java:121)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator.runBlockConfigureAction(BuildOperationCrossProjectConfigurator.java:64)
        at org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator.allprojects(BuildOperationCrossProjectConfigurator.java:54)
        at org.gradle.api.internal.project.DefaultProject.allprojects(DefaultProject.java:673)
        at org.gradle.api.reporting.GenerateBuildDashboard.getAggregatedTasks(GenerateBuildDashboard.java:97)
        at org.gradle.api.reporting.GenerateBuildDashboard.getEnabledInputReports(GenerateBuildDashboard.java:83)
        at org.gradle.api.reporting.GenerateBuildDashboard.getInputReports(GenerateBuildDashboard.java:71)
        at org.gradle.api.reporting.GenerateBuildDashboard_Decorated.getInputReports(Unknown Source)
        at jdk.internal.reflect.GeneratedMethodAccessor790.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at org.gradle.api.internal.tasks.properties.bean.AbstractNestedRuntimeBeanNode$BeanPropertyValue$1$1.create(AbstractNestedRuntimeBeanNode.java:79)
        at org.gradle.internal.deprecation.DeprecationLogger.whileDisabled(DeprecationLogger.java:225)
        at org.gradle.api.internal.tasks.properties.bean.AbstractNestedRuntimeBeanNode$BeanPropertyValue$1.get(AbstractNestedRuntimeBeanNode.java:75)
        at com.google.common.base.Suppliers$NonSerializableMemoizingSupplier.get(Suppliers.java:167)
        at org.gradle.api.internal.tasks.properties.bean.AbstractNestedRuntimeBeanNode$BeanPropertyValue.call(AbstractNestedRuntimeBeanNode.java:145)
        at org.gradle.api.internal.tasks.properties.AbstractValidatingProperty.validate(AbstractValidatingProperty.java:39)
        at org.gradle.api.internal.tasks.properties.DefaultTaskProperties.validate(DefaultTaskProperties.java:193)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.validate(ExecuteActionsTaskExecuter.java:505)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:50)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)
        at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:192)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:184)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        ... 23 more
Caused by: org.gradle.api.InvalidUserDataException: Cannot change dependencies of dependency configuration ':a:spotbugs' after it has been resolved.
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.preventIllegalMutation(DefaultConfiguration.java:1124)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.validateMutation(DefaultConfiguration.java:1095)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.defaultDependencies(DefaultConfiguration.java:437)
        at com.github.spotbugs.SpotBugsPlugin.configureDefaultDependencies(SpotBugsPlugin.java:155)
        at com.github.spotbugs.SpotBugsPlugin.configureTaskDefaults(SpotBugsPlugin.java:118)
        at com.github.spotbugs.SpotBugsPlugin.configureTaskDefaults(SpotBugsPlugin.java:37)
        at org.gradle.api.plugins.quality.internal.AbstractCodeQualityPlugin$3.execute(AbstractCodeQualityPlugin.java:151)
        at org.gradle.api.plugins.quality.internal.AbstractCodeQualityPlugin$3.execute(AbstractCodeQualityPlugin.java:143)
        at org.gradle.api.internal.DefaultCollectionCallbackActionDecorator$BuildOperationEmittingAction$1$1.run(DefaultCollectionCallbackActionDecorator.java:100)
        at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.reapply(DefaultUserCodeApplicationContext.java:60)
        at org.gradle.api.internal.DefaultCollectionCallbackActionDecorator$BuildOperationEmittingAction$1.run(DefaultCollectionCallbackActionDecorator.java:97)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
        at org.gradle.api.internal.DefaultCollectionCallbackActionDecorator$BuildOperationEmittingAction.execute(DefaultCollectionCallbackActionDecorator.java:94)
        at org.gradle.api.internal.DefaultMutationGuard$2.execute(DefaultMutationGuard.java:42)
        at org.gradle.api.internal.DefaultMutationGuard$2.execute(DefaultMutationGuard.java:42)
        at org.gradle.api.internal.collections.CollectionFilter$1.execute(CollectionFilter.java:59)
        at org.gradle.internal.ImmutableActionSet$SetWithManyActions.execute(ImmutableActionSet.java:329)
        at org.gradle.api.internal.DefaultDomainObjectCollection.doAdd(DefaultDomainObjectCollection.java:264)
        at org.gradle.api.internal.DefaultNamedDomainObjectCollection.doAdd(DefaultNamedDomainObjectCollection.java:112)
        at org.gradle.api.internal.DefaultDomainObjectCollection.add(DefaultDomainObjectCollection.java:258)
        at org.gradle.api.internal.DefaultNamedDomainObjectCollection$AbstractDomainObjectCreatingProvider.tryCreate(DefaultNamedDomainObjectCollection.java:942)
        ... 110 more
boxleytw commented 4 years ago

Ping @binkley <-- My personal account, so I can track this issue

xvik commented 4 years ago

Thank you very much for such a detailed report!

This is a bug in build-dashboard plugin. Spotbugs plugin always creates lazy tasks for each source set, but only required tasks are assigned to check (according to configuration). But buildDashboard task forces initialization of all tasks in the project:

project.getTasks().all(new Action<Task>() {

(there must be configureEach instead of all).

This forces initialization of not used spotbugs tasks spotbugsTest and spotbugsIntegrationTest which tries to configure default dependencies in the spotbugs configuration (strange that each spotbugs task configures shared configuration, but anyway).. and it's too late for that.

To workaround it, you can force tasks initialization in the correct phase:

subprojects {
    ...
   afterEvaluate {
        tasks.findByName('spotbugsIntegrationTest')
        tasks.findByName('spotbugsTest')
    }
}

afterEvaluate required because quality plugin applies spotbugs plugin after initial configuration (to see if plugin required). I checked on your project and this works.

Could you please report this issue to grade (or, maybe, provide pull request directly)?

I spot slf4j warnings after spotbugs tasks execution, so I will release now 4.2.2 with removed spotbugs configuration tuning to avoid these warnings (it was a bad idea).

binkley commented 4 years ago

@xvik Thank you for a detailed, clear explanation. I'll chase this down with the build dashboard plugin, and reference you in the issue so you can track.

First step, find the issue tracker! https://discuss.gradle.org/t/links-for-source-repositories-provided-in-the-gradle-documentation/35803

xvik commented 4 years ago

@binkley build-dashboard is a core gradle plugin and problems with it should be reported in the main gradle repo.

Sorry if I wasn't explicit enough. I put a link inside my response into gradle repo at exact line containing the problem: https://github.com/gradle/gradle/blob/master/subprojects/reporting/src/main/java/org/gradle/api/reporting/GenerateBuildDashboard.java#L100 (it is a buildDashboard task itself).

If you want I can create the issue myself. I was just assuming it could be interesting for you to create the issue yourself because you found this problem.

And, just to mention, I put problem description into main documentation, just in case

binkley commented 4 years ago

@xvik Tracking here: https://github.com/gradle/gradle/issues/12967

xvik commented 4 years ago

Closing issue as not related to quality plugin (I'm tracking gradle issue)