A build machine for .NET should be relatively simple.
Of course, it’s going to depend on what you’re using for your project. If you’re using source code control (and I hope you are), you’re going to need to make sure that your build machine has the client on it–or a library that makes it easy to get to it.
You’ll need the compiler for .NET on it. That’s pretty easily done by just installing the .NET SDK on it. Make sure you get the compiler for your language of choice. The base SDK comes with compilers for C#, VB.NET, J#, and managed C++.
If you’re creating installers, make sure you can invoke it from the command line, and get it on the build machine.
If you’re running automated tests with NUnit, make sure that’s on your build machine as well. As part of your daily builds, check out the entire solution, including the tests. Label them in source code control when you make the build. If the build is successful, and the tests pass, then you can pin it in the source code repository. Don’t pin it if it’s not a successful build. (This is all based on experience with VSS, of course–we work with the tools we’re given.)
I started with scripting the build process from a batch file. That’s enough to get you started. Eventually, I wrote a Visual Basic program to drive the whole thing. I managed to get it down to a single button-click that drove the whole process. That was about 8 years ago.
These days, however, there are plenty of off-the-shelf products that will do it for you that you won’t have to maintain yourself. They’ll integrate your source code control tasks, building the software, notifying you of failed builds, and starting the install builder for you. Fairly sophisticated stuff. Check it all out. Google’s a wonderful thing.
Key thing about a build environment: Do not put anything on it that isn’t absolutely necessary to building and testing your software. If your machine comes to you with extra junk, remove it.
Anything on a build machine that isn’t critical to the build introduces variables into the build process that can’t be duplicated everywhere else. You have to be able to build the software predictably. That’s the whole point of the build machine. A build environment should be a constant, not a variable.