Re: [VOTE] Maven incremental build for BIG-sized projects with local and remote caching

classic Classic list List threaded Threaded
15 messages Options
Reply | Threaded
Open this post in threaded view
|

Re: [VOTE] Maven incremental build for BIG-sized projects with local and remote caching

Tibor Digana
Disabling a Surefire/Failsafe in a particular module is easy but it won't
gain the performance so much if you do not analyse the relations between
classes and the test.

If you analyse the relations then you can easily fetch the list of the
tests in -Dtests or in the included/excludedTests. So everything is in
Surefire but I guess that the analysis of the code would be so time
demanding that it would be all contraprodactive effort on our side.

Regarding the cache, the repo is the cache. And if the CI build deletes the
repo, we would not know it today.
So these performance improvements must be optional feature only enabled by
the user and not by default.

On Fri, Sep 13, 2019 at 11:37 PM Romain Manni-Bucau <[hidden email]>
wrote:

> There are multiple possible incremental support:
>
> 1. Scm related: do a status and rebuild downstream reactor
> 2. Full and module build graph: seems it is the one you target, ie bypass
> modules without change. Note that it only works if upstream graph is taken
> into account.
> 3. Full build: each mojo has incremental support so the full build gets it.
> Issue is that it requires each mojo to know if it needs to be executed or
> give enough info to the mojo executor to do so (gradle requires all
> inputs/outputs to assume this state - which is still just an heuristic and
> not 100% reliable).
>
> In current state, 2. sounds like a good option since 3 can require  a loot
> of work for external plugins (today's builds have a lot more of not maven
> provide plugins than core plugins).
> Now, we should be able to activate it or not so having a cacheLocation
> config in settings.xml can be good.
>
> Side notes:
>
> 1. having it on by default will break builds - reactor is deterministic and
> bypassing a module can break a build since it can init maven properties -
> for ex - for next modules
> 2. You cant find all in/out paths from the pom in general so your algo is
> not generic, a meta config can be needed in .mvn
> 3. We should let a mojo be able to disable that to replace default logic
> (surefire is a good example where it must be refined and it can save hours
> there ;))
> 4. Let's try to impl it as a mvn extension first then if it works well on
> multiple big project get it to core?
>
> Romain
>
>
>
> Le ven. 13 sept. 2019 à 23:18, Tibor Digana <[hidden email]> a
> écrit :
>
> > In theory, the incremental compiler would make it faster.
> > But this can be told only if you present a demo project with has trivial
> > tests taking much less time to complete than the compiler.
> >
> > In reality the tests in huge projects take significantly longer time than
> > the compiler.
> > Some developers say "switch off all the tests" in the release phase but
> > that's wrong because then the quality goes down and methodologies are
> > broken.
> >
> > I can see a big problem that we do not have an interface between Surefire
> > and Compiler plugin negotiating which tests have been modified including
> > modules and classes in the entire structure.
> >
> > Having incremental compiler is easy, just use compiler:3.8.1 or use the
> > Takari compiler.
> > But IMO the biggest benefit in performance would be after having the
> truly
> > incremental test executor.
> >
> > On Fri, Sep 13, 2019 at 10:46 PM Maximilian Novikov <
> > [hidden email]> wrote:
> >
> > > Hi All,
> > >
> > >
> > >
> > > *We want to create upstream change to Maven* to support true
> incremental
> > > build for big-sized projects.
> > >
> > > To raise a pull request we have to pass long chain of Deutsche Bank’s
> > > internal procedures. So, *before starting the process we would like to
> > > get your feedback regarding this feature*.
> > >
> > >
> > >
> > > *Motivation:*
> > >
> > >
> > >
> > > Our project is hosted in mono-repo and contains ~600 modules. All
> modules
> > > has the same SNAPSHOT version.
> > >
> > > There are lot of test automation around this, everything is tested
> before
> > > merge into release branch.
> > >
> > >
> > >
> > > Current setup helps us to simplify build/release/dependency management
> > for
> > > 10+ teams those contribute into codebase. We can release everything in
> > > 1-click.
> > >
> > > The major drawback of such approach is build time: *full local build
> took
> > > 45-60 min (*-T8)*, CI build ~25min(*-T16*)*.
> > >
> > >
> > >
> > > To speed-up our build we needed 2 features: incremental build and
> shared
> > > cache.
> > >
> > > Initially we started to think about migration to Gradle or Bazel. As
> > > migration costs for the mentioned tools were too high, we decided to
> add
> > > similar functionality into Maven.
> > >
> > >
> > >
> > > Current results we get: *1-2 mins for local build(*-T8*)* if build was
> > > cached by CI*, CI build ~5 mins (*-T16*).*
> > >
> > >
> > >
> > > *Feature description:*
> > >
> > >
> > >
> > > The idea is to calculate checksum for inputs and save outputs in cache.
> > >
> > > [image: image2019-8-27_20-0-14.png]
> > >
> > > Each node checksum calculated with:
> > >
> > >
> > >
> > > ·         Effective POM hash
> > >
> > > ·         Sources hash
> > >
> > > ·         Dependencies hash (dependencies within multi-module project)
> > >
> > >
> > >
> > > Project sources inputs are searched inside project + all paths from
> > > plugins configuration:
> > >
> > > [image: image2019-8-30_10-28-56.png]
> > >
> > > How does it work in practice:
> > >
> > >
> > >
> > > 1.       CI: runs builds and stores outputs in shared cache
> > >
> > > 2.       CI: reuse outputs for same inputs, so time is decreasing
> > >
> > > 3.       Locally: when I checkout branch and run ‘install’ for whole
> > > project, I get all actual snapshots from remote cache for this branch
> > >
> > > 4.       Locally: if I change multiple modules in tree, only changed
> > > subtree is rebuilt
> > >
> > >
> > >
> > > Impact on current Maven codebase is very localized (MojoExecutor, where
> > we
> > > injected cache controller).
> > >
> > > Caching can be activated/deactivated by property, so current maven flow
> > > will work as is.
> > >
> > >
> > >
> > > And the big plus is that you don’t need to re-work your current
> project.
> > > Caching should work out of box, just need to add config in .mvn folder.
> > >
> > >
> > >
> > > Please let us know what do you think. We are ready to invest in this
> > > feature and address any further feedback.
> > >
> > >
> > >
> > > Kind regards,
> > >
> > > Max
> > >
> > >
> > >
> > >
> > > ---
> > > This e-mail may contain confidential and/or privileged information. If
> > you
> > > are not the intended recipient (or have received this e-mail in error)
> > > please notify the sender immediately and delete this e-mail. Any
> > > unauthorized copying, disclosure or distribution of the material in
> this
> > > e-mail is strictly forbidden.
> > >
> > > Please refer to https://www.db.com/disclosures for additional EU
> > > corporate and regulatory disclosures and to
> > > http://www.db.com/unitedkingdom/content/privacy.htm for information
> > about
> > > privacy.
> > >
> >
>
Reply | Threaded
Open this post in threaded view
|

Re: [VOTE] Maven incremental build for BIG-sized projects with local and remote caching

Alexander Ashitkin
The feature doesn't do per Test/Classes analysis. Granularity of incremental build is per project - if project is invalidated by changes in dependencies/source code/plugins it will be rebuilt fully. So, single module of multi-module build doesn't receive any increment, but for multi module projects with hundreds of modules just skipping not affected part of graph is a huge win.

Sincerely yours, Aleks

On 2019/09/13 21:48:37, Tibor Digana <[hidden email]> wrote:

> Disabling a Surefire/Failsafe in a particular module is easy but it won't
> gain the performance so much if you do not analyse the relations between
> classes and the test.
>
> If you analyse the relations then you can easily fetch the list of the
> tests in -Dtests or in the included/excludedTests. So everything is in
> Surefire but I guess that the analysis of the code would be so time
> demanding that it would be all contraprodactive effort on our side.
>
> Regarding the cache, the repo is the cache. And if the CI build deletes the
> repo, we would not know it today.
> So these performance improvements must be optional feature only enabled by
> the user and not by default.
>
> On Fri, Sep 13, 2019 at 11:37 PM Romain Manni-Bucau <[hidden email]>
> wrote:
>
> > There are multiple possible incremental support:
> >
> > 1. Scm related: do a status and rebuild downstream reactor
> > 2. Full and module build graph: seems it is the one you target, ie bypass
> > modules without change. Note that it only works if upstream graph is taken
> > into account.
> > 3. Full build: each mojo has incremental support so the full build gets it.
> > Issue is that it requires each mojo to know if it needs to be executed or
> > give enough info to the mojo executor to do so (gradle requires all
> > inputs/outputs to assume this state - which is still just an heuristic and
> > not 100% reliable).
> >
> > In current state, 2. sounds like a good option since 3 can require  a loot
> > of work for external plugins (today's builds have a lot more of not maven
> > provide plugins than core plugins).
> > Now, we should be able to activate it or not so having a cacheLocation
> > config in settings.xml can be good.
> >
> > Side notes:
> >
> > 1. having it on by default will break builds - reactor is deterministic and
> > bypassing a module can break a build since it can init maven properties -
> > for ex - for next modules
> > 2. You cant find all in/out paths from the pom in general so your algo is
> > not generic, a meta config can be needed in .mvn
> > 3. We should let a mojo be able to disable that to replace default logic
> > (surefire is a good example where it must be refined and it can save hours
> > there ;))
> > 4. Let's try to impl it as a mvn extension first then if it works well on
> > multiple big project get it to core?
> >
> > Romain
> >
> >
> >
> > Le ven. 13 sept. 2019 à 23:18, Tibor Digana <[hidden email]> a
> > écrit :
> >
> > > In theory, the incremental compiler would make it faster.
> > > But this can be told only if you present a demo project with has trivial
> > > tests taking much less time to complete than the compiler.
> > >
> > > In reality the tests in huge projects take significantly longer time than
> > > the compiler.
> > > Some developers say "switch off all the tests" in the release phase but
> > > that's wrong because then the quality goes down and methodologies are
> > > broken.
> > >
> > > I can see a big problem that we do not have an interface between Surefire
> > > and Compiler plugin negotiating which tests have been modified including
> > > modules and classes in the entire structure.
> > >
> > > Having incremental compiler is easy, just use compiler:3.8.1 or use the
> > > Takari compiler.
> > > But IMO the biggest benefit in performance would be after having the
> > truly
> > > incremental test executor.
> > >
> > > On Fri, Sep 13, 2019 at 10:46 PM Maximilian Novikov <
> > > [hidden email]> wrote:
> > >
> > > > Hi All,
> > > >
> > > >
> > > >
> > > > *We want to create upstream change to Maven* to support true
> > incremental
> > > > build for big-sized projects.
> > > >
> > > > To raise a pull request we have to pass long chain of Deutsche Bank’s
> > > > internal procedures. So, *before starting the process we would like to
> > > > get your feedback regarding this feature*.
> > > >
> > > >
> > > >
> > > > *Motivation:*
> > > >
> > > >
> > > >
> > > > Our project is hosted in mono-repo and contains ~600 modules. All
> > modules
> > > > has the same SNAPSHOT version.
> > > >
> > > > There are lot of test automation around this, everything is tested
> > before
> > > > merge into release branch.
> > > >
> > > >
> > > >
> > > > Current setup helps us to simplify build/release/dependency management
> > > for
> > > > 10+ teams those contribute into codebase. We can release everything in
> > > > 1-click.
> > > >
> > > > The major drawback of such approach is build time: *full local build
> > took
> > > > 45-60 min (*-T8)*, CI build ~25min(*-T16*)*.
> > > >
> > > >
> > > >
> > > > To speed-up our build we needed 2 features: incremental build and
> > shared
> > > > cache.
> > > >
> > > > Initially we started to think about migration to Gradle or Bazel. As
> > > > migration costs for the mentioned tools were too high, we decided to
> > add
> > > > similar functionality into Maven.
> > > >
> > > >
> > > >
> > > > Current results we get: *1-2 mins for local build(*-T8*)* if build was
> > > > cached by CI*, CI build ~5 mins (*-T16*).*
> > > >
> > > >
> > > >
> > > > *Feature description:*
> > > >
> > > >
> > > >
> > > > The idea is to calculate checksum for inputs and save outputs in cache.
> > > >
> > > > [image: image2019-8-27_20-0-14.png]
> > > >
> > > > Each node checksum calculated with:
> > > >
> > > >
> > > >
> > > > ·         Effective POM hash
> > > >
> > > > ·         Sources hash
> > > >
> > > > ·         Dependencies hash (dependencies within multi-module project)
> > > >
> > > >
> > > >
> > > > Project sources inputs are searched inside project + all paths from
> > > > plugins configuration:
> > > >
> > > > [image: image2019-8-30_10-28-56.png]
> > > >
> > > > How does it work in practice:
> > > >
> > > >
> > > >
> > > > 1.       CI: runs builds and stores outputs in shared cache
> > > >
> > > > 2.       CI: reuse outputs for same inputs, so time is decreasing
> > > >
> > > > 3.       Locally: when I checkout branch and run ‘install’ for whole
> > > > project, I get all actual snapshots from remote cache for this branch
> > > >
> > > > 4.       Locally: if I change multiple modules in tree, only changed
> > > > subtree is rebuilt
> > > >
> > > >
> > > >
> > > > Impact on current Maven codebase is very localized (MojoExecutor, where
> > > we
> > > > injected cache controller).
> > > >
> > > > Caching can be activated/deactivated by property, so current maven flow
> > > > will work as is.
> > > >
> > > >
> > > >
> > > > And the big plus is that you don’t need to re-work your current
> > project.
> > > > Caching should work out of box, just need to add config in .mvn folder.
> > > >
> > > >
> > > >
> > > > Please let us know what do you think. We are ready to invest in this
> > > > feature and address any further feedback.
> > > >
> > > >
> > > >
> > > > Kind regards,
> > > >
> > > > Max
> > > >
> > > >
> > > >
> > > >
> > > > ---
> > > > This e-mail may contain confidential and/or privileged information. If
> > > you
> > > > are not the intended recipient (or have received this e-mail in error)
> > > > please notify the sender immediately and delete this e-mail. Any
> > > > unauthorized copying, disclosure or distribution of the material in
> > this
> > > > e-mail is strictly forbidden.
> > > >
> > > > Please refer to https://www.db.com/disclosures for additional EU
> > > > corporate and regulatory disclosures and to
> > > > http://www.db.com/unitedkingdom/content/privacy.htm for information
> > > about
> > > > privacy.
> > > >
> > >
> >
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: [VOTE] Maven incremental build for BIG-sized projects with local and remote caching

Romain Manni-Bucau
In reply to this post by Tibor Digana
Le sam. 14 sept. 2019 à 08:00, Alexander Ashitkin <[hidden email]>
a écrit :

> Indeed we have a kind of the option 2 with variations. Current
> implementation is opt-in feature driven by configuration with some metadata
> of required cache behavior and hints.
>
> Maven extensions is the option, but we would love to have it in maven
> itself which is in interest of maven community i believe. Extension is a
> way we are trying to avoid and even not sure it could be implemented as
> extension as it requires changes in maven core.
>

No real change required in maven core here since guice enables to override
any bean or even just to rewrite the pom to remove modules to just rebuild
the minimum set (keeping downstream project).

The only challenge is an exhaustive test suite since your current impl can
easily fake a passing build (as gradle does today if you dont disable the
daemon and state cache on the CI).

Side note: test relationship discovery is close to AOT in terms of impl and
very very slow so can be worse than doing the full suite in simple projects
and it still asks the IT question.

