Una de las carácteriscas más desconocidas de TfsBuild (y de MsBuild) introducida en la versión 2008 es la posibilidad de compilar varios proyectos en paralelo. Esta carácterística puede acelerar nuestras builds de manera significativa. Sobre todo teniendo en cuenta que el número de procesadores disponibles en las máquinas es cada vez mayor. Para activar esta caracteristica es necesario seguir los siguientes pasos.
1) Debemos modificar Microsoft.TeamFoundation.Build.targets para que se construyan en paralelo diferentes configuraciones (p.e. las típicas de Release y Debug):
<MSBuild BuildInParallel=«true«
Projects=«@(ConfigurationList)«
Targets=«CompileConfiguration«
StopOnFirstFailure=«$(StopOnFirstFailure)«>
<Output TaskParameter=«TargetOutputs« ItemName=«CompilationOutputs« />
</MSBuild>
2) Debemos modificar Microsoft.TeamFoundation.Build.targets para que se construyan en paralelo diferentes soluciones:
<MSBuild BuildInParallel=«true«
Projects=«@(SolutionList)«
Targets=«CompileSolution«
StopOnFirstFailure=«$(StopOnFirstFailure)«>
<Output TaskParameter=«TargetOutputs« ItemName=«CompilationOutputs« />
</MSBuild>
3) Modificar TfsBuildService.exe.config (generalmente ubicado en %ProgramFiles%Microsoft Visual Studio 9.0Common7IDEPrivateAssemblies) y añadir una entrada MaxProcesses que especifica el número de proceso de MsBuild que se levantarán en paralelo:
<!– MaxProcesses
Set this value to the maximum number of processes MSBuild.exe should
use for builds started by agents hosted by this executable.
–>
<add key=«MaxProcesses« value=«1« />
Después de estos cambios, es necesario reiniciar el servicio de TFS Build (net stop vstfbuild y net start vstfbuild). A partir de este momento la builds se ejecutarán en paralelo.
Para que esa parelelización funcione debemos usar referencias a proyecto. Usando referencias de proyecto, MsBuild puede, analizando esta información de dependencias, saber en que orden construir los proyectos y si es posible paralelizar la construcción de un determinado proyecto. Si estamos referenciando binarios, MsBuild no podrá deducir esa información, con lo que si paralelizamos la construcción podríamos sufrir errores de compilación.
¿HANS Solo?
¡¡¡¡¿HANS Solo?!!!
¡¡¡¡ HEREJEEEEEEE !!!!
😉
Gracias maestro Joda
Joder… es cierto merezco la hoguera… ya lo he corregido. Han Solo!!!
Muy buena la optimización. Pero… es posible que, en una misma build, primero compilar ciertas soluciones por orden, y luego el resto de soluciones en paralelo ?
@Enric: pue creo que no, pero habría que mirarlo en detalle, quizás con targets se podría hacer algo.