When I joined Epic Games in December 2011, the company was using a build system that had been developed in-house a few years earlier. It consisted of a centralized SQL Server database that was used for both data storage and coordination of the build farm, and a system tray application written in C# for Windows that was running on each build machine.
While the system functioned well and was adequate for the small number of ongoing projects at the time, it was immediately evident to me that no emphasis had been put on the user interface. A rudimentary makeshift web interface existed, but most of the more advanced functionality had to be controlled by modifying database tables and executing stored procedures in SQL Management Studio.
I therefore proposed the development of a web based user interface that could be used by non-programmers, particularly our QA personnel, who was responsible for verifying and promoting builds to the rest of the team. After quickly putting together an initial prototype, I was given permission to implement a full web application, and when the original creator of the build system left the company, I became the de-facto owner of it.
The build system had the following features:
- Automated creation and labelling of build artifacts
- Continuous integration (CIS) for all target platforms
- Automated verification (functional and soak tests)
- Promotion of QA approved builds
- Management of build farm machines
- Collection and visualization of performance data (build times, size, etc.)
- Email notification in case of build, test or machine failures
My implementation was in use for several years until the company eventually outgrew it and switched to Jenkins (which I also helped with), and later to Electric Commander. It was also part of the Unreal Engine 3 distribution, and several licensees used it.
Part of the infrastructure was also a render farm that consisted of two C# applications: a centralized coordinator, and a client application for each machine. I maintained it for several years, but there was no need to expose it in the web frontend.