So due to the numerous "?" of a core solution, extension is the way to go.
Now if a guice bean in core can help to write your extension, it can surely
be reviewed more easily IMHO.

Hope it helps.


> Thanks in advance, Aleks
>
> On 2019/09/13 21:37:15, Romain Manni-Bucau <[hidden email]> wrote:
> > There are multiple possible incremental support:
> >
> > 1. Scm related: do a status and rebuild downstream reactor
> > 2. Full and module build graph: seems it is the one you target, ie bypass
> > modules without change. Note that it only works if upstream graph is
> taken
> > into account.
> > 3. Full build: each mojo has incremental support so the full build gets
> it.
> > Issue is that it requires each mojo to know if it needs to be executed or
> > give enough info to the mojo executor to do so (gradle requires all
> > inputs/outputs to assume this state - which is still just an heuristic
> and
> > not 100% reliable).
> >
> > In current state, 2. sounds like a good option since 3 can require  a
> loot
> > of work for external plugins (today's builds have a lot more of not maven
> > provide plugins than core plugins).
> > Now, we should be able to activate it or not so having a cacheLocation
> > config in settings.xml can be good.
> >
> > Side notes:
> >
> > 1. having it on by default will break builds - reactor is deterministic
> and
> > bypassing a module can break a build since it can init maven properties -
> > for ex - for next modules
> > 2. You cant find all in/out paths from the pom in general so your algo is
> > not generic, a meta config can be needed in .mvn
> > 3. We should let a mojo be able to disable that to replace default logic
> > (surefire is a good example where it must be refined and it can save
> hours
> > there ;))
> > 4. Let's try to impl it as a mvn extension first then if it works well on
> > multiple big project get it to core?
> >
> > Romain
> >
> >
> >
> > Le ven. 13 sept. 2019 à 23:18, Tibor Digana <[hidden email]> a
> > écrit :
> >
> > > In theory, the incremental compiler would make it faster.
> > > But this can be told only if you present a demo project with has
> trivial
> > > tests taking much less time to complete than the compiler.
> > >
> > > In reality the tests in huge projects take significantly longer time
> than
> > > the compiler.
> > > Some developers say "switch off all the tests" in the release phase but
> > > that's wrong because then the quality goes down and methodologies are
> > > broken.
> > >
> > > I can see a big problem that we do not have an interface between
> Surefire
> > > and Compiler plugin negotiating which tests have been modified
> including
> > > modules and classes in the entire structure.
> > >
> > > Having incremental compiler is easy, just use compiler:3.8.1 or use the
> > > Takari compiler.
> > > But IMO the biggest benefit in performance would be after having the
> truly
> > > incremental test executor.
> > >
> > > On Fri, Sep 13, 2019 at 10:46 PM Maximilian Novikov <
> > > [hidden email]> wrote:
> > >
> > > > Hi All,
> > > >
> > > >
> > > >
> > > > *We want to create upstream change to Maven* to support true
> incremental
> > > > build for big-sized projects.
> > > >
> > > > To raise a pull request we have to pass long chain of Deutsche Bank’s
> > > > internal procedures. So, *before starting the process we would like
> to
> > > > get your feedback regarding this feature*.
> > > >
> > > >
> > > >
> > > > *Motivation:*
> > > >
> > > >
> > > >
> > > > Our project is hosted in mono-repo and contains ~600 modules. All
> modules
> > > > has the same SNAPSHOT version.
> > > >
> > > > There are lot of test automation around this, everything is tested
> before
> > > > merge into release branch.
> > > >
> > > >
> > > >
> > > > Current setup helps us to simplify build/release/dependency
> management
> > > for
> > > > 10+ teams those contribute into codebase. We can release everything
> in
> > > > 1-click.
> > > >
> > > > The major drawback of such approach is build time: *full local build
> took
> > > > 45-60 min (*-T8)*, CI build ~25min(*-T16*)*.
> > > >
> > > >
> > > >
> > > > To speed-up our build we needed 2 features: incremental build and
> shared
> > > > cache.
> > > >
> > > > Initially we started to think about migration to Gradle or Bazel. As
> > > > migration costs for the mentioned tools were too high, we decided to
> add
> > > > similar functionality into Maven.
> > > >
> > > >
> > > >
> > > > Current results we get: *1-2 mins for local build(*-T8*)* if build
> was
> > > > cached by CI*, CI build ~5 mins (*-T16*).*
> > > >
> > > >
> > > >
> > > > *Feature description:*
> > > >
> > > >
> > > >
> > > > The idea is to calculate checksum for inputs and save outputs in
> cache.
> > > >
> > > > [image: image2019-8-27_20-0-14.png]
> > > >
> > > > Each node checksum calculated with:
> > > >
> > > >
> > > >
> > > > ·         Effective POM hash
> > > >
> > > > ·         Sources hash
> > > >
> > > > ·         Dependencies hash (dependencies within multi-module
> project)
> > > >
> > > >
> > > >
> > > > Project sources inputs are searched inside project + all paths from
> > > > plugins configuration:
> > > >
> > > > [image: image2019-8-30_10-28-56.png]
> > > >
> > > > How does it work in practice:
> > > >
> > > >
> > > >
> > > > 1.       CI: runs builds and stores outputs in shared cache
> > > >
> > > > 2.       CI: reuse outputs for same inputs, so time is decreasing
> > > >
> > > > 3.       Locally: when I checkout branch and run ‘install’ for whole
> > > > project, I get all actual snapshots from remote cache for this branch
> > > >
> > > > 4.       Locally: if I change multiple modules in tree, only changed
> > > > subtree is rebuilt
> > > >
> > > >
> > > >
> > > > Impact on current Maven codebase is very localized (MojoExecutor,
> where
> > > we
> > > > injected cache controller).
> > > >
> > > > Caching can be activated/deactivated by property, so current maven
> flow
> > > > will work as is.
> > > >
> > > >
> > > >
> > > > And the big plus is that you don’t need to re-work your current
> project.
> > > > Caching should work out of box, just need to add config in .mvn
> folder.
> > > >
> > > >
> > > >
> > > > Please let us know what do you think. We are ready to invest in this
> > > > feature and address any further feedback.
> > > >
> > > >
> > > >
> > > > Kind regards,
> > > >
> > > > Max
> > > >
> > > >
> > > >
> > > >
> > > > ---
> > > > This e-mail may contain confidential and/or privileged information.
> If
> > > you
> > > > are not the intended recipient (or have received this e-mail in
> error)
> > > > please notify the sender immediately and delete this e-mail. Any
> > > > unauthorized copying, disclosure or distribution of the material in
> this
> > > > e-mail is strictly forbidden.
> > > >
> > > > Please refer to https://www.db.com/disclosures for additional EU
> > > > corporate and regulatory disclosures and to
> > > > http://www.db.com/unitedkingdom/content/privacy.htm for information
> > > about
> > > > privacy.
> > > >
> > >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>
>
Reply | Threaded
Open this post in threaded view
|

Re: [VOTE] Maven incremental build for BIG-sized projects with local and remote caching

rfscholte
In reply to this post by Tibor Digana
On Fri, 13 Sep 2019 23:37:15 +0200, Romain Manni-Bucau  
<[hidden email]> wrote:

> There are multiple possible incremental support:
>
> 1. Scm related: do a status and rebuild downstream reactor
> 2. Full and module build graph: seems it is the one you target, ie bypass
> modules without change. Note that it only works if upstream graph is  
> taken
> into account.
> 3. Full build: each mojo has incremental support so the full build gets  
> it.
> Issue is that it requires each mojo to know if it needs to be executed or
> give enough info to the mojo executor to do so (gradle requires all
> inputs/outputs to assume this state - which is still just an heuristic  
> and
> not 100% reliable).
>
> In current state, 2. sounds like a good option since 3 can require  a  
> loot
> of work for external plugins (today's builds have a lot more of not maven
> provide plugins than core plugins).
> Now, we should be able to activate it or not so having a cacheLocation
> config in settings.xml can be good.
>
> Side notes:
>
> 1. having it on by default will break builds - reactor is deterministic  
> and
> bypassing a module can break a build since it can init maven properties -
> for ex - for next modules
> 2. You cant find all in/out paths from the pom in general so your algo is
> not generic, a meta config can be needed in .mvn
> 3. We should let a mojo be able to disable that to replace default logic
> (surefire is a good example where it must be refined and it can save  
> hours
> there ;))
> 4. Let's try to impl it as a mvn extension first then if it works well on
> multiple big project get it to core?

Did anyone Google for "maven extension build cache"? There are already  
commercial solutions for it.
Even though I would like to see improvements in this area, the old  
architecture of Maven makes it quite hard to move to that situation. First  
of all it requires changes to the Plugin API (without breaking backwards  
compatibility) to have support out of the box.

Robert

>
> Romain
>
>
>
> Le ven. 13 sept. 2019 à 23:18, Tibor Digana <[hidden email]> a
> écrit :
>
>> In theory, the incremental compiler would make it faster.
>> But this can be told only if you present a demo project with has trivial
>> tests taking much less time to complete than the compiler.
>>
>> In reality the tests in huge projects take significantly longer time  
>> than
>> the compiler.
>> Some developers say "switch off all the tests" in the release phase but
>> that's wrong because then the quality goes down and methodologies are
>> broken.
>>
>> I can see a big problem that we do not have an interface between  
>> Surefire
>> and Compiler plugin negotiating which tests have been modified including
>> modules and classes in the entire structure.
>>
>> Having incremental compiler is easy, just use compiler:3.8.1 or use the
>> Takari compiler.
>> But IMO the biggest benefit in performance would be after having the  
>> truly
>> incremental test executor.
>>
>> On Fri, Sep 13, 2019 at 10:46 PM Maximilian Novikov <
>> [hidden email]> wrote:
>>
>> > Hi All,
>> >
>> >
>> >
>> > *We want to create upstream change to Maven* to support true  
>> incremental
>> > build for big-sized projects.
>> >
>> > To raise a pull request we have to pass long chain of Deutsche Bank’s
>> > internal procedures. So, *before starting the process we would like to
>> > get your feedback regarding this feature*.
>> >
>> >
>> >
>> > *Motivation:*
>> >
>> >
>> >
>> > Our project is hosted in mono-repo and contains ~600 modules. All  
>> modules
>> > has the same SNAPSHOT version.
>> >
>> > There are lot of test automation around this, everything is tested  
>> before
>> > merge into release branch.
>> >
>> >
>> >
>> > Current setup helps us to simplify build/release/dependency management
>> for
>> > 10+ teams those contribute into codebase. We can release everything in
>> > 1-click.
>> >
>> > The major drawback of such approach is build time: *full local build  
>> took
>> > 45-60 min (*-T8)*, CI build ~25min(*-T16*)*.
>> >
>> >
>> >
>> > To speed-up our build we needed 2 features: incremental build and  
>> shared
>> > cache.
>> >
>> > Initially we started to think about migration to Gradle or Bazel. As
>> > migration costs for the mentioned tools were too high, we decided to  
>> add
>> > similar functionality into Maven.
>> >
>> >
>> >
>> > Current results we get: *1-2 mins for local build(*-T8*)* if build was
>> > cached by CI*, CI build ~5 mins (*-T16*).*
>> >
>> >
>> >
>> > *Feature description:*
>> >
>> >
>> >
>> > The idea is to calculate checksum for inputs and save outputs in  
>> cache.
>> >
>> > [image: image2019-8-27_20-0-14.png]
>> >
>> > Each node checksum calculated with:
>> >
>> >
>> >
>> > ·         Effective POM hash
>> >
>> > ·         Sources hash
>> >
>> > ·         Dependencies hash (dependencies within multi-module project)
>> >
>> >
>> >
>> > Project sources inputs are searched inside project + all paths from
>> > plugins configuration:
>> >
>> > [image: image2019-8-30_10-28-56.png]
>> >
>> > How does it work in practice:
>> >
>> >
>> >
>> > 1.       CI: runs builds and stores outputs in shared cache
>> >
>> > 2.       CI: reuse outputs for same inputs, so time is decreasing
>> >
>> > 3.       Locally: when I checkout branch and run ‘install’ for whole
>> > project, I get all actual snapshots from remote cache for this branch
>> >
>> > 4.       Locally: if I change multiple modules in tree, only changed
>> > subtree is rebuilt
>> >
>> >
>> >
>> > Impact on current Maven codebase is very localized (MojoExecutor,  
>> where
>> we
>> > injected cache controller).
>> >
>> > Caching can be activated/deactivated by property, so current maven  
>> flow
>> > will work as is.
>> >
>> >
>> >
>> > And the big plus is that you don’t need to re-work your current  
>> project.
>> > Caching should work out of box, just need to add config in .mvn  
>> folder.
>> >
>> >
>> >
>> > Please let us know what do you think. We are ready to invest in this
>> > feature and address any further feedback.
>> >
>> >
>> >
>> > Kind regards,
>> >
>> > Max
>> >
>> >
>> >
>> >
>> > ---
>> > This e-mail may contain confidential and/or privileged information. If
>> you
>> > are not the intended recipient (or have received this e-mail in error)
>> > please notify the sender immediately and delete this e-mail. Any
>> > unauthorized copying, disclosure or distribution of the material in  
>> this
>> > e-mail is strictly forbidden.
>> >
>> > Please refer to https://www.db.com/disclosures for additional EU
>> > corporate and regulatory disclosures and to
>> > http://www.db.com/unitedkingdom/content/privacy.htm for information
>> about
>> > privacy.
>> >

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: [VOTE] Maven incremental build for BIG-sized projects with local and remote caching

Tibor Digana
But I do not understand why the Maven should be responsible for the project
cahe control/management of "/target" directories.
It is a responsibility of the build manager which is the Jenkins.
The Jenkins has the ability to archive files and such property already
exists in the Jenkins.

So the Jenkins has a full knowledge about:

1. how long the workspace content retains intact
2. what commit hash is for the last build/job/branch
3. and what commit was successful

If the target directories retain intact (or renewed from archive) in the
workspace for very long time and the workspace was reused by the next build
then I would say that the improvement should work as it is on CI level.

Maybe what is necessary is only that improvement in Maven where we would
obtain the list of modules or directories of changes in the current commit.
Then the Maven can highly optimize its own build steps and build only those
modules which have been changed and their dependent modules.
So the interface between CI and Maven is needed in a kind of extension or
the class MavenCli can be extended with some new entrypoint.

But I do not hink that Maven has to take care of responsibilities of CI
(project cache mgmt), that's not our task I would say and we as Maven would
never know all about the miscellaneous CI specifics and therefore we would
not cope with CI related troubles.

Cheers
Tibor17



On Sat, Sep 14, 2019 at 11:08 AM Robert Scholte <[hidden email]>
wrote:

