You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@fineract.apache.org by "Adam Saghy (Jira)" <ji...@apache.org> on 2026/10/18 16:59:00 UTC
[jira] [Reopened] (FINERACT-2853) Enable Gradle configuration cache for local builds
[ https://issues.apache.org/jira/browse/FINERACT-2853?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Adam Saghy reopened FINERACT-2853:
----------------------------------
> Enable Gradle configuration cache for local builds
> --------------------------------------------------
>
> Key: FINERACT-2853
> URL: https://issues.apache.org/jira/browse/FINERACT-2853
> Project: Apache Fineract
> Issue Type: Improvement
> Affects Versions: 1.15.0
> Reporter: Adam Saghy
> Assignee: Adam Saghy
> Priority: Major
> Fix For: 1.16.0
>
>
> h2. Description
> Enables the Gradle configuration cache ({{{}org.gradle.configuration-cache=true{}}}) for local builds. It had been disabled with a "temporarily disabled until we fix compatibility" note. CI keeps it off, because fresh runners using {{{}--no-daemon{}}}gain nothing from it.
> Local development loops (compiling, module tests, the client modules, the quality checks, {{{}bootRun{}}}/{{{}devRun{}}}) now store the configuration cache and reuse it, including from a fresh daemon. A warm rebuild of {{:fineract-provider:compileJava}} goes from about 19s to about 1s.
> h3. Build-script fixes for the configuration cache
> * {{{}static-weaving.gradle{}}}: the managed-class lookup is now a lazy provider, and the helpers moved into a plain class. The old code called {{Task.project}} and script methods from {{{}doLast{}}}.
> * {{{}fineract-provider{}}}, {{{}fineract-client{}}}, {{{}fineract-client-feign{}}}: {{{}copy{}}}/{{{}delete{}}}/{{{}fileTree{}}} in task actions now go through the injected {{{}FileSystemOperations{}}}.
> * {{fineract-doc}} {{{}doc{}}}, and {{{}checkBreakingChanges.onlyIf{}}}: values are captured at configuration time.
> * {{{}aggregateLicenseReport{}}}: the {{rename}} closure no longer captures a {{{}Project{}}}.
> h3. Plugins that cannot support it are marked {{notCompatibleWithConfigurationCache}}
> * jk1 license report, jib, asciidoctor, the {{{}fineractRelease*{}}}/{{{}fineractDocPublish{}}} tasks, and the database admin tasks ({{{}createDB{}}}, {{{}createPGDB{}}}, …).
> * Builds that include these tasks fall back to running without the cache instead of failing. A full {{./gradlew build}} still includes jk1 and asciidoctor, through the binary distribution.
> h3. Plugin replacements and upgrades
> * *git-versioning replaced with {{GitVersionValueSource}} (buildSrc).* The old plugin spawns git processes while the build configures. The new class ports its logic for our configuration: release/maintenance branch and tag rules, the ancestor walk and tag ordering, CI branch detection, {{-Dgit.*}} and {{VERSIONING_*}} overrides, and linked worktrees. The plugin's unused {{version}} task is gone.
> * *Spotless 6.25.0 → 8.10.2.* 6.x fails with "JVM-local cache is stale" when the cache is reused from a new daemon. The formatters are pinned to 4.29, the versions 6.25 used by default on JDK 25, so no code is reformatted. {{indentWithSpaces}} is replaced by {{{}leadingTabsToSpaces{}}}, which behaves identically.
> * *{{com.github.hierynomus.license}} (unmaintained since 2021) replaced with Spotless license headers.*
> ** Headers are still generated from {{{}APACHE_LICENSETEXT.md{}}}, for Java, XML, properties, Velocity and JSP. That's the same set of files hierynomus enforced, plus 287 files that already had correct headers.
> ** {{spotlessApply}} adds a missing header and never rewrites anything below one. A malformed header fails {{{}spotlessCheck{}}}.
> ** Also removed: the plugin's no-op {{licenseFormatMain}} wiring, and the {{spring-core:6.2.18}} buildscript pin that existed only for it.
> ** 8 Java files had a stray blank line before the header, or a malformed one. Each is fixed with a one-line deletion.
> * *jk1 dependency-license-report 2.9 → 3.1.4* (2.x is end-of-life).
> ** The bundled license texts are identical.
> ** The per-module index pages show manifest-declared licenses more cleanly; no dependency's license changes.
> ** {{generateLicenseReport}} now depends on the jars it reads, which fixes an intermittent {{ZipException: zip END header not found}} in parallel builds.
> h3. CI
> * {{.github/scripts/gradle-memory-budget.sh}} writes {{{}org.gradle.configuration-cache=false{}}}.
> * The two workflows that don't use it pass {{{}--no-configuration-cache{}}}.
> h3. Notes for reviewers
> * To opt out locally, pass {{{}--no-configuration-cache{}}}.
> * {{{}licenseFormat{}}}/{{{}licenseMain{}}} no longer exist. Use {{{}spotlessApply{}}}/{{{}spotlessCheck{}}} instead.
> * {{git.properties}} (actuator git info) is unaffected. It comes from gradle-git-properties.
> h3. Verification
> * *Versions:* {{GitVersionValueSource}} matched the old plugin's output in 34 git scenarios, run side by side in a scratch clone. They cover develop, release/maintenance branches, tags, commits with several tags, GitHub/GitLab/Jenkins environments, overrides, worktrees, and shallow, empty and missing repositories.
> * *Outputs:* generated outputs are identical to develop: {{persistence.xml}} (15 modules), the swagger input YAML, the generated clients, and the bundled license texts.
> * *Spotless:* repo-wide {{spotlessCheck}} passes with no changes. Throwaway files confirmed that missing and malformed headers are detected and fixed, and that nothing after a header is ever changed.
> * *CI task groups, with and without the cache:* quality checks, package/war/shadowJar, unit tests, license report/CycloneDX, doc, jib ({{{}jibBuildTar{}}}), cucumber, {{{}checkBreakingChanges{}}}, and {{{}devRun{}}}/{{{}bootRun{}}} (dry run).
> * *Not tested:* sonar, pushing a jib image, tasks that need a database (integration tests, e2e cucumber, {{{}createPGDB{}}}), and the release steps.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)