avatarBrandon Anderson

Free AI web copilot to create summaries, insights and extended knowledge, download it at here

4709

Abstract

de> command with parallelism.</p><h2 id="9570">Benchmarks</h2><p id="dc98">Benchmarks conducted on four different repositories revealed that a hot mvnd execution, where the daemon is already running, can accelerate builds by up to 50% of builds that do not run tests or static analysis as this is the most common use-case among developers in our organization.</p><figure id="442c"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/0*xot8KoV94usih-4e"><figcaption></figcaption></figure><h2 id="77be">Local vs CI server</h2><p id="ac6e">Using Maven Daemon significantly sped up our local builds, making our engineers’ daily iterations faster and more efficient. However, this solution wasn’t suitable for our CI environment with TeamCity. Since we don’t reuse TeamCity, there was no benefit to starting a daemon process in this context.</p><p id="3916">In response to this limitation, we will be exploring the possibility of reusing agents and investigating potential improvements in a different initiative to better optimize our CI environment.</p><h2 id="c57d">Adoption</h2><p id="8fb7">To ensure every Java team at Picnic could benefit from the increased speed of local builds using Maven Daemon, we created a comprehensive knowledge article outlining the steps and best practices. By sharing this detailed knowledge article, we ensured that all developers in our organization could easily adopt and benefit from using Maven Daemon, leading to faster build times and improved productivity.</p><p id="436d">Currently, we don’t have visibility in the adoption rate here, but we are looking into using OpenTelemetry Maven extensions to get more insights into this to better track and advocate</p><h1 id="aceb">Maven Build Cache</h1><p id="6a2a">One of the best ways to speed up builds is to do less. And the best way to do less is to eliminate duplicate or unnecessary work. Why should we want to rebuild and retest all modules in our project if I change a single test, or a small if-statement in a module no other module depends on? We can use a build cache to only execute Maven goals for modules that changed and modules that depend on these changes.</p><h2 id="f90a">How does it work</h2><p id="5cdc">The Maven Build Cache extension enhances the efficiency of large Maven projects by implementing the following set of features:</p><ol><li><b>Incremental Builds</b>: Only the modified parts of the project graph are rebuilt.</li><li><b>Subtree Support</b>: Allows isolated builds of specific parts in multi-module projects.</li><li><b>Version Normalization</b>: Facilitates version-agnostic caching.</li><li><b>Project State Restoration</b>: Avoids repeating expensive tasks like code generation by restoring previous states from the cache.</li></ol><figure id="5b07"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/0*ehx_WSQV_zw9e68p"><figcaption>The diagram shows that changes in a module (Module 2) lead to it and its dependents (Module 3) being rebuilt, while unchanged modules (Module 1 and Module 4) are retrieved from the cache.</figcaption></figure><h2 id="28f6">Local Build Cache</h2><p id="2678">When working locally, the Maven Build Cache stores the build output artifacts in a designated local cache directory. Here’s a step-by-step breakdown of how it operates:</p><ol><li><b>Initial Build:

  • </b>During the first build, Maven compiles the entire project as usual.
  • For each module, the build cache extension computes a unique hash based on the module’s inputs (source files, Maven configuration, dependencies, etc.).
  • The build outputs (e.g., compiled classes, packaged artifacts) are stored in the local cache directory with the computed key.</li><li><b>Subsequent Builds:
  • </b>Before building a module, Maven checks the local cache directory to see if there is a cached result for the module’s hash.
  • If a match is found, the cached outputs are restored, and Maven goals executed when the cache was constructed are now skipped.
  • If no match is found, Maven rebuilds the module, and the new outputs are cached for future use.</li><li><b>Cache Management:
  • </b>The local cache can be configured to limit its size and manage the retention of cached artifacts.
  • Policies can be defined to periodically clean up old or infrequently used cache entries, ensuring the cache directory remains manageable.</li><li><b>Key Generation:
  • </b>The unique key for each module is generated by hashing the module’s inputs. This includes source code files, project model (POM file), plugin configurations and parameters, and dependency versions and configurations.
  • By including all relevant inputs in the key, the build cache ensures that any change in the inputs results i

Options