> On Fri, 13 Sep 2019 23:37:15 +0200, Romain Manni-Bucau
> <[hidden email]> wrote:
>
> > There are multiple possible incremental support:
> >
> > 1. Scm related: do a status and rebuild downstream reactor
> > 2. Full and module build graph: seems it is the one you target, ie bypass
> > modules without change. Note that it only works if upstream graph is
> > taken
> > into account.
> > 3. Full build: each mojo has incremental support so the full build gets
> > it.
> > Issue is that it requires each mojo to know if it needs to be executed or
> > give enough info to the mojo executor to do so (gradle requires all
> > inputs/outputs to assume this state - which is still just an heuristic
> > and
> > not 100% reliable).
> >
> > In current state, 2. sounds like a good option since 3 can require  a
> > loot
> > of work for external plugins (today's builds have a lot more of not maven
> > provide plugins than core plugins).
> > Now, we should be able to activate it or not so having a cacheLocation
> > config in settings.xml can be good.
> >
> > Side notes:
> >
> > 1. having it on by default will break builds - reactor is deterministic
> > and
> > bypassing a module can break a build since it can init maven properties -
> > for ex - for next modules
> > 2. You cant find all in/out paths from the pom in general so your algo is
> > not generic, a meta config can be needed in .mvn
> > 3. We should let a mojo be able to disable that to replace default logic
> > (surefire is a good example where it must be refined and it can save
> > hours
> > there ;))
> > 4. Let's try to impl it as a mvn extension first then if it works well on
> > multiple big project get it to core?
>
> Did anyone Google for "maven extension build cache"? There are already
> commercial solutions for it.
> Even though I would like to see improvements in this area, the old
> architecture of Maven makes it quite hard to move to that situation.
> First
> of all it requires changes to the Plugin API (without breaking backwards
> compatibility) to have support out of the box.
>
> Robert
>
> >
> > Romain
> >
> >
> >
> > Le ven. 13 sept. 2019 à 23:18, Tibor Digana <[hidden email]> a
> > écrit :
> >
> >> In theory, the incremental compiler would make it faster.
> >> But this can be told only if you present a demo project with has trivial
> >> tests taking much less time to complete than the compiler.
> >>
> >> In reality the tests in huge projects take significantly longer time
> >> than
> >> the compiler.
> >> Some developers say "switch off all the tests" in the release phase but
> >> that's wrong because then the quality goes down and methodologies are
> >> broken.
> >>
> >> I can see a big problem that we do not have an interface between
> >> Surefire
> >> and Compiler plugin negotiating which tests have been modified including
> >> modules and classes in the entire structure.
> >>
> >> Having incremental compiler is easy, just use compiler:3.8.1 or use the
> >> Takari compiler.
> >> But IMO the biggest benefit in performance would be after having the
> >> truly
> >> incremental test executor.
> >>
> >> On Fri, Sep 13, 2019 at 10:46 PM Maximilian Novikov <
> >> [hidden email]> wrote:
> >>
> >> > Hi All,
> >> >
> >> >
> >> >
> >> > *We want to create upstream change to Maven* to support true
> >> incremental
> >> > build for big-sized projects.
> >> >
> >> > To raise a pull request we have to pass long chain of Deutsche Bank’s
> >> > internal procedures. So, *before starting the process we would like to
> >> > get your feedback regarding this feature*.
> >> >
> >> >
> >> >
> >> > *Motivation:*
> >> >
> >> >
> >> >
> >> > Our project is hosted in mono-repo and contains ~600 modules. All
> >> modules
> >> > has the same SNAPSHOT version.
> >> >
> >> > There are lot of test automation around this, everything is tested
> >> before
> >> > merge into release branch.
> >> >
> >> >
> >> >
> >> > Current setup helps us to simplify build/release/dependency management
> >> for
> >> > 10+ teams those contribute into codebase. We can release everything in
> >> > 1-click.
> >> >
> >> > The major drawback of such approach is build time: *full local build
> >> took
> >> > 45-60 min (*-T8)*, CI build ~25min(*-T16*)*.
> >> >
> >> >
> >> >
> >> > To speed-up our build we needed 2 features: incremental build and
> >> shared
> >> > cache.
> >> >
> >> > Initially we started to think about migration to Gradle or Bazel. As
> >> > migration costs for the mentioned tools were too high, we decided to
> >> add
> >> > similar functionality into Maven.
> >> >
> >> >
> >> >
> >> > Current results we get: *1-2 mins for local build(*-T8*)* if build was
> >> > cached by CI*, CI build ~5 mins (*-T16*).*
> >> >
> >> >
> >> >
> >> > *Feature description:*
> >> >
> >> >
> >> >
> >> > The idea is to calculate checksum for inputs and save outputs in
> >> cache.
> >> >
> >> > [image: image2019-8-27_20-0-14.png]
> >> >
> >> > Each node checksum calculated with:
> >> >
> >> >
> >> >
> >> > ·         Effective POM hash
> >> >
> >> > ·         Sources hash
> >> >
> >> > ·         Dependencies hash (dependencies within multi-module project)
> >> >
> >> >
> >> >
> >> > Project sources inputs are searched inside project + all paths from
> >> > plugins configuration:
> >> >
> >> > [image: image2019-8-30_10-28-56.png]
> >> >
> >> > How does it work in practice:
> >> >
> >> >
> >> >
> >> > 1.       CI: runs builds and stores outputs in shared cache
> >> >
> >> > 2.       CI: reuse outputs for same inputs, so time is decreasing
> >> >
> >> > 3.       Locally: when I checkout branch and run ‘install’ for whole
> >> > project, I get all actual snapshots from remote cache for this branch
> >> >
> >> > 4.       Locally: if I change multiple modules in tree, only changed
> >> > subtree is rebuilt
> >> >
> >> >
> >> >
> >> > Impact on current Maven codebase is very localized (MojoExecutor,
> >> where
> >> we
> >> > injected cache controller).
> >> >
> >> > Caching can be activated/deactivated by property, so current maven
> >> flow
> >> > will work as is.
> >> >
> >> >
> >> >
> >> > And the big plus is that you don’t need to re-work your current
> >> project.
> >> > Caching should work out of box, just need to add config in .mvn
> >> folder.
> >> >
> >> >
> >> >
> >> > Please let us know what do you think. We are ready to invest in this
> >> > feature and address any further feedback.
> >> >
> >> >
> >> >
> >> > Kind regards,
> >> >
> >> > Max
> >> >
> >> >
> >> >
> >> >
> >> > ---
> >> > This e-mail may contain confidential and/or privileged information. If
> >> you
> >> > are not the intended recipient (or have received this e-mail in error)
> >> > please notify the sender immediately and delete this e-mail. Any
> >> > unauthorized copying, disclosure or distribution of the material in
> >> this
> >> > e-mail is strictly forbidden.
> >> >
> >> > Please refer to https://www.db.com/disclosures for additional EU
> >> > corporate and regulatory disclosures and to
> >> > http://www.db.com/unitedkingdom/content/privacy.htm for information
> >> about
> >> > privacy.
> >> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>
>
Reply | Threaded
Open this post in threaded view
|

Re: [VOTE] Maven incremental build for BIG-sized projects with local and remote caching

Alexander Ashitkin
We checked and price of 550$ per user makes us think twice of what's the best way to proceed here :-)
Regarding plugin api - yes, changes are desirable to make maven model cache-friendly. Both in plugin invocation model and Mojo#execute input/output apis. But it is possible to work with current model with declarative approach.

Thanks in advance

On 2019/09/14 10:45:24, Tibor Digana <[hidden email]> wrote:

> But I do not understand why the Maven should be responsible for the project
> cahe control/management of "/target" directories.
> It is a responsibility of the build manager which is the Jenkins.
> The Jenkins has the ability to archive files and such property already
> exists in the Jenkins.
>
> So the Jenkins has a full knowledge about:
>
> 1. how long the workspace content retains intact
> 2. what commit hash is for the last build/job/branch
> 3. and what commit was successful
>
> If the target directories retain intact (or renewed from archive) in the
> workspace for very long time and the workspace was reused by the next build
> then I would say that the improvement should work as it is on CI level.
>
> Maybe what is necessary is only that improvement in Maven where we would
> obtain the list of modules or directories of changes in the current commit.
> Then the Maven can highly optimize its own build steps and build only those
> modules which have been changed and their dependent modules.
> So the interface between CI and Maven is needed in a kind of extension or
> the class MavenCli can be extended with some new entrypoint.
>
> But I do not hink that Maven has to take care of responsibilities of CI
> (project cache mgmt), that's not our task I would say and we as Maven would
> never know all about the miscellaneous CI specifics and therefore we would
> not cope with CI related troubles.
>
> Cheers
> Tibor17
>
>
>
> On Sat, Sep 14, 2019 at 11:08 AM Robert Scholte <[hidden email]>
> wrote:
>
> > On Fri, 13 Sep 2019 23:37:15 +0200, Romain Manni-Bucau
> > <[hidden email]> wrote:
> >
> > > There are multiple possible incremental support:
> > >
> > > 1. Scm related: do a status and rebuild downstream reactor
> > > 2. Full and module build graph: seems it is the one you target, ie bypass
> > > modules without change. Note that it only works if upstream graph is
> > > taken
> > > into account.
> > > 3. Full build: each mojo has incremental support so the full build gets
> > > it.
> > > Issue is that it requires each mojo to know if it needs to be executed or
> > > give enough info to the mojo executor to do so (gradle requires all
> > > inputs/outputs to assume this state - which is still just an heuristic
> > > and
> > > not 100% reliable).
> > >
> > > In current state, 2. sounds like a good option since 3 can require  a
> > > loot
> > > of work for external plugins (today's builds have a lot more of not maven
> > > provide plugins than core plugins).
> > > Now, we should be able to activate it or not so having a cacheLocation
> > > config in settings.xml can be good.
> > >
> > > Side notes:
> > >
> > > 1. having it on by default will break builds - reactor is deterministic
> > > and
> > > bypassing a module can break a build since it can init maven properties -
> > > for ex - for next modules
> > > 2. You cant find all in/out paths from the pom in general so your algo is
> > > not generic, a meta config can be needed in .mvn
> > > 3. We should let a mojo be able to disable that to replace default logic
> > > (surefire is a good example where it must be refined and it can save
> > > hours
> > > there ;))
> > > 4. Let's try to impl it as a mvn extension first then if it works well on
> > > multiple big project get it to core?
> >
> > Did anyone Google for "maven extension build cache"? There are already
> > commercial solutions for it.
> > Even though I would like to see improvements in this area, the old
> > architecture of Maven makes it quite hard to move to that situation.
> > First
> > of all it requires changes to the Plugin API (without breaking backwards
> > compatibility) to have support out of the box.
> >
> > Robert
> >
> > >
> > > Romain
> > >
> > >
> > >
> > > Le ven. 13 sept. 2019 à 23:18, Tibor Digana <[hidden email]> a
> > > écrit :
> > >
> > >> In theory, the incremental compiler would make it faster.
> > >> But this can be told only if you present a demo project with has trivial
> > >> tests taking much less time to complete than the compiler.
> > >>
> > >> In reality the tests in huge projects take significantly longer time
> > >> than
> > >> the compiler.
> > >> Some developers say "switch off all the tests" in the release phase but
> > >> that's wrong because then the quality goes down and methodologies are
> > >> broken.
> > >>
> > >> I can see a big problem that we do not have an interface between
> > >> Surefire
> > >> and Compiler plugin negotiating which tests have been modified including
> > >> modules and classes in the entire structure.
> > >>
> > >> Having incremental compiler is easy, just use compiler:3.8.1 or use the
> > >> Takari compiler.
> > >> But IMO the biggest benefit in performance would be after having the
> > >> truly
> > >> incremental test executor.
> > >>
> > >> On Fri, Sep 13, 2019 at 10:46 PM Maximilian Novikov <
> > >> [hidden email]> wrote:
> > >>
> > >> > Hi All,
> > >> >
> > >> >
> > >> >
> > >> > *We want to create upstream change to Maven* to support true
> > >> incremental
> > >> > build for big-sized projects.
> > >> >
> > >> > To raise a pull request we have to pass long chain of Deutsche Bank’s
> > >> > internal procedures. So, *before starting the process we would like to
> > >> > get your feedback regarding this feature*.
> > >> >
> > >> >
> > >> >
> > >> > *Motivation:*
> > >> >
> > >> >
> > >> >
> > >> > Our project is hosted in mono-repo and contains ~600 modules. All
> > >> modules
> > >> > has the same SNAPSHOT version.
> > >> >
> > >> > There are lot of test automation around this, everything is tested
> > >> before
> > >> > merge into release branch.
> > >> >
> > >> >
> > >> >
> > >> > Current setup helps us to simplify build/release/dependency management
> > >> for
> > >> > 10+ teams those contribute into codebase. We can release everything in
> > >> > 1-click.
> > >> >
> > >> > The major drawback of such approach is build time: *full local build
> > >> took
> > >> > 45-60 min (*-T8)*, CI build ~25min(*-T16*)*.
> > >> >
> > >> >
> > >> >
> > >> > To speed-up our build we needed 2 features: incremental build and
> > >> shared
> > >> > cache.
> > >> >
> > >> > Initially we started to think about migration to Gradle or Bazel. As
> > >> > migration costs for the mentioned tools were too high, we decided to
> > >> add
> > >> > similar functionality into Maven.
> > >> >
> > >> >
> > >> >
> > >> > Current results we get: *1-2 mins for local build(*-T8*)* if build was
> > >> > cached by CI*, CI build ~5 mins (*-T16*).*
> > >> >
> > >> >
> > >> >
> > >> > *Feature description:*
> > >> >
> > >> >
> > >> >
> > >> > The idea is to calculate checksum for inputs and save outputs in
> > >> cache.
> > >> >
> > >> > [image: image2019-8-27_20-0-14.png]
> > >> >
> > >> > Each node checksum calculated with:
> > >> >
> > >> >
> > >> >
> > >> > ·         Effective POM hash
> > >> >
> > >> > ·         Sources hash
> > >> >
> > >> > ·         Dependencies hash (dependencies within multi-module project)
> > >> >
> > >> >
> > >> >
> > >> > Project sources inputs are searched inside project + all paths from
> > >> > plugins configuration:
> > >> >
> > >> > [image: image2019-8-30_10-28-56.png]
> > >> >
> > >> > How does it work in practice:
> > >> >
> > >> >
> > >> >
> > >> > 1.       CI: runs builds and stores outputs in shared cache
> > >> >
> > >> > 2.       CI: reuse outputs for same inputs, so time is decreasing
> > >> >
> > >> > 3.       Locally: when I checkout branch and run ‘install’ for whole
> > >> > project, I get all actual snapshots from remote cache for this branch
> > >> >
> > >> > 4.       Locally: if I change multiple modules in tree, only changed
> > >> > subtree is rebuilt
> > >> >
> > >> >
> > >> >
> > >> > Impact on current Maven codebase is very localized (MojoExecutor,
> > >> where
> > >> we
> > >> > injected cache controller).
> > >> >
> > >> > Caching can be activated/deactivated by property, so current maven
> > >> flow
> > >> > will work as is.
> > >> >
> > >> >
> > >> >
> > >> > And the big plus is that you don’t need to re-work your current
> > >> project.
> > >> > Caching should work out of box, just need to add config in .mvn
> > >> folder.
> > >> >
> > >> >
> > >> >
> > >> > Please let us know what do you think. We are ready to invest in this
> > >> > feature and address any further feedback.
> > >> >
> > >> >
> > >> >
> > >> > Kind regards,
> > >> >
> > >> > Max
> > >> >
> > >> >
> > >> >
> > >> >
> > >> > ---
> > >> > This e-mail may contain confidential and/or privileged information. If
> > >> you
> > >> > are not the intended recipient (or have received this e-mail in error)
> > >> > please notify the sender immediately and delete this e-mail. Any
> > >> > unauthorized copying, disclosure or distribution of the material in
> > >> this
> > >> > e-mail is strictly forbidden.
> > >> >
> > >> > Please refer to https://www.db.com/disclosures for additional EU
> > >> > corporate and regulatory disclosures and to
> > >> > http://www.db.com/unitedkingdom/content/privacy.htm for information
> > >> about
> > >> > privacy.
> > >> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [hidden email]
> > For additional commands, e-mail: [hidden email]
> >
> >
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: [VOTE] Maven incremental build for BIG-sized projects with local and remote caching

