So how did we get here? Did we hire incompetence? Did we have issues making decisions? No; not at all. This is more of a symptom of sprawling software development. You start out with your software specification; this is in essence like the foundation of a house. Processes are set in place and development begins. Eventually the house is built, but development is still on-going as the product's potential is realized. And so the house grows to the point of exceeding the limits of the foundations. But not to worry; foundations can be changed, and expanded upon.
Enter Maven2 Project Management system, Hudson Continuous Integration Build System, Archiva Build Artifact management. The process was completely rebuilt from the ground up. Where we once had many interweaving batch files performing most of the work, we now had complete separation of processes. Maven allowed us to define project dependencies, codependences, relational hierarchies, and various build goals. Maven is everything Ant ever hoped to be, and more.
Now our programmers were checking in their code. Hudson would monitor our source code repositories every 10 minutes. If source code was checked in to a given project, be it c#, c++, or Java, then Hudson would build the code and perform (findbugs) code analysis, task analysis, junit tests and provide statistics lines of code, workspace size consumption and project size. If Hudson detected any cross-project dependencies, it would then kick off their builds too. Hudson would then check in the resulting compiled binaries or assembled sources into Archiva artifact management system.
Next we have one batch file that simply simply gathers all the relevant binaries (or artifacts), assembling them in a working directory exactly as they would packaged into an installer. This process has no responsibility for building anything, and only cares about the most recent, successfully built artifacts published to Archiva. It doesn't care how the files are packed or what technology is used in the distribution process. Nor does it care how the binaries came to be.
Lastly the files would be packaged by our installer platform. This last step doesn't care about any previous steps. All it knows is that files at location X need to be packaged into an installer. The installer could be Install Shield, Jexpress, Wise, VSS Packaged and Deployment wizzard... whatever the technology, the basic workflow is the same. The nice part is that Hudson also allowed us to perform the last two steps as Jobs so end to end we were totally automated and monitored.
What is even better is that we have one process that simply builds our code base and assembles it. We have a completely separate process that gathers all the necessary binaries for the installer. Lastly there is a completely separate process that actually packages all the binaries, and file dependencies. We can upgrade technologies in any part of the process with little to no effect in the other areas allowing us to be more agile and to be able to jump to newer better technologies as they become available at low risk to our product's stability and quality.
Products worth looking into:
Hudson Extensible Continuous Integration System
http://hudson-ci.org/
Apache Archiva Artifact Management
http://archiva.apache.org/
Apache Maven2
http://maven.apache.org/
Subversion Source Code Repository
http://subversion.tigris.org/