n a new key, prompting a rebuild.</li></ol><p id="4903">The build cache uses hashing to generate unique keys for storing and restoring build results. Correctness is maximized by including all relevant files and functional plugin parameters, while reuse is enhanced by filtering non-essential files and minimizing controlled plugin parameters. Configuration involves balancing correctness and performance through an XML file, <code>buildinfo.xml</code>.</p><h2 id="88d2">Usage in CI</h2><p id="6966">In our CI process, we also leverage the Maven Build Cache solution to accelerate our CI builds. However, for CI, we employ <a href="https://maven.apache.org/extensions/maven-build-cache-extension/remote-cache.html">a remote cache</a> stored in an artifactory instead of using a local directory. In our case, cached artifacts are stored in Nexus. This approach has markedly increased the speed of our Java builds. Consequently, our builds finish sooner and build queues are shorter.</p><p id="d0a3">However, in certain situations, users need to perform a full build of their changes. To accommodate this, we introduced a TeamCity parameter called “Use Maven build cache” with the following options:</p><ul><li><code>true</code>: the cache is used</li><li><code>false</code>: the cache is not used</li><li><code>default</code>: the repository-level setting is applied</li></ul><figure id="51f5"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*cjBQGpXtPyo_8MeafHw1TA.png"><figcaption></figcaption></figure><p id="76d0">It is good to note that we currently employ the cache only for builds that do not create production artifacts, as we wish to have these as ‘pure’ as possible. As such, we disable the cache for builds on default branches supporting continuous deployments, and in release builds.</p><h2 id="1253">Benchmarks</h2><p id="12d5">In the best-case scenario, the execution time of CI builds dropped by ~ 90% when execution of every module was skipped, this is how it was shown in the build logs:</p><div id="bdae"><pre>[INFO] Skipping plugin execution (cached): <span class="hljs-keyword">install</span>:<span class="hljs-keyword">install</span></pre></div><p id="72cd">Instead of 10 minutes 4 seconds, the build that was fully cached took only 1 minute 22 seconds. 😲</p><p id="fb1e">Of course, this is quite a rare case to run a build that has every module skipped. The average build time improvement across all Java repositories in Picnic is shown in the picture below. It is noticeable that build time dropped by 62% in general.</p><figure id="3fd7"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*m9KcQpIhbc66wTHDIvttPQ.jpeg"><figcaption></figcaption></figure><p id="97f1">For some repositories, the build time improvement was more noticeable than for others. Projects with many modules benefit more than projects with only a few modules. This can be seen in the chart below showing P75 build times. Highly modular projects see their build times drop from 10 to 5 minutes. Projects with a few modules only benefit little from this improvement.</p><figure id="8e53"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/0*Qp8AmIXK7M0xzbuc"><figcaption></figcaption></figure><h1 id="d1eb">Conclusion</h1><ol><li><b>Dramatic Build Time Reduction:

  • </b>Build times dropped from 12 minutes to 8 minutes in general. This significant improvement eliminates long waits, allowing developers to maintain focus and productivity.</li><li><b>Enhanced Developer Experience:
  • </b>Faster build times, especially for local builds, lead to fewer interruptions, enabling developers to stay in the zone and work more efficiently. This improvement has contributed to higher job satisfaction and overall happiness among our teams.</li><li><b>Increased Efficiency in CI Pipelines:
  • </b>Using the Maven Build Cache in our CI environment has sped up CI builds, reduced queue times, and made TeamCity agents available more quickly.</li></ol><p id="46a2">These improvements have significantly boosted developer morale and productivity. Reduced build times mean less context switching, quicker feedback, and a more enjoyable workflow.</p><p id="316d">Developers feel more empowered and efficient, resulting in higher-quality code and faster feature implementation.</p><p id="90d2">In summary, the integration of the Maven Build Cache extension and Maven Daemon has transformed our build process, making it faster and more efficient. We are excited to continue leveraging these tools to maintain and further improve our build processes, ensuring our developers have the best possible experience.</p><p id="0bd6">In collaboration with <b>Pieter Dirk Soels</b></p></article></body>

NFL week 9 picks against the spread

Why the Eagles, Saints, and Raiders are best bets in a week of awful football

It’s been a weird NFL season. The Los Angeles Rams have the best offense in the league, and the Jacksonville Jaguars have the best defense. The Ravens, Titans, and Dolphins are all at least .500 and fighting for the AFC playoffs despite being objectively terrible. The best teams in the NFL are Andy Reid’s former team and his current one. Heck, this week alone the Bills, Rams, and Lions are road favorites!!

This could be a particularly ugly week of football with three 6–2 division leaders watching from home on bye and a lot of bad games on the slate. Every prime-time match-up is terrible, and this is probably a good time for you to take an NFL bye week of your own. Let’s get to the picks?

The Stay Aways

Buffalo -3 at New York Jets (Thursday)

This is the first of three awful prime-time games this week, so find something else to do with your Thursday night. The Bills beat New York by nine in the opener and have won six of the last eight matchups. Buffalo can almost taste the playoffs, and the team has to be galvanized by ownership coughing up a couple draft picks to get Kelvin Benjamin and try to make a run.

Green Bay +2.5 vs Detroit (Monday)

On the one hand, Aaron Rodgers is out. On the other hand, Detroit has won exactly one of its last 23 games at Lambeau. Brett Hundley had a week to get integrated into the offense, and the Packers just ain’t losing to the Lions on a Monday night in Green Bay.

Tennessee -3 vs Baltimore