Alexander Ashitkin
In reply to this post by Tibor Digana
Sorry, i think Jenkins is irrelevant here at all. we need solution which works everythere - on workstations, from commandline, on other build servers, in intellij, etc. Any solution which is worth to discuss must be Jenkins agnostic honestly. Also, FYI we don't rely on target directory state at all - it is not saved.

Thank you

On 2019/09/14 11:37:40, Tibor Digana <[hidden email]> wrote:

> oh yeah, exactly opposite.
> Jenkins has several ways to create Maven build configuration and it knows
> where the repo and workspace is, it knows where to store the archive, it
> knows when the build failed.
> We cannot take the responsibility because the build may fail for whatever
> reason and we do not know whether to keep the folders or delete all
> "/target" folders or just to delete only the failed one. The user knows it.
> We cannot archive the folders because we may significantly cause very high
> disk usage which would be without the control of CI. And we cannot take the
> responsibility of lifetime of these archives. It is all the property of
> Jenkins and Jenkins has the feature and management plugins where the
> workspace may retain for certain period of time, archives are limited in
> some way. The archives can be stored in another folder and we should not
> adopt these responsibilities because then we suddenly end up with all the
> knowledge of the distributed system and then we as maven project would end
> as unmaintainable project with many more issues in Jira and requirements we
> would be able to find the spare time to develop.
>
> On Sat, Sep 14, 2019 at 1:25 PM Romain Manni-Bucau <[hidden email]>
> wrote:
>
> > Tibor, maven is the only one with the logic to give any cache the data it
> > needs. Jenkins alone can't since it does not own the reactor nor plugin I/O
> > values.
> >
> > Le sam. 14 sept. 2019 à 12:45, Tibor Digana <[hidden email]> a
> > écrit :
> >
> > > But I do not understand why the Maven should be responsible for the
> > project
> > > cahe control/management of "/target" directories.
> > > It is a responsibility of the build manager which is the Jenkins.
> > > The Jenkins has the ability to archive files and such property already
> > > exists in the Jenkins.
> > >
> > > So the Jenkins has a full knowledge about:
> > >
> > > 1. how long the workspace content retains intact
> > > 2. what commit hash is for the last build/job/branch
> > > 3. and what commit was successful
> > >
> > > If the target directories retain intact (or renewed from archive) in the
> > > workspace for very long time and the workspace was reused by the next
> > build
> > > then I would say that the improvement should work as it is on CI level.
> > >
> > > Maybe what is necessary is only that improvement in Maven where we would
> > > obtain the list of modules or directories of changes in the current
> > commit.
> > > Then the Maven can highly optimize its own build steps and build only
> > those
> > > modules which have been changed and their dependent modules.
> > > So the interface between CI and Maven is needed in a kind of extension or
> > > the class MavenCli can be extended with some new entrypoint.
> > >
> > > But I do not hink that Maven has to take care of responsibilities of CI
> > > (project cache mgmt), that's not our task I would say and we as Maven
> > would
> > > never know all about the miscellaneous CI specifics and therefore we
> > would
> > > not cope with CI related troubles.
> > >
> > > Cheers
> > > Tibor17
> > >
> > >
> > >
> > > On Sat, Sep 14, 2019 at 11:08 AM Robert Scholte <[hidden email]>
> > > wrote:
> > >
> > > > On Fri, 13 Sep 2019 23:37:15 +0200, Romain Manni-Bucau
> > > > <[hidden email]> wrote:
> > > >
> > > > > There are multiple possible incremental support:
> > > > >
> > > > > 1. Scm related: do a status and rebuild downstream reactor
> > > > > 2. Full and module build graph: seems it is the one you target, ie
> > > bypass
> > > > > modules without change. Note that it only works if upstream graph is
> > > > > taken
> > > > > into account.
> > > > > 3. Full build: each mojo has incremental support so the full build
> > gets
> > > > > it.
> > > > > Issue is that it requires each mojo to know if it needs to be
> > executed
> > > or
> > > > > give enough info to the mojo executor to do so (gradle requires all
> > > > > inputs/outputs to assume this state - which is still just an
> > heuristic
> > > > > and
> > > > > not 100% reliable).
> > > > >
> > > > > In current state, 2. sounds like a good option since 3 can require  a
> > > > > loot
> > > > > of work for external plugins (today's builds have a lot more of not
> > > maven
> > > > > provide plugins than core plugins).
> > > > > Now, we should be able to activate it or not so having a
> > cacheLocation
> > > > > config in settings.xml can be good.
> > > > >
> > > > > Side notes:
> > > > >
> > > > > 1. having it on by default will break builds - reactor is
> > deterministic
> > > > > and
> > > > > bypassing a module can break a build since it can init maven
> > > properties -
> > > > > for ex - for next modules
> > > > > 2. You cant find all in/out paths from the pom in general so your
> > algo
> > > is
> > > > > not generic, a meta config can be needed in .mvn
> > > > > 3. We should let a mojo be able to disable that to replace default
> > > logic
> > > > > (surefire is a good example where it must be refined and it can save
> > > > > hours
> > > > > there ;))
> > > > > 4. Let's try to impl it as a mvn extension first then if it works
> > well
> > > on
> > > > > multiple big project get it to core?
> > > >
> > > > Did anyone Google for "maven extension build cache"? There are already
> > > > commercial solutions for it.
> > > > Even though I would like to see improvements in this area, the old
> > > > architecture of Maven makes it quite hard to move to that situation.
> > > > First
> > > > of all it requires changes to the Plugin API (without breaking
> > backwards
> > > > compatibility) to have support out of the box.
> > > >
> > > > Robert
> > > >
> > > > >
> > > > > Romain
> > > > >
> > > > >
> > > > >
> > > > > Le ven. 13 sept. 2019 à 23:18, Tibor Digana <[hidden email]>
> > a
> > > > > écrit :
> > > > >
> > > > >> In theory, the incremental compiler would make it faster.
> > > > >> But this can be told only if you present a demo project with has
> > > trivial
> > > > >> tests taking much less time to complete than the compiler.
> > > > >>
> > > > >> In reality the tests in huge projects take significantly longer time
> > > > >> than
> > > > >> the compiler.
> > > > >> Some developers say "switch off all the tests" in the release phase
> > > but
> > > > >> that's wrong because then the quality goes down and methodologies
> > are
> > > > >> broken.
> > > > >>
> > > > >> I can see a big problem that we do not have an interface between
> > > > >> Surefire
> > > > >> and Compiler plugin negotiating which tests have been modified
> > > including
> > > > >> modules and classes in the entire structure.
> > > > >>
> > > > >> Having incremental compiler is easy, just use compiler:3.8.1 or use
> > > the
> > > > >> Takari compiler.
> > > > >> But IMO the biggest benefit in performance would be after having the
> > > > >> truly
> > > > >> incremental test executor.
> > > > >>
> > > > >> On Fri, Sep 13, 2019 at 10:46 PM Maximilian Novikov <
> > > > >> [hidden email]> wrote:
> > > > >>
> > > > >> > Hi All,
> > > > >> >
> > > > >> >
> > > > >> >
> > > > >> > *We want to create upstream change to Maven* to support true
> > > > >> incremental
> > > > >> > build for big-sized projects.
> > > > >> >
> > > > >> > To raise a pull request we have to pass long chain of Deutsche
> > > Bank’s
> > > > >> > internal procedures. So, *before starting the process we would
> > like
> > > to
> > > > >> > get your feedback regarding this feature*.
> > > > >> >
> > > > >> >
> > > > >> >
> > > > >> > *Motivation:*
> > > > >> >
> > > > >> >
> > > > >> >
> > > > >> > Our project is hosted in mono-repo and contains ~600 modules. All
> > > > >> modules
> > > > >> > has the same SNAPSHOT version.
> > > > >> >
> > > > >> > There are lot of test automation around this, everything is tested
> > > > >> before
> > > > >> > merge into release branch.
> > > > >> >
> > > > >> >
> > > > >> >
> > > > >> > Current setup helps us to simplify build/release/dependency
> > > management
> > > > >> for
> > > > >> > 10+ teams those contribute into codebase. We can release
> > everything
> > > in
> > > > >> > 1-click.
> > > > >> >
> > > > >> > The major drawback of such approach is build time: *full local
> > build
> > > > >> took
> > > > >> > 45-60 min (*-T8)*, CI build ~25min(*-T16*)*.
> > > > >> >
> > > > >> >
> > > > >> >
> > > > >> > To speed-up our build we needed 2 features: incremental build and
> > > > >> shared
> > > > >> > cache.
> > > > >> >
> > > > >> > Initially we started to think about migration to Gradle or Bazel.
> > As
> > > > >> > migration costs for the mentioned tools were too high, we decided
> > to
> > > > >> add
> > > > >> > similar functionality into Maven.
> > > > >> >
> > > > >> >
> > > > >> >
> > > > >> > Current results we get: *1-2 mins for local build(*-T8*)* if build
> > > was
> > > > >> > cached by CI*, CI build ~5 mins (*-T16*).*
> > > > >> >
> > > > >> >
> > > > >> >
> > > > >> > *Feature description:*
> > > > >> >
> > > > >> >
> > > > >> >
> > > > >> > The idea is to calculate checksum for inputs and save outputs in
> > > > >> cache.
> > > > >> >
> > > > >> > [image: image2019-8-27_20-0-14.png]
> > > > >> >
> > > > >> > Each node checksum calculated with:
> > > > >> >
> > > > >> >
> > > > >> >
> > > > >> > ·         Effective POM hash
> > > > >> >
> > > > >> > ·         Sources hash
> > > > >> >
> > > > >> > ·         Dependencies hash (dependencies within multi-module
> > > project)
> > > > >> >
> > > > >> >
> > > > >> >
> > > > >> > Project sources inputs are searched inside project + all paths
> > from
> > > > >> > plugins configuration:
> > > > >> >
> > > > >> > [image: image2019-8-30_10-28-56.png]
> > > > >> >
> > > > >> > How does it work in practice:
> > > > >> >
> > > > >> >
> > > > >> >
> > > > >> > 1.       CI: runs builds and stores outputs in shared cache
> > > > >> >
> > > > >> > 2.       CI: reuse outputs for same inputs, so time is decreasing
> > > > >> >
> > > > >> > 3.       Locally: when I checkout branch and run ‘install’ for
> > whole
> > > > >> > project, I get all actual snapshots from remote cache for this
> > > branch
> > > > >> >
> > > > >> > 4.       Locally: if I change multiple modules in tree, only
> > changed
> > > > >> > subtree is rebuilt
> > > > >> >
> > > > >> >
> > > > >> >
> > > > >> > Impact on current Maven codebase is very localized (MojoExecutor,
> > > > >> where
> > > > >> we
> > > > >> > injected cache controller).
> > > > >> >
> > > > >> > Caching can be activated/deactivated by property, so current maven
> > > > >> flow
> > > > >> > will work as is.
> > > > >> >
> > > > >> >
> > > > >> >
> > > > >> > And the big plus is that you don’t need to re-work your current
> > > > >> project.
> > > > >> > Caching should work out of box, just need to add config in .mvn
> > > > >> folder.
> > > > >> >
> > > > >> >
> > > > >> >
> > > > >> > Please let us know what do you think. We are ready to invest in
> > this
> > > > >> > feature and address any further feedback.
> > > > >> >
> > > > >> >
> > > > >> >
> > > > >> > Kind regards,
> > > > >> >
> > > > >> > Max
> > > > >> >
> > > > >> >
> > > > >> >
> > > > >> >
> > > > >> > ---
> > > > >> > This e-mail may contain confidential and/or privileged
> > information.
> > > If
> > > > >> you
> > > > >> > are not the intended recipient (or have received this e-mail in
> > > error)
> > > > >> > please notify the sender immediately and delete this e-mail. Any
> > > > >> > unauthorized copying, disclosure or distribution of the material
> > in
> > > > >> this
> > > > >> > e-mail is strictly forbidden.
> > > > >> >
> > > > >> > Please refer to https://www.db.com/disclosures for additional EU
> > > > >> > corporate and regulatory disclosures and to
> > > > >> > http://www.db.com/unitedkingdom/content/privacy.htm for
> > information
> > > > >> about
> > > > >> > privacy.
> > > > >> >
> > > >
> > > > ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: [hidden email]
> > > > For additional commands, e-mail: [hidden email]
> > > >
> > > >
> > >
> >
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: [VOTE] Maven incremental build for BIG-sized projects with local and remote caching

Alexander Ashitkin
In reply to this post by Tibor Digana
HI Robert
seems to your thinking matches to our own one. Indeed, the question is - should be executed this goal or not? But in current plugin-api limitations not a plugin-developer but only project developer can understand should this goal run or not because of side effects each plugin might have. And yes, if plugin api defines input output and have more granular execution lifecycle, it will be much more friendly for caching/incremental approach. That was one of the options for us, but we decided to avoid huge reworks in sake of easier portability between versions.

Thank you


On 2019/09/14 13:44:36, "Robert Scholte" <[hidden email]> wrote:

