I have been doing construction engineering (by the way) for 16 years. I am firmly convinced that you build early, build, often, continuous integration. So, the first thing I do with the project is to establish how it will be built (Java: Ant or Maven ; .NET: NAnt or MSBuild ) and how it will be managed ( Subversion or some other version control). Then I will add continuous integration ( CruiseControl or CruiseControl.NET ) depending on the platform, and then let the rest of the developers free themselves.
As the project grows and the need for reports and documentation grows, the assembly will ultimately take longer. At this moment, I break assemblies into continuous assemblies (runs on checkin), which only compile and run unit tests and daily assemblies that build everything, run all reports, and build any generated documentation. I can also add an assembly that places the repository and does any additional packaging for client delivery. I will use small-scale assembly targets to manage parts so that any developer can create any part of the system - the continuous integration server uses the same assembly steps as any developer. Most importantly, we never supply an assembly for testing or a client that has not been built using the assembly server.
What I do is why I do it (and why you should too):
Suppose you have a typical application with several projects and several developers. Although developers can start with a common, consistent development environment (the same OS, the same patches, the same tools, the same compilers), their environment will diverge over time. Some developers will religiously apply all security patches and updates, others will not. Some developers will add new (perhaps better) tools, others will not. For some, do not forget to upgrade their full workspace before it is built; others will only update part of the project that they are developing. Some developers will add source code and data files to the project, but forget to add them to the source control. Others will write unit tests that depend on the specific features of their environment. As a result, you will quickly see all the popular “Well, it builds / works on my machine” excuses.
Having a separate, stable, consistent, well-known server for creating your application, you can easily detect these problems and run the assembly from each commit, you can accurately determine when a problem arose in the system. More importantly, since you use a separate server to create and package your application, it will always pack the same every time. There is nothing worse than having a ship builder with a custom assembly for the client, his work, and then I don’t know how to reproduce the settings.
Craig Trader Oct. 15 '08 at 13:56 2008-10-15 13:56
source share