Distributed Continuous Integration Build

For about eighteen months I have chewed on an idea for something I call Distributed Continuous Integration Build. The idea has had to stew behind other priorities - like the birth of my fourth child.

I think the time has come to develop this idea - so for starters I will summarize the concept. As I build the various pieces I will write about them. Hopefully I can elicit feedback from readers and make the solution even better.

The basic idea came to me after seeing a developer stuck in a build-break cycle. On this project we have more tests than you can imagine - and while they run extremely fast - it can feel not fast enough when every minute counts. Often, myself included, developers commit changes without running all tests. They know the CI build will run all tests, so they wait to see the build break.

The issue with this approach is that other developers on the team are then forced to determine whether their changes have broken the build. Ultimately it slows the team down - while giving the false impression to the real breakee that they are moving fast.

(Aside: I cling to no religions. I am not saying never break the build. Do what you have to do to build software...that's what we're being paid for.)

So the idea that came to me is simple (I think): bring the CI build local to the developer and only commit if their local CI build passes. The details are as follows:

  • Run a CI server locally (e.g., CruiseControl). This can be on same or separate machine.
  • Run svnsync.
  • Work out of your local repository mirror.
  • Only replicate if CI build succeeds.

Yes, I know: there are a lot of obstacles to get over. And that will be the fun part.

Stay tuned.