> Tibor, it seems like you're missing the bigger picture.
> The question is similar to what we've discussed in the past: can we define  
> if surefire should be executed or not?
>
> We should define incremental builds as "should a goal be executed or  
> not?", e.g. based on the results of the previous build.
> First of all: calling 'clean' makes it impossible to do incremental builds.
> Next, it is the *plugin-developer* that knows best if the goal should be  
> executed or not. Now it is still logic inside the plugin, but if the  
> plugin API understands input and output, we can leave it up to Maven to  
> decide if a goal should be executed.
> The buildplan now gives us a graph of Maven Projects, but theoretically  
> with such changes we could make a graph of goals. And it could detect  
> useless calls of goals, because the output is never being used.
> Some might recognize a Gradle concept here, and that's correct. At this  
> point they were able to design something that works better compared to  
> Maven. For their build cache extension they had to analyze the plugin  
> descriptors, marking all parameters as either input or output. And that  
> boosts the builds with their extension.
>
> thanks,
> Robert
>
>
> On Sat, 14 Sep 2019 13:37:40 +0200, Tibor Digana <[hidden email]>  
> wrote:
>
> > oh yeah, exactly opposite.
> > Jenkins has several ways to create Maven build configuration and it knows
> > where the repo and workspace is, it knows where to store the archive, it
> > knows when the build failed.
> > We cannot take the responsibility because the build may fail for whatever
> > reason and we do not know whether to keep the folders or delete all
> > "/target" folders or just to delete only the failed one. The user knows  
> > it.
> > We cannot archive the folders because we may significantly cause very  
> > high
> > disk usage which would be without the control of CI. And we cannot take  
> > the
> > responsibility of lifetime of these archives. It is all the property of
> > Jenkins and Jenkins has the feature and management plugins where the
> > workspace may retain for certain period of time, archives are limited in
> > some way. The archives can be stored in another folder and we should not
> > adopt these responsibilities because then we suddenly end up with all the
> > knowledge of the distributed system and then we as maven project would  
> > end
> > as unmaintainable project with many more issues in Jira and requirements  
> > we
> > would be able to find the spare time to develop.
> >
> > On Sat, Sep 14, 2019 at 1:25 PM Romain Manni-Bucau  
> > <[hidden email]>
> > wrote:
> >
> >> Tibor, maven is the only one with the logic to give any cache the data  
> >> it
> >> needs. Jenkins alone can't since it does not own the reactor nor plugin  
> >> I/O
> >> values.
> >>
> >> Le sam. 14 sept. 2019 à 12:45, Tibor Digana <[hidden email]> a
> >> écrit :
> >>
> >> > But I do not understand why the Maven should be responsible for the
> >> project
> >> > cahe control/management of "/target" directories.
> >> > It is a responsibility of the build manager which is the Jenkins.
> >> > The Jenkins has the ability to archive files and such property already
> >> > exists in the Jenkins.
> >> >
> >> > So the Jenkins has a full knowledge about:
> >> >
> >> > 1. how long the workspace content retains intact
> >> > 2. what commit hash is for the last build/job/branch
> >> > 3. and what commit was successful
> >> >
> >> > If the target directories retain intact (or renewed from archive) in  
> >> the
> >> > workspace for very long time and the workspace was reused by the next
> >> build
> >> > then I would say that the improvement should work as it is on CI  
> >> level.
> >> >
> >> > Maybe what is necessary is only that improvement in Maven where we  
> >> would
> >> > obtain the list of modules or directories of changes in the current
> >> commit.
> >> > Then the Maven can highly optimize its own build steps and build only
> >> those
> >> > modules which have been changed and their dependent modules.
> >> > So the interface between CI and Maven is needed in a kind of  
> >> extension or
> >> > the class MavenCli can be extended with some new entrypoint.
> >> >
> >> > But I do not hink that Maven has to take care of responsibilities of  
> >> CI
> >> > (project cache mgmt), that's not our task I would say and we as Maven
> >> would
> >> > never know all about the miscellaneous CI specifics and therefore we
> >> would
> >> > not cope with CI related troubles.
> >> >
> >> > Cheers
> >> > Tibor17
> >> >
> >> >
> >> >
> >> > On Sat, Sep 14, 2019 at 11:08 AM Robert Scholte <[hidden email]>
> >> > wrote:
> >> >
> >> > > On Fri, 13 Sep 2019 23:37:15 +0200, Romain Manni-Bucau
> >> > > <[hidden email]> wrote:
> >> > >
> >> > > > There are multiple possible incremental support:
> >> > > >
> >> > > > 1. Scm related: do a status and rebuild downstream reactor
> >> > > > 2. Full and module build graph: seems it is the one you target, ie
> >> > bypass
> >> > > > modules without change. Note that it only works if upstream graph  
> >> is
> >> > > > taken
> >> > > > into account.
> >> > > > 3. Full build: each mojo has incremental support so the full build
> >> gets
> >> > > > it.
> >> > > > Issue is that it requires each mojo to know if it needs to be
> >> executed
> >> > or
> >> > > > give enough info to the mojo executor to do so (gradle requires  
> >> all
> >> > > > inputs/outputs to assume this state - which is still just an
> >> heuristic
> >> > > > and
> >> > > > not 100% reliable).
> >> > > >
> >> > > > In current state, 2. sounds like a good option since 3 can  
> >> require  a
> >> > > > loot
> >> > > > of work for external plugins (today's builds have a lot more of  
> >> not
> >> > maven
> >> > > > provide plugins than core plugins).
> >> > > > Now, we should be able to activate it or not so having a
> >> cacheLocation
> >> > > > config in settings.xml can be good.
> >> > > >
> >> > > > Side notes:
> >> > > >
> >> > > > 1. having it on by default will break builds - reactor is
> >> deterministic
> >> > > > and
> >> > > > bypassing a module can break a build since it can init maven
> >> > properties -
> >> > > > for ex - for next modules
> >> > > > 2. You cant find all in/out paths from the pom in general so your
> >> algo
> >> > is
> >> > > > not generic, a meta config can be needed in .mvn
> >> > > > 3. We should let a mojo be able to disable that to replace default
> >> > logic
> >> > > > (surefire is a good example where it must be refined and it can  
> >> save
> >> > > > hours
> >> > > > there ;))
> >> > > > 4. Let's try to impl it as a mvn extension first then if it works
> >> well
> >> > on
> >> > > > multiple big project get it to core?
> >> > >
> >> > > Did anyone Google for "maven extension build cache"? There are  
> >> already
> >> > > commercial solutions for it.
> >> > > Even though I would like to see improvements in this area, the old
> >> > > architecture of Maven makes it quite hard to move to that situation.
> >> > > First
> >> > > of all it requires changes to the Plugin API (without breaking
> >> backwards
> >> > > compatibility) to have support out of the box.
> >> > >
> >> > > Robert
> >> > >
> >> > > >
> >> > > > Romain
> >> > > >
> >> > > >
> >> > > >
> >> > > > Le ven. 13 sept. 2019 à 23:18, Tibor Digana  
> >> <[hidden email]>
> >> a
> >> > > > écrit :
> >> > > >
> >> > > >> In theory, the incremental compiler would make it faster.
> >> > > >> But this can be told only if you present a demo project with has
> >> > trivial
> >> > > >> tests taking much less time to complete than the compiler.
> >> > > >>
> >> > > >> In reality the tests in huge projects take significantly longer  
> >> time
> >> > > >> than
> >> > > >> the compiler.
> >> > > >> Some developers say "switch off all the tests" in the release  
> >> phase
> >> > but
> >> > > >> that's wrong because then the quality goes down and methodologies
> >> are
> >> > > >> broken.
> >> > > >>
> >> > > >> I can see a big problem that we do not have an interface between
> >> > > >> Surefire
> >> > > >> and Compiler plugin negotiating which tests have been modified
> >> > including
> >> > > >> modules and classes in the entire structure.
> >> > > >>
> >> > > >> Having incremental compiler is easy, just use compiler:3.8.1 or  
> >> use
> >> > the
> >> > > >> Takari compiler.
> >> > > >> But IMO the biggest benefit in performance would be after having  
> >> the
> >> > > >> truly
> >> > > >> incremental test executor.
> >> > > >>
> >> > > >> On Fri, Sep 13, 2019 at 10:46 PM Maximilian Novikov <
> >> > > >> [hidden email]> wrote:
> >> > > >>
> >> > > >> > Hi All,
> >> > > >> >
> >> > > >> >
> >> > > >> >
> >> > > >> > *We want to create upstream change to Maven* to support true
> >> > > >> incremental
> >> > > >> > build for big-sized projects.
> >> > > >> >
> >> > > >> > To raise a pull request we have to pass long chain of Deutsche
> >> > Bank’s
> >> > > >> > internal procedures. So, *before starting the process we would
> >> like
> >> > to
> >> > > >> > get your feedback regarding this feature*.
> >> > > >> >
> >> > > >> >
> >> > > >> >
> >> > > >> > *Motivation:*
> >> > > >> >
> >> > > >> >
> >> > > >> >
> >> > > >> > Our project is hosted in mono-repo and contains ~600 modules.  
> >> All
> >> > > >> modules
> >> > > >> > has the same SNAPSHOT version.
> >> > > >> >
> >> > > >> > There are lot of test automation around this, everything is  
> >> tested
> >> > > >> before
> >> > > >> > merge into release branch.
> >> > > >> >
> >> > > >> >
> >> > > >> >
> >> > > >> > Current setup helps us to simplify build/release/dependency
> >> > management
> >> > > >> for
> >> > > >> > 10+ teams those contribute into codebase. We can release
> >> everything
> >> > in
> >> > > >> > 1-click.
> >> > > >> >
> >> > > >> > The major drawback of such approach is build time: *full local
> >> build
> >> > > >> took
> >> > > >> > 45-60 min (*-T8)*, CI build ~25min(*-T16*)*.
> >> > > >> >
> >> > > >> >
> >> > > >> >
> >> > > >> > To speed-up our build we needed 2 features: incremental build  
> >> and
> >> > > >> shared
> >> > > >> > cache.
> >> > > >> >
> >> > > >> > Initially we started to think about migration to Gradle or  
> >> Bazel.
> >> As
> >> > > >> > migration costs for the mentioned tools were too high, we  
> >> decided
> >> to
> >> > > >> add
> >> > > >> > similar functionality into Maven.
> >> > > >> >
> >> > > >> >
> >> > > >> >
> >> > > >> > Current results we get: *1-2 mins for local build(*-T8*)* if  
> >> build
> >> > was
> >> > > >> > cached by CI*, CI build ~5 mins (*-T16*).*
> >> > > >> >
> >> > > >> >
> >> > > >> >
> >> > > >> > *Feature description:*
> >> > > >> >
> >> > > >> >
> >> > > >> >
> >> > > >> > The idea is to calculate checksum for inputs and save outputs  
> >> in
> >> > > >> cache.
> >> > > >> >
> >> > > >> > [image: image2019-8-27_20-0-14.png]
> >> > > >> >
> >> > > >> > Each node checksum calculated with:
> >> > > >> >
> >> > > >> >
> >> > > >> >
> >> > > >> > ·         Effective POM hash
> >> > > >> >
> >> > > >> > ·         Sources hash
> >> > > >> >
> >> > > >> > ·         Dependencies hash (dependencies within multi-module
> >> > project)
> >> > > >> >
> >> > > >> >
> >> > > >> >
> >> > > >> > Project sources inputs are searched inside project + all paths
> >> from
> >> > > >> > plugins configuration:
> >> > > >> >
> >> > > >> > [image: image2019-8-30_10-28-56.png]
> >> > > >> >
> >> > > >> > How does it work in practice:
> >> > > >> >
> >> > > >> >
> >> > > >> >
> >> > > >> > 1.       CI: runs builds and stores outputs in shared cache
> >> > > >> >
> >> > > >> > 2.       CI: reuse outputs for same inputs, so time is  
> >> decreasing
> >> > > >> >
> >> > > >> > 3.       Locally: when I checkout branch and run ‘install’ for
> >> whole
> >> > > >> > project, I get all actual snapshots from remote cache for this
> >> > branch
> >> > > >> >
> >> > > >> > 4.       Locally: if I change multiple modules in tree, only
> >> changed
> >> > > >> > subtree is rebuilt
> >> > > >> >
> >> > > >> >
> >> > > >> >
> >> > > >> > Impact on current Maven codebase is very localized  
> >> (MojoExecutor,
> >> > > >> where
> >> > > >> we
> >> > > >> > injected cache controller).
> >> > > >> >
> >> > > >> > Caching can be activated/deactivated by property, so current  
> >> maven
> >> > > >> flow
> >> > > >> > will work as is.
> >> > > >> >
> >> > > >> >
> >> > > >> >
> >> > > >> > And the big plus is that you don’t need to re-work your current
> >> > > >> project.
> >> > > >> > Caching should work out of box, just need to add config in .mvn
> >> > > >> folder.
> >> > > >> >
> >> > > >> >
> >> > > >> >
> >> > > >> > Please let us know what do you think. We are ready to invest in
> >> this
> >> > > >> > feature and address any further feedback.
> >> > > >> >
> >> > > >> >
> >> > > >> >
> >> > > >> > Kind regards,
> >> > > >> >
> >> > > >> > Max
> >> > > >> >
> >> > > >> >
> >> > > >> >
> >> > > >> >
> >> > > >> > ---
> >> > > >> > This e-mail may contain confidential and/or privileged
> >> information.
> >> > If
> >> > > >> you
> >> > > >> > are not the intended recipient (or have received this e-mail in
> >> > error)
> >> > > >> > please notify the sender immediately and delete this e-mail.  
> >> Any
> >> > > >> > unauthorized copying, disclosure or distribution of the  
> >> material
> >> in
> >> > > >> this
> >> > > >> > e-mail is strictly forbidden.
> >> > > >> >
> >> > > >> > Please refer to https://www.db.com/disclosures for additional  
> >> EU
> >> > > >> > corporate and regulatory disclosures and to
> >> > > >> > http://www.db.com/unitedkingdom/content/privacy.htm for
> >> information
> >> > > >> about
> >> > > >> > privacy.
> >> > > >> >
> >> > >
> >> > >  
> >> ---------------------------------------------------------------------
> >> > > To unsubscribe, e-mail: [hidden email]
> >> > > For additional commands, e-mail: [hidden email]
> >> > >
> >> > >
> >> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: [VOTE] Maven incremental build for BIG-sized projects with local and remote caching

Romain Manni-Bucau
In reply to this post by Alexander Ashitkin
Hope I didnt miss it but how monorepo=single build?

It is working well to not have a common parent too and is unlinked to
monorepo which uses local relative paths in general (at least in the
references you quoted which are also not about java ;)).

Unrelated to making maven better at incremental builds but both tracks can
help you to get a very fast build feedback.

Le sam. 14 sept. 2019 à 17:35, Robert Scholte <[hidden email]> a
écrit :

