In our .NET software development shop, we have CruiseControl.NET set up to build 28 projects, some of which are interdependent. Each project approximately represents a Visual Studio projects or Flex library paired with unit tests. What I'm annoyed at is that I haven't found a good way to ensure that projects build in an order representing the dependencies.
Here's what I am doing:
- Everything is in the same build queue. I did this so that builds are done sequentially and so I can avoid needing multiple working directories.
- I set queue priorities on the projects, which I thought would influence their build order. But after reading the documentation more carefully, I found that it just controls prioritization when there are multiple build requests in a queue.
- In addition to using interval triggers to kick off a build, I use project triggers so that when dependencies successfully build, their dependents also build.
In a way, this setup works. The main problem is if somebody commits changes to the code in both project A and project B, where project B is dependent on project A. Sometimes, project B will build before project A. Because project A hasn't been build yet, this can sometimes cause project B to break. This is temporary, since the interval trigger causes project A to build later on, and its successful build triggers project B to rebuild and get fixed. What I want to avoid is project B building before project A so that intermediate breakage cannot happen.
Which practices do you use to properly manage interdependencies on a CruiseControl.NET server? At this point, I'm not willing to change to a non-free continuous integration package like TeamCity.