Over a million developers have joined DZone.

One Weird Trick for Fast Continuous Integration

CI for most systems requires a clean operation before a new build; Bazel's design lets it skip CI tasks it doesn't need to save time and improve performance.

· DevOps Zone

Discover how to optimize your DevOps workflows with our cloud-based automated testing infrastructure, brought to you in partnership with Sauce Labs

Compilers hate this! (Just kidding, compilers are easy-going.)

For many build systems, you have to do a clean build to be sure you’re getting the correct result, so your CI has to always do a clean build. On the other hand, Bazel is designed so that you never have to do a bazel clean (if you ever run bazel clean and get a different answer, please file a bug!).

Thus, to cater to most build tools, CI systems generally run a loop like this:

However, for Bazel, doing a clean build every time wastes a lot of time and resources. For Bazel, the continuous integration system should look like this:

Of course, most build systems actually make this a bit difficult to set up, as you wouldn’t want this kind of configuration for a non-Bazel continuous build! However, Jenkins lets you set it up fairly simply. I’ll go through setting up a Jenkins instance that will build a local codebase every 5 minutes.

First, I’ll make my “source directory:”

$ mkdir jenkins-workspace
$ cd jenkins-workspace
$ touch WORKSPACE

I’m on OS X, so I installed the Jenkins pkg. When it is done installing, it pops up a web page prompts you to create your first job.

Click on the link and put in a name and select “Freestyle Build”, then hit “OK”.

On the next page, select “Advanced”. Select “Use custom workspace” and put in the directory from above:

Set it up to run every 5 minutes:

Screen Shot 2015-10-08 at 2.06.17 PM

Now add the following command as the build step:

This will build all targets in your workspace and then run all tests (so it will find any compile errors as well as test failures). //tools and //third_party contain a bunch of targets that won’t build out-of-the-box, so they’re filtered out using the -//target syntax (see the “Subtractive Patterns” section under Target Patterns).

Note that you don’t have to do any cleanup after the build, since Bazel never pollutes your source directory with build artifacts. You just want to pull, build, pull, build.

Now hit the “Save” button. It’ll take you back to your dashboard and begin the countdown to the first build. Click on the play button in the rightmost column to test it out (or just wait five minutes).

If you make changes, Jenkins will just build/test those changes:

If you haven’t made any changes, Bazel won’t have to do any work at all:

This can be a huge time saver for large projects.

Download “The DevOps Journey - From Waterfall to Continuous Delivery” to learn learn about the importance of integrating automated testing into the DevOps workflow, brought to you in partnership with Sauce Labs.

Topics:
continuous integration ,bazel ,jenkins

Published at DZone with permission of Kristina Chodorow, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

The best of DZone straight to your inbox.

SEE AN EXAMPLE
Please provide a valid email address.

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.
Subscribe

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}