> https://issues.apache.org/jira/browse/MPLUGIN-350 is the issue to start
> with.
>
> Please read all the comments, because my original thought won't work.
>
> thanks,
> Robert
>
> On Sat, 14 Sep 2019 17:10:13 +0200, Alexander Ashitkin
> <[hidden email]> wrote:
>
> > We checked and price of 550$ per user makes us think twice of what's
> the
> > best way to proceed here :-)
> > Regarding plugin api - yes, changes are desirable to make maven model
> > cache-friendly. Both in plugin invocation model and Mojo#execute
> > input/output apis. But it is possible to work with current model with
> > declarative approach.
> >
> > Thanks in advance
> >
> > On 2019/09/14 10:45:24, Tibor Digana <[hidden email]> wrote:
> >> But I do not understand why the Maven should be responsible for the
> >> project
> >> cahe control/management of "/target" directories.
> >> It is a responsibility of the build manager which is the Jenkins.
> >> The Jenkins has the ability to archive files and such property already
> >> exists in the Jenkins.
> >>
> >> So the Jenkins has a full knowledge about:
> >>
> >> 1. how long the workspace content retains intact
> >> 2. what commit hash is for the last build/job/branch
> >> 3. and what commit was successful
> >>
> >> If the target directories retain intact (or renewed from archive) in the
> >> workspace for very long time and the workspace was reused by the next
> >> build
> >> then I would say that the improvement should work as it is on CI level.
> >>
> >> Maybe what is necessary is only that improvement in Maven where we would
> >> obtain the list of modules or directories of changes in the current
> >> commit.
> >> Then the Maven can highly optimize its own build steps and build only
> >> those
> >> modules which have been changed and their dependent modules.
> >> So the interface between CI and Maven is needed in a kind of extension
> >> or
> >> the class MavenCli can be extended with some new entrypoint.
> >>
> >> But I do not hink that Maven has to take care of responsibilities of CI
> >> (project cache mgmt), that's not our task I would say and we as Maven
> >> would
> >> never know all about the miscellaneous CI specifics and therefore we
> >> would
> >> not cope with CI related troubles.
> >>
> >> Cheers
> >> Tibor17
> >>
> >>
> >>
> >> On Sat, Sep 14, 2019 at 11:08 AM Robert Scholte <[hidden email]>
> >> wrote:
> >>
> >> > On Fri, 13 Sep 2019 23:37:15 +0200, Romain Manni-Bucau
> >> > <[hidden email]> wrote:
> >> >
> >> > > There are multiple possible incremental support:
> >> > >
> >> > > 1. Scm related: do a status and rebuild downstream reactor
> >> > > 2. Full and module build graph: seems it is the one you target, ie
> >> bypass
> >> > > modules without change. Note that it only works if upstream graph is
> >> > > taken
> >> > > into account.
> >> > > 3. Full build: each mojo has incremental support so the full build
> >> gets
> >> > > it.
> >> > > Issue is that it requires each mojo to know if it needs to be
> >> executed or
> >> > > give enough info to the mojo executor to do so (gradle requires all
> >> > > inputs/outputs to assume this state - which is still just an
> >> heuristic
> >> > > and
> >> > > not 100% reliable).
> >> > >
> >> > > In current state, 2. sounds like a good option since 3 can require
>
> >> a
> >> > > loot
> >> > > of work for external plugins (today's builds have a lot more of
> not
> >> maven
> >> > > provide plugins than core plugins).
> >> > > Now, we should be able to activate it or not so having a
> >> cacheLocation
> >> > > config in settings.xml can be good.
> >> > >
> >> > > Side notes:
> >> > >
> >> > > 1. having it on by default will break builds - reactor is
> >> deterministic
> >> > > and
> >> > > bypassing a module can break a build since it can init maven
> >> properties -
> >> > > for ex - for next modules
> >> > > 2. You cant find all in/out paths from the pom in general so your
> >> algo is
> >> > > not generic, a meta config can be needed in .mvn
> >> > > 3. We should let a mojo be able to disable that to replace default
> >> logic
> >> > > (surefire is a good example where it must be refined and it can save
> >> > > hours
> >> > > there ;))
> >> > > 4. Let's try to impl it as a mvn extension first then if it works
> >> well on
> >> > > multiple big project get it to core?
> >> >
> >> > Did anyone Google for "maven extension build cache"? There are already
> >> > commercial solutions for it.
> >> > Even though I would like to see improvements in this area, the old
> >> > architecture of Maven makes it quite hard to move to that situation.
> >> > First
> >> > of all it requires changes to the Plugin API (without breaking
> >> backwards
> >> > compatibility) to have support out of the box.
> >> >
> >> > Robert
> >> >
> >> > >
> >> > > Romain
> >> > >
> >> > >
> >> > >
> >> > > Le ven. 13 sept. 2019 à 23:18, Tibor Digana
> >> <[hidden email]> a
> >> > > écrit :
> >> > >
> >> > >> In theory, the incremental compiler would make it faster.
> >> > >> But this can be told only if you present a demo project with has
> >> trivial
> >> > >> tests taking much less time to complete than the compiler.
> >> > >>
> >> > >> In reality the tests in huge projects take significantly longer
> >> time
> >> > >> than
> >> > >> the compiler.
> >> > >> Some developers say "switch off all the tests" in the release
> >> phase but
> >> > >> that's wrong because then the quality goes down and methodologies
> >> are
> >> > >> broken.
> >> > >>
> >> > >> I can see a big problem that we do not have an interface between
> >> > >> Surefire
> >> > >> and Compiler plugin negotiating which tests have been modified
> >> including
> >> > >> modules and classes in the entire structure.
> >> > >>
> >> > >> Having incremental compiler is easy, just use compiler:3.8.1 or
> >> use the
> >> > >> Takari compiler.
> >> > >> But IMO the biggest benefit in performance would be after having
> >> the
> >> > >> truly
> >> > >> incremental test executor.
> >> > >>
> >> > >> On Fri, Sep 13, 2019 at 10:46 PM Maximilian Novikov <
> >> > >> [hidden email]> wrote:
> >> > >>
> >> > >> > Hi All,
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > *We want to create upstream change to Maven* to support true
> >> > >> incremental
> >> > >> > build for big-sized projects.
> >> > >> >
> >> > >> > To raise a pull request we have to pass long chain of Deutsche
> >> Bank’s
> >> > >> > internal procedures. So, *before starting the process we would
> >> like to
> >> > >> > get your feedback regarding this feature*.
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > *Motivation:*
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > Our project is hosted in mono-repo and contains ~600 modules. All
> >> > >> modules
> >> > >> > has the same SNAPSHOT version.
> >> > >> >
> >> > >> > There are lot of test automation around this, everything is
> >> tested
> >> > >> before
> >> > >> > merge into release branch.
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > Current setup helps us to simplify build/release/dependency
> >> management
> >> > >> for
> >> > >> > 10+ teams those contribute into codebase. We can release
> >> everything in
> >> > >> > 1-click.
> >> > >> >
> >> > >> > The major drawback of such approach is build time: *full local
> >> build
> >> > >> took
> >> > >> > 45-60 min (*-T8)*, CI build ~25min(*-T16*)*.
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > To speed-up our build we needed 2 features: incremental build and
> >> > >> shared
> >> > >> > cache.
> >> > >> >
> >> > >> > Initially we started to think about migration to Gradle or
> >> Bazel. As
> >> > >> > migration costs for the mentioned tools were too high, we
> >> decided to
> >> > >> add
> >> > >> > similar functionality into Maven.
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > Current results we get: *1-2 mins for local build(*-T8*)* if
> >> build was
> >> > >> > cached by CI*, CI build ~5 mins (*-T16*).*
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > *Feature description:*
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > The idea is to calculate checksum for inputs and save outputs in
> >> > >> cache.
> >> > >> >
> >> > >> > [image: image2019-8-27_20-0-14.png]
> >> > >> >
> >> > >> > Each node checksum calculated with:
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > ·         Effective POM hash
> >> > >> >
> >> > >> > ·         Sources hash
> >> > >> >
> >> > >> > ·         Dependencies hash (dependencies within multi-module
> >> project)
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > Project sources inputs are searched inside project + all paths
> >> from
> >> > >> > plugins configuration:
> >> > >> >
> >> > >> > [image: image2019-8-30_10-28-56.png]
> >> > >> >
> >> > >> > How does it work in practice:
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > 1.       CI: runs builds and stores outputs in shared cache
> >> > >> >
> >> > >> > 2.       CI: reuse outputs for same inputs, so time is decreasing
> >> > >> >
> >> > >> > 3.       Locally: when I checkout branch and run ‘install’ for
> >> whole
> >> > >> > project, I get all actual snapshots from remote cache for this
> >> branch
> >> > >> >
> >> > >> > 4.       Locally: if I change multiple modules in tree, only
> >> changed
> >> > >> > subtree is rebuilt
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > Impact on current Maven codebase is very localized (MojoExecutor,
> >> > >> where
> >> > >> we
> >> > >> > injected cache controller).
> >> > >> >
> >> > >> > Caching can be activated/deactivated by property, so current
> >> maven
> >> > >> flow
> >> > >> > will work as is.
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > And the big plus is that you don’t need to re-work your current
> >> > >> project.
> >> > >> > Caching should work out of box, just need to add config in .mvn
> >> > >> folder.
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > Please let us know what do you think. We are ready to invest in
> >> this
> >> > >> > feature and address any further feedback.
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > Kind regards,
> >> > >> >
> >> > >> > Max
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > ---
> >> > >> > This e-mail may contain confidential and/or privileged
> >> information. If
> >> > >> you
> >> > >> > are not the intended recipient (or have received this e-mail in
> >> error)
> >> > >> > please notify the sender immediately and delete this e-mail. Any
> >> > >> > unauthorized copying, disclosure or distribution of the
> material
> >> in
> >> > >> this
> >> > >> > e-mail is strictly forbidden.
> >> > >> >
> >> > >> > Please refer to https://www.db.com/disclosures for additional EU
> >> > >> > corporate and regulatory disclosures and to
> >> > >> > http://www.db.com/unitedkingdom/content/privacy.htm for
> >> information
> >> > >> about
> >> > >> > privacy.
> >> > >> >
> >> >
> >> > ---------------------------------------------------------------------
> >> > To unsubscribe, e-mail: [hidden email]
> >> > For additional commands, e-mail: [hidden email]
> >> >
> >> >
> >>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [hidden email]
> > For additional commands, e-mail: [hidden email]
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>
>
Reply | Threaded
Open this post in threaded view
|

Re: [VOTE] Maven incremental build for BIG-sized projects with local and remote caching

Alexander Ashitkin
Hi
Let's please stop discussing this subject as it goes off-top and pollutes thread. Our case exists, it has own reasons and we discuss it is not in the scope of this thread. Lets please return to the feature itself

Thank you

On 2019/09/14 16:41:43, Romain Manni-Bucau <[hidden email]> wrote:

> Hope I didnt miss it but how monorepo=single build?
>
> It is working well to not have a common parent too and is unlinked to
> monorepo which uses local relative paths in general (at least in the
> references you quoted which are also not about java ;)).
>
> Unrelated to making maven better at incremental builds but both tracks can
> help you to get a very fast build feedback.
>
> Le sam. 14 sept. 2019 à 17:35, Robert Scholte <[hidden email]> a
> écrit :
>
> > https://issues.apache.org/jira/browse/MPLUGIN-350 is the issue to start
> > with.
> >
> > Please read all the comments, because my original thought won't work.
> >
> > thanks,
> > Robert
> >
> > On Sat, 14 Sep 2019 17:10:13 +0200, Alexander Ashitkin
> > <[hidden email]> wrote:
> >
> > > We checked and price of 550$ per user makes us think twice of what's
> > the
> > > best way to proceed here :-)
> > > Regarding plugin api - yes, changes are desirable to make maven model
> > > cache-friendly. Both in plugin invocation model and Mojo#execute
> > > input/output apis. But it is possible to work with current model with
> > > declarative approach.
> > >
> > > Thanks in advance
> > >
> > > On 2019/09/14 10:45:24, Tibor Digana <[hidden email]> wrote:
> > >> But I do not understand why the Maven should be responsible for the
> > >> project
> > >> cahe control/management of "/target" directories.
> > >> It is a responsibility of the build manager which is the Jenkins.
> > >> The Jenkins has the ability to archive files and such property already
> > >> exists in the Jenkins.
> > >>
> > >> So the Jenkins has a full knowledge about:
> > >>
> > >> 1. how long the workspace content retains intact
> > >> 2. what commit hash is for the last build/job/branch
> > >> 3. and what commit was successful
> > >>
> > >> If the target directories retain intact (or renewed from archive) in the
> > >> workspace for very long time and the workspace was reused by the next
> > >> build
> > >> then I would say that the improvement should work as it is on CI level.
> > >>
> > >> Maybe what is necessary is only that improvement in Maven where we would
> > >> obtain the list of modules or directories of changes in the current
> > >> commit.
> > >> Then the Maven can highly optimize its own build steps and build only
> > >> those
> > >> modules which have been changed and their dependent modules.
> > >> So the interface between CI and Maven is needed in a kind of extension
> > >> or
> > >> the class MavenCli can be extended with some new entrypoint.
> > >>
> > >> But I do not hink that Maven has to take care of responsibilities of CI
> > >> (project cache mgmt), that's not our task I would say and we as Maven
> > >> would
> > >> never know all about the miscellaneous CI specifics and therefore we
> > >> would
> > >> not cope with CI related troubles.
> > >>
> > >> Cheers
> > >> Tibor17
> > >>
> > >>
> > >>
> > >> On Sat, Sep 14, 2019 at 11:08 AM Robert Scholte <[hidden email]>
> > >> wrote:
> > >>
> > >> > On Fri, 13 Sep 2019 23:37:15 +0200, Romain Manni-Bucau
> > >> > <[hidden email]> wrote:
> > >> >
> > >> > > There are multiple possible incremental support:
> > >> > >
> > >> > > 1. Scm related: do a status and rebuild downstream reactor
> > >> > > 2. Full and module build graph: seems it is the one you target, ie
> > >> bypass
> > >> > > modules without change. Note that it only works if upstream graph is
> > >> > > taken
> > >> > > into account.
> > >> > > 3. Full build: each mojo has incremental support so the full build
> > >> gets
> > >> > > it.
> > >> > > Issue is that it requires each mojo to know if it needs to be
> > >> executed or
> > >> > > give enough info to the mojo executor to do so (gradle requires all
> > >> > > inputs/outputs to assume this state - which is still just an
> > >> heuristic
> > >> > > and
> > >> > > not 100% reliable).
> > >> > >
> > >> > > In current state, 2. sounds like a good option since 3 can require
> >
> > >> a
> > >> > > loot
> > >> > > of work for external plugins (today's builds have a lot more of
> > not
> > >> maven
> > >> > > provide plugins than core plugins).
> > >> > > Now, we should be able to activate it or not so having a
> > >> cacheLocation
> > >> > > config in settings.xml can be good.
> > >> > >
> > >> > > Side notes:
> > >> > >
> > >> > > 1. having it on by default will break builds - reactor is
> > >> deterministic
> > >> > > and
> > >> > > bypassing a module can break a build since it can init maven
> > >> properties -
> > >> > > for ex - for next modules
> > >> > > 2. You cant find all in/out paths from the pom in general so your
> > >> algo is
> > >> > > not generic, a meta config can be needed in .mvn
> > >> > > 3. We should let a mojo be able to disable that to replace default
> > >> logic
> > >> > > (surefire is a good example where it must be refined and it can save
> > >> > > hours
> > >> > > there ;))
> > >> > > 4. Let's try to impl it as a mvn extension first then if it works
> > >> well on
> > >> > > multiple big project get it to core?
> > >> >
> > >> > Did anyone Google for "maven extension build cache"? There are already
> > >> > commercial solutions for it.
> > >> > Even though I would like to see improvements in this area, the old
> > >> > architecture of Maven makes it quite hard to move to that situation.
> > >> > First
> > >> > of all it requires changes to the Plugin API (without breaking
> > >> backwards
> > >> > compatibility) to have support out of the box.
> > >> >
> > >> > Robert
> > >> >
> > >> > >
> > >> > > Romain
> > >> > >
> > >> > >
> > >> > >
> > >> > > Le ven. 13 sept. 2019 à 23:18, Tibor Digana
> > >> <[hidden email]> a
> > >> > > écrit :
> > >> > >
> > >> > >> In theory, the incremental compiler would make it faster.
> > >> > >> But this can be told only if you present a demo project with has
> > >> trivial
> > >> > >> tests taking much less time to complete than the compiler.
> > >> > >>
> > >> > >> In reality the tests in huge projects take significantly longer
> > >> time
> > >> > >> than
> > >> > >> the compiler.
> > >> > >> Some developers say "switch off all the tests" in the release
> > >> phase but
> > >> > >> that's wrong because then the quality goes down and methodologies
> > >> are
> > >> > >> broken.
> > >> > >>
> > >> > >> I can see a big problem that we do not have an interface between
> > >> > >> Surefire
> > >> > >> and Compiler plugin negotiating which tests have been modified
> > >> including
> > >> > >> modules and classes in the entire structure.
> > >> > >>
> > >> > >> Having incremental compiler is easy, just use compiler:3.8.1 or
> > >> use the
> > >> > >> Takari compiler.
> > >> > >> But IMO the biggest benefit in performance would be after having
> > >> the
> > >> > >> truly
> > >> > >> incremental test executor.
> > >> > >>
> > >> > >> On Fri, Sep 13, 2019 at 10:46 PM Maximilian Novikov <
> > >> > >> [hidden email]> wrote:
> > >> > >>
> > >> > >> > Hi All,
> > >> > >> >
> > >> > >> >
> > >> > >> >
> > >> > >> > *We want to create upstream change to Maven* to support true
> > >> > >> incremental
> > >> > >> > build for big-sized projects.
> > >> > >> >
> > >> > >> > To raise a pull request we have to pass long chain of Deutsche
> > >> Bank’s
> > >> > >> > internal procedures. So, *before starting the process we would
> > >> like to
> > >> > >> > get your feedback regarding this feature*.
> > >> > >> >
> > >> > >> >
> > >> > >> >
> > >> > >> > *Motivation:*
> > >> > >> >
> > >> > >> >
> > >> > >> >
> > >> > >> > Our project is hosted in mono-repo and contains ~600 modules. All
> > >> > >> modules
> > >> > >> > has the same SNAPSHOT version.
> > >> > >> >
> > >> > >> > There are lot of test automation around this, everything is
> > >> tested
> > >> > >> before
> > >> > >> > merge into release branch.
> > >> > >> >
> > >> > >> >
> > >> > >> >
> > >> > >> > Current setup helps us to simplify build/release/dependency
> > >> management
> > >> > >> for
> > >> > >> > 10+ teams those contribute into codebase. We can release
> > >> everything in
> > >> > >> > 1-click.
> > >> > >> >
> > >> > >> > The major drawback of such approach is build time: *full local
> > >> build
> > >> > >> took
> > >> > >> > 45-60 min (*-T8)*, CI build ~25min(*-T16*)*.
> > >> > >> >
> > >> > >> >
> > >> > >> >
> > >> > >> > To speed-up our build we needed 2 features: incremental build and
> > >> > >> shared
> > >> > >> > cache.
> > >> > >> >
> > >> > >> > Initially we started to think about migration to Gradle or
> > >> Bazel. As
> > >> > >> > migration costs for the mentioned tools were too high, we
> > >> decided to
> > >> > >> add
> > >> > >> > similar functionality into Maven.
> > >> > >> >
> > >> > >> >
> > >> > >> >
> > >> > >> > Current results we get: *1-2 mins for local build(*-T8*)* if
> > >> build was
> > >> > >> > cached by CI*, CI build ~5 mins (*-T16*).*
> > >> > >> >
> > >> > >> >
> > >> > >> >
> > >> > >> > *Feature description:*
> > >> > >> >
> > >> > >> >
> > >> > >> >
> > >> > >> > The idea is to calculate checksum for inputs and save outputs in
> > >> > >> cache.
> > >> > >> >
> > >> > >> > [image: image2019-8-27_20-0-14.png]
> > >> > >> >
> > >> > >> > Each node checksum calculated with:
> > >> > >> >
> > >> > >> >
> > >> > >> >
> > >> > >> > ·         Effective POM hash
> > >> > >> >
> > >> > >> > ·         Sources hash
> > >> > >> >
> > >> > >> > ·         Dependencies hash (dependencies within multi-module
> > >> project)
> > >> > >> >
> > >> > >> >
> > >> > >> >
> > >> > >> > Project sources inputs are searched inside project + all paths
> > >> from
> > >> > >> > plugins configuration:
> > >> > >> >
> > >> > >> > [image: image2019-8-30_10-28-56.png]
> > >> > >> >
> > >> > >> > How does it work in practice:
> > >> > >> >
> > >> > >> >
> > >> > >> >
> > >> > >> > 1.       CI: runs builds and stores outputs in shared cache
> > >> > >> >
> > >> > >> > 2.       CI: reuse outputs for same inputs, so time is decreasing
> > >> > >> >
> > >> > >> > 3.       Locally: when I checkout branch and run ‘install’ for
> > >> whole
> > >> > >> > project, I get all actual snapshots from remote cache for this
> > >> branch
> > >> > >> >
> > >> > >> > 4.       Locally: if I change multiple modules in tree, only
> > >> changed
> > >> > >> > subtree is rebuilt
> > >> > >> >
> > >> > >> >
> > >> > >> >
> > >> > >> > Impact on current Maven codebase is very localized (MojoExecutor,
> > >> > >> where
> > >> > >> we
> > >> > >> > injected cache controller).
> > >> > >> >
> > >> > >> > Caching can be activated/deactivated by property, so current
> > >> maven
> > >> > >> flow
> > >> > >> > will work as is.
> > >> > >> >
> > >> > >> >
> > >> > >> >
> > >> > >> > And the big plus is that you don’t need to re-work your current
> > >> > >> project.
> > >> > >> > Caching should work out of box, just need to add config in .mvn
> > >> > >> folder.
> > >> > >> >
> > >> > >> >
> > >> > >> >
> > >> > >> > Please let us know what do you think. We are ready to invest in
> > >> this
> > >> > >> > feature and address any further feedback.
> > >> > >> >
> > >> > >> >
> > >> > >> >
> > >> > >> > Kind regards,
> > >> > >> >
> > >> > >> > Max
> > >> > >> >
> > >> > >> >
> > >> > >> >
> > >> > >> >
> > >> > >> > ---
> > >> > >> > This e-mail may contain confidential and/or privileged
> > >> information. If
> > >> > >> you
> > >> > >> > are not the intended recipient (or have received this e-mail in
> > >> error)
> > >> > >> > please notify the sender immediately and delete this e-mail. Any
> > >> > >> > unauthorized copying, disclosure or distribution of the
> > material
> > >> in
> > >> > >> this
> > >> > >> > e-mail is strictly forbidden.
> > >> > >> >
> > >> > >> > Please refer to https://www.db.com/disclosures for additional EU
> > >> > >> > corporate and regulatory disclosures and to
> > >> > >> > http://www.db.com/unitedkingdom/content/privacy.htm for
> > >> information
> > >> > >> about
> > >> > >> > privacy.
> > >> > >> >
> > >> >
> > >> > ---------------------------------------------------------------------
> > >> > To unsubscribe, e-mail: [hidden email]
> > >> > For additional commands, e-mail: [hidden email]
> > >> >
> > >> >
> > >>
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [hidden email]
> > > For additional commands, e-mail: [hidden email]
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [hidden email]
> > For additional commands, e-mail: [hidden email]
> >
> >
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: [VOTE] Maven incremental build for BIG-sized projects with local and remote caching

