Question

Is there any CI server (CruiseControl, Jenkins, Hudson, ...) that supports a proper DAG (Direct Acyclical Graph) of dependencies between projects? That is:

Suppose you have a common library project A, two utility library projects B and C which both use A, but are independent of each other, and a program project D which uses both B and C. In CruiseControl.rb (which I am currently using), it is trivial to specify that B depends on A, C depends on A, and D depends on both B and C.

If someone commits into either B or C, then CC.rb will build it, and then build D, as expected. But if someone commits into A, CC.rb will build A, then build both B and C in parallel - so far, so good. However, assume that B finishes building first; at this point, CC.rb will eagerly go and start building D, which will most likely fail, and is a waste of time anyway, because when C finishes building CC.rb will go and build D a second time (which is the build we actually want).

I understand this behavior isn't specific to CC.rb; it seems inherent if the CI server considers the dependencies for only one project at a time. What I'm looking for is a CI server that is smart enough to figure that D depends on both B and C, and hold off building it until both finish building with the same version of A. Or, in other words, a CI server that works similarly to what "make -j" would have done, if each project was a single make action.

Is there such a beast?

Was it helpful?

Solution

At least in Jenkins, jobs (or projects if you want to call them that) can trigger other jobs in various ways even out-of-the-box, and especially with plugins. Apparently relevant here, it's possible to "join" builds of different jobs, so that after two different jobs are complete, then third job gets triggered

I think you can quite easily build the system you describe with Jenkins (and also Hudson, not much difference yet).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top