I just found an outstanding configuration element inside of cruise control which allows you to setup multiple projects to run in a queued environment. Basically it functions as a mutex so that while one project is building all other projects go into a queue until the first project is completed, and then another one is given control. The configuration element is really easy, here's our ccnet.config...
<cruisecontrol>
<project name="Source Control" queue="ReleaseBuild">
<workingDirectory>C:\Projects\dvt-root</workingDirectory>
<triggers>
<intervalTrigger seconds="180" />
</triggers>
<modificationDelaySeconds>10</modificationDelaySeconds>
<sourcecontrol type="vault" autoGetSource="true" applyLabel="false">
<executable>c:\program files\sourcegear\vault client\vault.exe</executable>
<username>BuildUserName</username>
<password>BuildPassword</password>
<host>myDevtServer</host>
<repository>Evolution</repository>
<folder>$/Dvt-Root</folder>
<useWorkingDirectory>false</useWorkingDirectory>
<ssl>False</ssl>
<setFileTime>current</setFileTime>
</sourcecontrol>
</project>
<project name="Release Esenaar" queue="ReleaseBuild">
<workingDirectory>C:\Projects\dvt-root</workingDirectory>
<triggers>
<intervalTrigger seconds="180" />
</triggers>
<tasks>
<nant>
<baseDirectory></baseDirectory>
<buildArgs>-D:debug=False</buildArgs>
<buildFile>Release.Esenaar.Build</buildFile>
<buildTimeoutSeconds>1200</buildTimeoutSeconds>
<targetList>
<target>build</target>
</targetList>
</nant>
</tasks>
</project>
<project name="Release Duvel" queue="ReleaseBuild">
<workingDirectory>C:\Projects\dvt-root</workingDirectory>
<triggers>
<intervalTrigger seconds="180" />
</triggers>
<tasks>
<nant>
<baseDirectory></baseDirectory>
<buildArgs>-D:debug=False</buildArgs>
<buildFile>Release.Duvel.Build</buildFile>
<buildTimeoutSeconds>1200</buildTimeoutSeconds>
<targetList>
<target>build</target>
</targetList>
</nant>
</tasks>
</project>
</cruisecontrol>
The first "project", called "Source Control" is actually responsible for downloading all our code from SourceGear Vault. You can see that every 180 seconds it downloads the source code from vault to a local folder called C:\Projects\dvt-root.
The second and third projects, called "Duvel" and "Esenaar" (maintenance release names), actually call out to our nant script and compile the appropriate release.
Now, our primary goal with all this is to make sure that we don't pull down source code while we're compiling a release (and vice versa) and that's where the queue property on the project comes into play. By setting the queue on all three projects to be the same thing, cruise control will not allow two projects to execute at the same time!
http://confluence.public.thoughtworks.org/display/CCNET/Project+Configuration+Block