Alexander Ashitkin
In reply to this post by Alexander Ashitkin
Hi Robert
sounds like right direction, but just categorizing parameters is not enough.
1) You need to connect plugins into a chain, so you need to match outputs of multiple plugins as input for downstream plugins.
2) Input output is not enough. You need to know which parameters affect plugin behavoir and sometimes how (like threading doesnt affect tests result but exclude does). So parameter should have more metadata i guess

Thank you

On 2019/09/14 15:35:26, "Robert Scholte" <[hidden email]> wrote:

> https://issues.apache.org/jira/browse/MPLUGIN-350 is the issue to start  
> with.
>
> Please read all the comments, because my original thought won't work.
>
> thanks,
> Robert
>
> On Sat, 14 Sep 2019 17:10:13 +0200, Alexander Ashitkin  
> <[hidden email]> wrote:
>
> > We checked and price of 550$ per user makes us think twice of what's the  
> > best way to proceed here :-)
> > Regarding plugin api - yes, changes are desirable to make maven model  
> > cache-friendly. Both in plugin invocation model and Mojo#execute  
> > input/output apis. But it is possible to work with current model with  
> > declarative approach.
> >
> > Thanks in advance
> >
> > On 2019/09/14 10:45:24, Tibor Digana <[hidden email]> wrote:
> >> But I do not understand why the Maven should be responsible for the  
> >> project
> >> cahe control/management of "/target" directories.
> >> It is a responsibility of the build manager which is the Jenkins.
> >> The Jenkins has the ability to archive files and such property already
> >> exists in the Jenkins.
> >>
> >> So the Jenkins has a full knowledge about:
> >>
> >> 1. how long the workspace content retains intact
> >> 2. what commit hash is for the last build/job/branch
> >> 3. and what commit was successful
> >>
> >> If the target directories retain intact (or renewed from archive) in the
> >> workspace for very long time and the workspace was reused by the next  
> >> build
> >> then I would say that the improvement should work as it is on CI level.
> >>
> >> Maybe what is necessary is only that improvement in Maven where we would
> >> obtain the list of modules or directories of changes in the current  
> >> commit.
> >> Then the Maven can highly optimize its own build steps and build only  
> >> those
> >> modules which have been changed and their dependent modules.
> >> So the interface between CI and Maven is needed in a kind of extension  
> >> or
> >> the class MavenCli can be extended with some new entrypoint.
> >>
> >> But I do not hink that Maven has to take care of responsibilities of CI
> >> (project cache mgmt), that's not our task I would say and we as Maven  
> >> would
> >> never know all about the miscellaneous CI specifics and therefore we  
> >> would
> >> not cope with CI related troubles.
> >>
> >> Cheers
> >> Tibor17
> >>
> >>
> >>
> >> On Sat, Sep 14, 2019 at 11:08 AM Robert Scholte <[hidden email]>
> >> wrote:
> >>
> >> > On Fri, 13 Sep 2019 23:37:15 +0200, Romain Manni-Bucau
> >> > <[hidden email]> wrote:
> >> >
> >> > > There are multiple possible incremental support:
> >> > >
> >> > > 1. Scm related: do a status and rebuild downstream reactor
> >> > > 2. Full and module build graph: seems it is the one you target, ie  
> >> bypass
> >> > > modules without change. Note that it only works if upstream graph is
> >> > > taken
> >> > > into account.
> >> > > 3. Full build: each mojo has incremental support so the full build  
> >> gets
> >> > > it.
> >> > > Issue is that it requires each mojo to know if it needs to be  
> >> executed or
> >> > > give enough info to the mojo executor to do so (gradle requires all
> >> > > inputs/outputs to assume this state - which is still just an  
> >> heuristic
> >> > > and
> >> > > not 100% reliable).
> >> > >
> >> > > In current state, 2. sounds like a good option since 3 can require  
> >> a
> >> > > loot
> >> > > of work for external plugins (today's builds have a lot more of not  
> >> maven
> >> > > provide plugins than core plugins).
> >> > > Now, we should be able to activate it or not so having a  
> >> cacheLocation
> >> > > config in settings.xml can be good.
> >> > >
> >> > > Side notes:
> >> > >
> >> > > 1. having it on by default will break builds - reactor is  
> >> deterministic
> >> > > and
> >> > > bypassing a module can break a build since it can init maven  
> >> properties -
> >> > > for ex - for next modules
> >> > > 2. You cant find all in/out paths from the pom in general so your  
> >> algo is
> >> > > not generic, a meta config can be needed in .mvn
> >> > > 3. We should let a mojo be able to disable that to replace default  
> >> logic
> >> > > (surefire is a good example where it must be refined and it can save
> >> > > hours
> >> > > there ;))
> >> > > 4. Let's try to impl it as a mvn extension first then if it works  
> >> well on
> >> > > multiple big project get it to core?
> >> >
> >> > Did anyone Google for "maven extension build cache"? There are already
> >> > commercial solutions for it.
> >> > Even though I would like to see improvements in this area, the old
> >> > architecture of Maven makes it quite hard to move to that situation.
> >> > First
> >> > of all it requires changes to the Plugin API (without breaking  
> >> backwards
> >> > compatibility) to have support out of the box.
> >> >
> >> > Robert
> >> >
> >> > >
> >> > > Romain
> >> > >
> >> > >
> >> > >
> >> > > Le ven. 13 sept. 2019 à 23:18, Tibor Digana  
> >> <[hidden email]> a
> >> > > écrit :
> >> > >
> >> > >> In theory, the incremental compiler would make it faster.
> >> > >> But this can be told only if you present a demo project with has  
> >> trivial
> >> > >> tests taking much less time to complete than the compiler.
> >> > >>
> >> > >> In reality the tests in huge projects take significantly longer  
> >> time
> >> > >> than
> >> > >> the compiler.
> >> > >> Some developers say "switch off all the tests" in the release  
> >> phase but
> >> > >> that's wrong because then the quality goes down and methodologies  
> >> are
> >> > >> broken.
> >> > >>
> >> > >> I can see a big problem that we do not have an interface between
> >> > >> Surefire
> >> > >> and Compiler plugin negotiating which tests have been modified  
> >> including
> >> > >> modules and classes in the entire structure.
> >> > >>
> >> > >> Having incremental compiler is easy, just use compiler:3.8.1 or  
> >> use the
> >> > >> Takari compiler.
> >> > >> But IMO the biggest benefit in performance would be after having  
> >> the
> >> > >> truly
> >> > >> incremental test executor.
> >> > >>
> >> > >> On Fri, Sep 13, 2019 at 10:46 PM Maximilian Novikov <
> >> > >> [hidden email]> wrote:
> >> > >>
> >> > >> > Hi All,
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > *We want to create upstream change to Maven* to support true
> >> > >> incremental
> >> > >> > build for big-sized projects.
> >> > >> >
> >> > >> > To raise a pull request we have to pass long chain of Deutsche  
> >> Bank’s
> >> > >> > internal procedures. So, *before starting the process we would  
> >> like to
> >> > >> > get your feedback regarding this feature*.
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > *Motivation:*
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > Our project is hosted in mono-repo and contains ~600 modules. All
> >> > >> modules
> >> > >> > has the same SNAPSHOT version.
> >> > >> >
> >> > >> > There are lot of test automation around this, everything is  
> >> tested
> >> > >> before
> >> > >> > merge into release branch.
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > Current setup helps us to simplify build/release/dependency  
> >> management
> >> > >> for
> >> > >> > 10+ teams those contribute into codebase. We can release  
> >> everything in
> >> > >> > 1-click.
> >> > >> >
> >> > >> > The major drawback of such approach is build time: *full local  
> >> build
> >> > >> took
> >> > >> > 45-60 min (*-T8)*, CI build ~25min(*-T16*)*.
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > To speed-up our build we needed 2 features: incremental build and
> >> > >> shared
> >> > >> > cache.
> >> > >> >
> >> > >> > Initially we started to think about migration to Gradle or  
> >> Bazel. As
> >> > >> > migration costs for the mentioned tools were too high, we  
> >> decided to
> >> > >> add
> >> > >> > similar functionality into Maven.
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > Current results we get: *1-2 mins for local build(*-T8*)* if  
> >> build was
> >> > >> > cached by CI*, CI build ~5 mins (*-T16*).*
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > *Feature description:*
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > The idea is to calculate checksum for inputs and save outputs in
> >> > >> cache.
> >> > >> >
> >> > >> > [image: image2019-8-27_20-0-14.png]
> >> > >> >
> >> > >> > Each node checksum calculated with:
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > ·         Effective POM hash
> >> > >> >
> >> > >> > ·         Sources hash
> >> > >> >
> >> > >> > ·         Dependencies hash (dependencies within multi-module  
> >> project)
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > Project sources inputs are searched inside project + all paths  
> >> from
> >> > >> > plugins configuration:
> >> > >> >
> >> > >> > [image: image2019-8-30_10-28-56.png]
> >> > >> >
> >> > >> > How does it work in practice:
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > 1.       CI: runs builds and stores outputs in shared cache
> >> > >> >
> >> > >> > 2.       CI: reuse outputs for same inputs, so time is decreasing
> >> > >> >
> >> > >> > 3.       Locally: when I checkout branch and run ‘install’ for  
> >> whole
> >> > >> > project, I get all actual snapshots from remote cache for this  
> >> branch
> >> > >> >
> >> > >> > 4.       Locally: if I change multiple modules in tree, only  
> >> changed
> >> > >> > subtree is rebuilt
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > Impact on current Maven codebase is very localized (MojoExecutor,
> >> > >> where
> >> > >> we
> >> > >> > injected cache controller).
> >> > >> >
> >> > >> > Caching can be activated/deactivated by property, so current  
> >> maven
> >> > >> flow
> >> > >> > will work as is.
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > And the big plus is that you don’t need to re-work your current
> >> > >> project.
> >> > >> > Caching should work out of box, just need to add config in .mvn
> >> > >> folder.
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > Please let us know what do you think. We are ready to invest in  
> >> this
> >> > >> > feature and address any further feedback.
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > Kind regards,
> >> > >> >
> >> > >> > Max
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> >
> >> > >> > ---
> >> > >> > This e-mail may contain confidential and/or privileged  
> >> information. If
> >> > >> you
> >> > >> > are not the intended recipient (or have received this e-mail in  
> >> error)
> >> > >> > please notify the sender immediately and delete this e-mail. Any
> >> > >> > unauthorized copying, disclosure or distribution of the material  
> >> in
> >> > >> this
> >> > >> > e-mail is strictly forbidden.
> >> > >> >
> >> > >> > Please refer to https://www.db.com/disclosures for additional EU
> >> > >> > corporate and regulatory disclosures and to
> >> > >> > http://www.db.com/unitedkingdom/content/privacy.htm for  
> >> information
> >> > >> about
> >> > >> > privacy.
> >> > >> >
> >> >
> >> > ---------------------------------------------------------------------
> >> > To unsubscribe, e-mail: [hidden email]
> >> > For additional commands, e-mail: [hidden email]
> >> >
> >> >
> >>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [hidden email]
> > For additional commands, e-mail: [hidden email]
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: [VOTE] Maven incremental build for BIG-sized projects with local and remote caching

