Skip to content

Support Gradle configuration cache on multiple JVMs  #1274

Closed

Description

@nedtwigg

Gradle configuration cache requires task state to be round-trip serializable. As outlined at #987, this is a signficant constraint on plugin developers and it slows down the end-user experience of change-test-change-test on a single JVM daemon. We built a workaround (JvmLocalCache) that complies with Gradle's requirement by making our tasks round-trip serializable without requiring much work from plugin developers or the end user's machine, but it only works within a single JVM.

To work on multiple JVMs, we need to

  • make every step round-trip serializable
  • remove JvmLocalCache

Activity

  1. eskatos commented on Sep 28, 2022

    @eskatos
    Contributor

    FYI Gradle 8 will do a full roundtrip on the first invocation with CC enabled.
    See work in progress here gradle/gradle#21985 (comment)
    The goal is for this to be the default in 8.0.

  2. nedtwigg commented on Sep 28, 2022

    @nedtwigg
    MemberAuthor

    Full roundtrip will work great on the same JVM, so Spotless will still work and not work under the same conditions it does currently. EDIT: Compatibility with configuration cache within a single JVM on Gradle 8 is confirmed.

  3. nedtwigg commented on Dec 4, 2023

    @nedtwigg
    MemberAuthor

    I think we now have a way to incrementally build this until we can eventually remove our workaround. See:

    In this comment, I'm going to maintain a list of remaining TODOs before we will fully support Gradle's configuration cache model without any workarounds. If you'd like to help: comment in this issue when you start on a given step, follow-up with a PR (draft is fine) and I will update the checklist below

  4. pinned this issue on Dec 6, 2023
  5. lehmanju commented on May 6, 2024

    @lehmanju

    I checked npm.EslintFormatterStep, npm.PrettierFormatterStep, npm.TsFmtFormatterStep and sql.DBeaverSQLFormatterStep. They all use StepHarness for testing which has roundtrip serialization testing enabled by default. Since their tests do not fail, it should mean they are already serializable, am I correct?

    For NativeCmdStep I created a PR #2108 which adds a test using StepHarness.

  6. nedtwigg commented on Jun 4, 2024

    @nedtwigg
    MemberAuthor

    Thanks mostly to @Goooler's tireless dedication, we have finally shipped:

    • plugin-gradle 3.0.0.BETA1
    • plugin-maven 2.44.0.BETA1

    These contain a bazillion fixes. Please test and let us know if you encounter any issues!

  7. unpinned this issue on Jun 5, 2024
  8. marcphilipp commented on Jun 5, 2024

    @marcphilipp

    JUnit build updated ✅

  9. bddckr commented on Jun 5, 2024

    @bddckr

    All working fine for me as well, except I used

    removeUnusedImports("cleanthat-javaparser-unnecessaryimport")

    as seen in the docs. That one seems to not support the config cache yet:

    Could not load the value of field `steps` of task `:spotlessInternalRegisterDependencies` of type `com.diffplug.gradle.spotless.RegisterDependenciesTask`.
    > Could not load the value of field `excluded` of `com.diffplug.spotless.java.CleanthatJavaStep` bean found in field `roundtripStateInternal` of `com.diffplug.spotless.FormatterStepSerializationRoundtrip` bean found in field `steps` of task `:spotlessInternalRegisterDependencies` of type `com.diffplug.gradle.spotless.RegisterDependenciesTask`.
    

    I just removed it as it looks like googleJavaFormat already takes care of that.

  10. ZachCallear commented on Jun 13, 2024

    @ZachCallear

    I get a similar error to @bddckr if I use any prettier steps, and only while using the Gradle Configuration Cache, like:

    Could not load the value of field `steps` of task `:spotlessJava` of type `com.diffplug.gradle.spotless.SpotlessTaskImpl`.
    > Could not load the value of field `additionalNpmrcLocations` of `com.diffplug.spotless.npm.NpmPathResolver` bean found in field `resolver` of `com.diffplug.spotless.npm.NpmFormatterStepLocations` bean found in field `locations` of `com.diffplug.spotless.npm.PrettierFormatterStep$State` bean found in field `roundtripStateInternal` of `com.diffplug.spotless.FormatterStepSerializationRoundtrip` bean found in field `steps` of task `:spotlessJava` of type `com.diffplug.gradle.spotless.SpotlessTaskImpl`.
    

    or:

    Could not load the value of field `steps` of task `:spotlessPrettierGeneric` of type `com.diffplug.gradle.spotless.SpotlessTaskImpl`.
    > Could not load the value of field `additionalNpmrcLocations` of `com.diffplug.spotless.npm.NpmPathResolver` bean found in field `resolver` of `com.diffplug.spotless.npm.NpmFormatterStepLocations` bean found in field `locations` of `com.diffplug.spotless.npm.PrettierFormatterStep$State` bean found in field `roundtripStateInternal` of `com.diffplug.spotless.FormatterStepSerializationRoundtrip` bean found in field `steps` of task `:spotlessPrettierGeneric` of type `com.diffplug.gradle.spotless.SpotlessTaskImpl`.
    

    I've worked around it by declaring Spotless incompatible with the configuration cache, like:

    tasks.withType<SpotlessTask>().configureEach {
      notCompatibleWithConfigurationCache(
          "Spotless 7.0.0.BETA1 with prettier steps does not support the configuration cache.")
    }
  11. davidburstrom commented on Sep 18, 2024

    @davidburstrom
    Contributor

    FWIW, I've upgraded to 7.0.0.BETA2 in all my repositories and everything seems to be in order! Great job!

  12. nedtwigg commented on Oct 24, 2024

    @nedtwigg
    MemberAuthor

    With 7.0.0.BETA4 I think this is now just about fully solved. Last chance for feedback before these APIs all get baked!

  13. ZacSweers commented on Oct 28, 2024

    @ZacSweers
    Contributor

    Just filed a regression on #2318

  14. cloudshiftchris commented on Dec 21, 2024

    @cloudshiftchris

    CC issue w/ prettier on 7.0.0BETA4: #2372

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      ⌂ Proxy