Joe Flacco is questionable. As in, questionable if he’ll be healthy enough to play, and questionable if it’ll even matter for a quarterback whose season average is 180 yards per game. Baltimore has four wins against Cincinnati, Cleveland, Oakland, and Miami — the latter two with backup quarterbacks. The Titans had a bye week to get healthy and should roll as long as they don’t make many mistakes against this defense.

San Francisco +2 vs Arizona

Drew Stanton! C.J. Beathard! It’s the NFL on FOX! San Francisco is one of the better 0–8 teams in NFL history, for whatever that’s worth. They get home games against the Cardinals and Giants the next two weeks, so this is their chance to ditch the goose egg.

BYE -3.5 vs Cleveland

The Browns have lost three times by a field goal, so that half-point hook could really get us, but it’s just hard to see them finding the right quarterback to pull this one off.

The Rams, Jaguars, and Texans are Good Now?

Los Angeles Rams -3.5 at New York Giants

The Giants are 1–6 and play worse at home. The Rams are 5–2 and have scored 27 or more in all but one game. It feels like Vegas still hasn’t caught up to the Rams being good and Giants being terrible. West coast teams traveling east tend to struggle, but the Rams should be fine coming off their bye.

Jacksonville -4.5 vs Cincinnati

The mighty Bengals offense has scored eight touchdowns in six games against not-the-Browns. This Jacksonville defense is for real, and they should pound a Cincinnati team that’s struggled to score all season. How far can the Jaguars really get with a top three defense, a rookie running back, and no quarterback to speak of? Looks like we might find out.

Houston -12.5 vs Indianapolis

The Colts have won twice, but those wins are against teams that are 0–16 combined. Indianapolis also has four losses by 14 or more points, and they’re rotting from the inside with internal strife and a team that seems to have quit on each other. Deshaun Watson has 17 touchdowns in his past four games, and there’s no reason to think he’s going to slow down now. Update: Deshaun Watson is out for the season and everything is broken and wrong. Houston didn’t even get to celebrate sports for 24 hours. Tom Savage is awful. However far the line drops for this won’t be far enough. Take Indy.

Hey Look, Three Decent Games!!

Carolina -1.5 vs Atlanta

This is a toss-up between the last two Super Bowl losers, neither of which has really been the same since their big defeat. Atlanta’s offense has yet to click this season, and Carolina’s locker room seems interesting with plenty of grumblings after the Kelvin Benjamin trade. Still, the Panthers defense is really good. They haven’t allowed a touchdown in four of eight games this season, and that might be enough.

Kansas City +2.5 at Dallas

Vegas continues to underrate the Chiefs, a team that has only two losses, one to Pittsburgh and the other on the final play in Oakland. The four Cowboys wins are against the Giants, Cards, 49ers, and Skins. Are we sure they’re good, especially without the centerpiece of their offense? It looks like Ezekiel Elliott is finally actually suspended for six games, and the timing of this may hurt more than his fantasy owners. Dallas’s upcoming stretch includes games against all three division opponents along with the Chargers, Falcons, and Chiefs. Maybe Zeke should’ve sat earlier.

Washington +8.5 at Seattle

The Seahawks have won four in a row while averaging 32 points per game, but now that the offense has finally gotten rolling, the defense has fallen behind. Seattle blew out the Giants and Colts, but all their other games have been one-score affairs. Washington’s four losses are to the Chiefs, Cowboys, and Eagles (x2). It just doesn’t feel like these teams are a touchdown apart.

Week 9 Best Bets

Philadelphia -8 vs Denver

Carson Wentz and the Eagles are sure to slow down at some point and Denver will remember how to score eventually, but we’ll wait until both teams prove otherwise. Denver is averaging 12 points per game over their last five and now they’re turning to Brock Osweiler, a solution that has never worked in the history of mankind. The Eagles have scored at least 26 in all but one game, and Denver’s stellar defense has been against the run and not the pass this year. It’s tough to see the Broncos keeping up.

New Orleans -7 vs Tampa Bay

This does feel a little trappy for the Saints considering the series history, with the last six games decided by one score. But the Bucs have been bad, and they’re even worse in the first half with just 13 points in their last four first halves combined. The Saints have won five in a row, all of them by more than seven. They always score at home, and if the Bucs fall behind early again, it’s just a question of whether they can come back through the backdoor.

Oakland -3 at Miami

The Dolphins must be one of the worst over-.500-mid-season teams in history. They’ve lost only three times but all three were shutouts, outside of a final meaningless play against the Jets. That is some sort of awful, and now they’re rushing Jay Cutler back for a home prime-time game, and when has that ever gone wrong before? This is actually the second of three straight prime-time games for Miami, proving once again that Roger Goodell hates America.

Week 8 record: 8–5 Season record: 56–60–4 Best bets: 14–10 Locks: 1–0

Follow Brandon on Medium or @wheatonbrando for more sports, humor, pop culture, and life musings. Visit the rest of Brandon’s writing archives here.

NFL
Sports
Football
Culture
Gambling
Recommended from ReadMedium