Martijn Dashorst
In reply to this post by Tibor Digana
This seems like it would benefit a lot of projects (at least it would ours).

How would this work in coordination with IDE's? m2e has (afaict, but
haven't looked closely) its own lifecycle management to bridge eclipse and
maven. AFIAK only Netbeans uses maven directly?

If you want to benchmark a public big repo, you can use Wicket Stuff Core (
https://github.com/wicketstuff/core). It has 237 modules, and the build
takes quite a while to compile and package. The project levels are not
deep, but there's some nesting.

Martijn


On Fri, Sep 13, 2019 at 10:46 PM Maximilian Novikov <
[hidden email]> wrote:

> Hi All,
>
>
>
> *We want to create upstream change to Maven* to support true incremental
> build for big-sized projects.
>
> To raise a pull request we have to pass long chain of Deutsche Bank’s
> internal procedures. So, *before starting the process we would like to
> get your feedback regarding this feature*.
>
>
>
> *Motivation:*
>
>
>
> Our project is hosted in mono-repo and contains ~600 modules. All modules
> has the same SNAPSHOT version.
>
> There are lot of test automation around this, everything is tested before
> merge into release branch.
>
>
>
> Current setup helps us to simplify build/release/dependency management for
> 10+ teams those contribute into codebase. We can release everything in
> 1-click.
>
> The major drawback of such approach is build time: *full local build took
> 45-60 min (*-T8)*, CI build ~25min(*-T16*)*.
>
>
>
> To speed-up our build we needed 2 features: incremental build and shared
> cache.
>
> Initially we started to think about migration to Gradle or Bazel. As
> migration costs for the mentioned tools were too high, we decided to add
> similar functionality into Maven.
>
>
>
> Current results we get: *1-2 mins for local build(*-T8*)* if build was
> cached by CI*, CI build ~5 mins (*-T16*).*
>
>
>
> *Feature description:*
>
>
>
> The idea is to calculate checksum for inputs and save outputs in cache.
>
> [image: image2019-8-27_20-0-14.png]
>
> Each node checksum calculated with:
>
>
>
> ·         Effective POM hash
>
> ·         Sources hash
>
> ·         Dependencies hash (dependencies within multi-module project)
>
>
>
> Project sources inputs are searched inside project + all paths from
> plugins configuration:
>
> [image: image2019-8-30_10-28-56.png]
>
> How does it work in practice:
>
>
>
> 1.       CI: runs builds and stores outputs in shared cache
>
> 2.       CI: reuse outputs for same inputs, so time is decreasing
>
> 3.       Locally: when I checkout branch and run ‘install’ for whole
> project, I get all actual snapshots from remote cache for this branch
>
> 4.       Locally: if I change multiple modules in tree, only changed
> subtree is rebuilt
>
>
>
> Impact on current Maven codebase is very localized (MojoExecutor, where we
> injected cache controller).
>
> Caching can be activated/deactivated by property, so current maven flow
> will work as is.
>
>
>
> And the big plus is that you don’t need to re-work your current project.
> Caching should work out of box, just need to add config in .mvn folder.
>
>
>
> Please let us know what do you think. We are ready to invest in this
> feature and address any further feedback.
>
>
>
> Kind regards,
>
> Max
>
>
>
>
> ---
> This e-mail may contain confidential and/or privileged information. If you
> are not the intended recipient (or have received this e-mail in error)
> please notify the sender immediately and delete this e-mail. Any
> unauthorized copying, disclosure or distribution of the material in this
> e-mail is strictly forbidden.
>
> Please refer to https://www.db.com/disclosures for additional EU
> corporate and regulatory disclosures and to
> http://www.db.com/unitedkingdom/content/privacy.htm for information about
> privacy.
>


--
Become a Wicket expert, learn from the best: http://wicketinaction.com
Reply | Threaded
Open this post in threaded view
|

Re: [VOTE] Maven incremental build for BIG-sized projects with local and remote caching

Martijn Dashorst
On Thu, Sep 19, 2019 at 7:48 AM Alexander Ashitkin
<[hidden email]> wrote:

> Configuration:
> * verify -T4 -P default,all-shapshots-repos
> * my project config (might be suboptimal for wicket)
> * scala tests disabled in 2 modules (caused bytecode version conflict on my machine)
>
> Results
> Clean state (cache disabled):                           15:58 min
> Second run, target up to date (cache disabled):      10:20 min
> Fully cached (no changes):                                      17.507 s
> wicketstuff-jwicket-tooltip-wtooltips changed:          34.936 s
> wicketstuff-rest-utils changed:                                 54.040 s
>
> If you want to try other modules - please let me know.

Nice results!

> regarding ide - it's a usual maven installation, so any ide with maven integration should benefit from cache them maven action invoked

My instinct says that an IDE as Eclipse won't benefit much from it, as
it has its own build lifecycle. Only when you invoke a commandline
Maven action (such as generate-sources) one might have a benefit.

So in the day-to-day life the caching might not be as beneficial for
developers, but commandline builds happen often enough to make this
matter.

Martijn

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: [VOTE] Maven incremental build for BIG-sized projects with local and remote caching

Alexander Ashitkin
Hi Martijn
thanks for positive feedback.

Regarding IDE part, yes you're right on integration part, but still there important cases when cache helps:
1) you need to navigate less in project as top level targets fast enough to not drill down
2) if you need to build a part of project (say only rest of wicket) you need to provide up-to-date rest dependencies which are not active in the subproject - and caches restores missing pieces for you without rebuilding remaining part of the project
3) If you need to test project and invoke test - cache saves your time (as gradle does) on unchanged pieces
4) and because tests run faster you can try run slow tests which often too expensive in rapid development

So maven integration in Intellij works nice. There is nothing super smart here, just sharing how i benefit from the cache in everyday ide work

Thank you!

On 2019/09/19 11:28:48, Martijn Dashorst <[hidden email]> wrote:

> On Thu, Sep 19, 2019 at 7:48 AM Alexander Ashitkin
> <[hidden email]> wrote:
> > Configuration:
> > * verify -T4 -P default,all-shapshots-repos
> > * my project config (might be suboptimal for wicket)
> > * scala tests disabled in 2 modules (caused bytecode version conflict on my machine)
> >
> > Results
> > Clean state (cache disabled):                           15:58 min
> > Second run, target up to date (cache disabled):      10:20 min
> > Fully cached (no changes):                                      17.507 s
> > wicketstuff-jwicket-tooltip-wtooltips changed:          34.936 s
> > wicketstuff-rest-utils changed:                                 54.040 s
> >
> > If you want to try other modules - please let me know.
>
> Nice results!
>
> > regarding ide - it's a usual maven installation, so any ide with maven integration should benefit from cache them maven action invoked
>
> My instinct says that an IDE as Eclipse won't benefit much from it, as
> it has its own build lifecycle. Only when you invoke a commandline
> Maven action (such as generate-sources) one might have a benefit.
>
> So in the day-to-day life the caching might not be as beneficial for
> developers, but commandline builds happen often enough to make this
> matter.
>
> Martijn
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: [VOTE] Maven incremental build for BIG-sized projects with local and remote caching

Alexander Bubenchikov-2
In reply to this post by Martijn Dashorst
Hi Alexander and Maximilian. As a former Deutsche Bank RTC employee, I
cannot bypass this topic.

First of all, I'm not speaking for community, neither Jetbrains.
I know how painfull is to get all approvals for open-source contribution in
Deutsche Bank, but may be you can share you solution as a maven extension
first?
May be I've missed link to github, but discussion looks strange for me - we
are discussing pros and cons of solution, which is not public yet.

>so any ide with maven integration should benefit from cache them maven
action invoked
AFAIK, m2e use its own lifecycle (please, correct me, if I'm wrong). Not
sure, how this change will affect it's performance.

But IDEA executes maven tasks (actually, in a quite hacky-way) for
resolving dependencies, source folders, artifacts, etc.  Compiler plugin is
not being runned usually by IDEA

Compilation and tests runs of imported maven projects are performed by IDEA
itself, and IDEA does not use maven compilation results when run tests. No
maven code and maven extensions are used after importing, so for IDEA this
change should be irrelevant, as I got it (the only exception  case is if
you use "delegate maven" option, but this is a point of another discussion)

Thanks, Alex.



On Thu, Sep 19, 2019 at 8:48 AM Alexander Ashitkin <[hidden email]>
wrote:

> Sorry if duplicated, looks like my yesterday reply didn't come through.
> Sharing results.
>
> Configuration:
> * verify -T4 -P default,all-shapshots-repos
> * my project config (might be suboptimal for wicket)
> * scala tests disabled in 2 modules (caused bytecode version conflict on
> my machine)
>
> Results
> Clean state (cache disabled):                           15:58 min
> Second run, target up to date (cache disabled):      10:20 min
> Fully cached (no changes):                                      17.507 s
> wicketstuff-jwicket-tooltip-wtooltips changed:          34.936 s
> wicketstuff-rest-utils changed:                                 54.040 s
>
>
> For wicketstuff-jwicket-tooltip-wtooltips i didnt check invalidated
> modules, for wicketstuff-rest-utils
>  [wicketstuff-rest-lambda, wicketstuff-restannotations,
> wicketstuff-restannotations-json, wicketstuff-restannotations-examples]
> were invalidated and rebuilt
>
> If you want to try other modules - please let me know.
>
> regarding ide - it's a usual maven installation, so any ide with maven
> integration should benefit from cache them maven action invoked
>
> Thank you
> Aleks
>
>
> On 2019/09/17 12:29:11, Martijn Dashorst <[hidden email]>
> wrote:
> > This seems like it would benefit a lot of projects (at least it would
> ours).
> >
> > How would this work in coordination with IDE's? m2e has (afaict, but
> > haven't looked closely) its own lifecycle management to bridge eclipse
> and
> > maven. AFIAK only Netbeans uses maven directly?
> >
> > If you want to benchmark a public big repo, you can use Wicket Stuff
> Core (
> > https://github.com/wicketstuff/core). It has 237 modules, and the build
> > takes quite a while to compile and package. The project levels are not
> > deep, but there's some nesting.
> >
> > Martijn
> >
> >
> > On Fri, Sep 13, 2019 at 10:46 PM Maximilian Novikov <
> > [hidden email]> wrote:
> >
> > > Hi All,
> > >
> > >
> > >
> > > *We want to create upstream change to Maven* to support true
> incremental
> > > build for big-sized projects.
> > >
> > > To raise a pull request we have to pass long chain of Deutsche Bank’s
> > > internal procedures. So, *before starting the process we would like to
> > > get your feedback regarding this feature*.
> > >
> > >
> > >
> > > *Motivation:*
> > >
> > >
> > >
> > > Our project is hosted in mono-repo and contains ~600 modules. All
> modules
> > > has the same SNAPSHOT version.
> > >
> > > There are lot of test automation around this, everything is tested
> before
> > > merge into release branch.
> > >
> > >
> > >
> > > Current setup helps us to simplify build/release/dependency management
> for
> > > 10+ teams those contribute into codebase. We can release everything in
> > > 1-click.
> > >
> > > The major drawback of such approach is build time: *full local build
> took
> > > 45-60 min (*-T8)*, CI build ~25min(*-T16*)*.
> > >
> > >
> > >
> > > To speed-up our build we needed 2 features: incremental build and
> shared
> > > cache.
> > >
> > > Initially we started to think about migration to Gradle or Bazel. As
> > > migration costs for the mentioned tools were too high, we decided to
> add
> > > similar functionality into Maven.
> > >
> > >
> > >
> > > Current results we get: *1-2 mins for local build(*-T8*)* if build was
> > > cached by CI*, CI build ~5 mins (*-T16*).*
> > >
> > >
> > >
> > > *Feature description:*
> > >
> > >
> > >
> > > The idea is to calculate checksum for inputs and save outputs in cache.
> > >
> > > [image: image2019-8-27_20-0-14.png]
> > >
> > > Each node checksum calculated with:
> > >
> > >
> > >
> > > ·         Effective POM hash
> > >
> > > ·         Sources hash
> > >
> > > ·         Dependencies hash (dependencies within multi-module project)
> > >
> > >
> > >
> > > Project sources inputs are searched inside project + all paths from
> > > plugins configuration:
> > >
> > > [image: image2019-8-30_10-28-56.png]
> > >
> > > How does it work in practice:
> > >
> > >
> > >
> > > 1.       CI: runs builds and stores outputs in shared cache
> > >
> > > 2.       CI: reuse outputs for same inputs, so time is decreasing
> > >
> > > 3.       Locally: when I checkout branch and run ‘install’ for whole
> > > project, I get all actual snapshots from remote cache for this branch
> > >
> > > 4.       Locally: if I change multiple modules in tree, only changed
> > > subtree is rebuilt
> > >
> > >
> > >
> > > Impact on current Maven codebase is very localized (MojoExecutor,
> where we
> > > injected cache controller).
> > >
> > > Caching can be activated/deactivated by property, so current maven flow
> > > will work as is.
> > >
> > >
> > >
> > > And the big plus is that you don’t need to re-work your current
> project.
> > > Caching should work out of box, just need to add config in .mvn folder.
> > >
> > >
> > >
> > > Please let us know what do you think. We are ready to invest in this
> > > feature and address any further feedback.
> > >
> > >
> > >
> > > Kind regards,
> > >
> > > Max
> > >
> > >
> > >
> > >
> > > ---
> > > This e-mail may contain confidential and/or privileged information. If
> you
> > > are not the intended recipient (or have received this e-mail in error)
> > > please notify the sender immediately and delete this e-mail. Any
> > > unauthorized copying, disclosure or distribution of the material in
> this
> > > e-mail is strictly forbidden.
> > >
> > > Please refer to https://www.db.com/disclosures for additional EU
> > > corporate and regulatory disclosures and to
> > > http://www.db.com/unitedkingdom/content/privacy.htm for information
> about
> > > privacy.
> > >
> >
> >
> > --
> > Become a Wicket expert, learn from the best: http://wicketinaction.com
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>
>

--
Alexander Bubenchikov
Software developer
JetBrains
http://www.jetbrains.com
The Drive to Develop