[TFS2010] HowTo: Incluir scripts de MSBuild en una definición de Build de TFS2010

image47dd1de4

Buenas,

después de mi visita por Barcelona la semana pasada al equipo del AlegreBandolero, Marc Rubiño y su gente, pues uno de los temas que quedó pendiente era evaluar la capacidad de lanzar scripts de MSBuild desde una definición de build de Team Foundation Server 2010. Ahora bien, esto que no es para nada complicado tiene un par de puntos a tener en cuenta relativos a la configuración de la build en Team Foundation Server 2010 y del script de MSBuild. Los siguientes pasos demuestran como incluir un script de MSBuild que muestra unmensaje en la consola de progreso de Builds de Team Foundation Server 2010.

Tutorial

1. Para este caso en particular, utilizaré una definición ya creada de una build que se encarga de compilar y lanzar un par de tests sobre código almacenado en TFS. Como se puede ver en la siguiente imagen, la build hasta el momento funciona correctamente

image

2. Para probar este escenario, he creado el siguiente proyecto que muestra un mensaje utilizando una tarea del tipo BuildStep (de lo que hable hace bastante tiempo por aquí). Este es el código de ejemplo de la tarea, que como pueden ver, simplemente muestra un mensaje en el Log del Build.

   1: <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"

   2:          ToolsVersion="4.0" InitialTargets="Target1">

   3:   <Target Name="Target1">

   4:     <DisplayTinos />

   5:   </Target>

   6:   <UsingTask TaskName="DisplayTinos" TaskFactory="CodeTaskFactory"

   7:         AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >

   8:     <ParameterGroup />

   9:     <Task>

  10:       <Using Namespace="System"/>

  11:       <Using Namespace="System.IO"/>

  12:       <Code Type="Fragment" Language="cs">

  13:         <![CDATA[

  14: Log.LogMessage("Hola Valentino!");

  15: //Log.LogError("Hola Martina!");

  16: ]]>

  17:       </Code>

  18:     </Task>

  19:   </UsingTask>

  20: </Project>

3. Ahora bien, para poder incluir este archivo dentro del proceso de ejecución de un build en TFS2010, es necesario que el mismo esté protegido dentro del repositorio de código fuente. Para esta demo, he seguido un criterio bastante simple y he reutilizado alguno de mis posts sobre MSBuild en una carpeta llamada [MSBuild]. Esta carpeta se baja como parte del Workspace que tiene asociado la definición del Build con lo que ya tenemos acceso a los proyectos de MSBuild.

image

4. En este paso modificaremos el archivo xaml que representa el proceso de ejecucion de TFS Build 2010. Para esto copiaremos el archivo [DefaultTemplate.xaml] a una carperta del Source Control que nos permitirá aplicar los cambios correspondientes en nuestro proceso de Build. Por defecto, los archivos de WF para las builds se encuentran en [$\BuildProcessTemplates]

image

Para este ejemplo lo copiaremos y renombraremos en otro directorio [$/LabsAgile/Build/Dev/src/BuildProcessTemplate], por ejemplo

image

 

5. En este paso, modificaremos la definición del workflow para que lance un proyecto de MSBuild. Para esto editaremos el mismo y accederemos a la siguiente sección:

  • Process
    • Run on Agent
      • Try, Compile, Test …
        • Compile Test and Associate Change Sets
          • Try Compile and Test
            • Compile and Test
              • ForEach Configuration in BuildSettings.PlatformConfiguration
                • ForEach Project in BuildSettings.ProjectsToBuild
                  • CompileTheProject

Una vez dentro, agregaremos una actividad del tipo [MSBuild] al final de la acción de compilar el proyecto. Esta actividad nos permite invocar a un proyecto de MSBuild.

image

 

6. Para que la actividad se pueda lanzar correctamente, debemos configurar las siguientes propiedades de la misma:

  • LogFile: el nombre del archivo de log sobre el que se generará la información.
    • Value: “DemoMSbuild.log”
  • LogFileDropLocation: la ubicación del archivo de log
    • Value: BuildDetail.DropLocation + “\logs”
  • Project: define el proyecto de MSBuild que se lanzará como parte del proceso de build
    • Value: SourcesDirectory + “\Build\Dev\src\MsBuild\DemoTasks.proj”
  • Targets: define las targets que se invocarán
    • Value: New String() { “Target1”}

 

image

También podemos agregar argumentos a la línea de comandos, definir el nivel de trazas, la versión de MSBuild, etc.

7. Una vez que hemos terminado de modificar el xaml, lo guardamos y lo protegemos en el Source Control.

8. A continuación ya podemos asignar este WF a nuestra definición de build de TFS2010. En este paso, editamos la definición de la Build y en la sección [Process] seleccionamos desde el Source Control el archivo de WF que hemos modificado a nuestra build.

image

9. Si todas las configuraciones son correctas, cuando lanzamos una build, en el log de la misma, después de la compilación de cada solución, podremos ver una llamada a nuestro proyecto de MSBuild. El siguiente extracto del log, muestra estas llamadas:

   1: Run MSBuild for Project

   2: C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /nologo /noconsolelogger 

   3: "C:\Builds\1\LabsAgile\Build MsBuild Integration\Sources\Build\Dev\src\BuildDemo\BuildDemo.sln" 

   4: /m:1 /fl /flp:"logfile=C:\Builds\1\LabsAgile\Build 

   5:   MsBuild Integration\Sources\Build\Dev\src\BuildDemo\BuildDemo.log;encoding=Unicode;verbosity=normal" 

   6: /p:SkipInvalidConfigurations=true  

   7: /p:OutDir="C:\Builds\1\LabsAgile\Build MsBuild Integration\Binaries\\" 

   8: /p:Configuration="Debug" /p:Platform="Any CPU" 

   9: /p:VCBuildOverride="C:\Builds\1\LabsAgile\Build MsBuild 

  10:   Integration\Sources\Build\Dev\src\BuildDemo\BuildDemo.sln.Any CPU.Debug.vsprops"  

  11: /dl:WorkflowCentralLogger, "c:\Program Files\Microsoft Team Foundation Server 

  12:   2010\Tools\Microsoft.TeamFoundation.Build.Server.Logger.dll";

  13:   "Verbosity=Normal;BuildUri=vstfs:///Build/Build/35;InformationNodeId=2902;

  14:   TargetsNotLogged=GetNativeManifest,GetCopyToOutputDirectoryItems,

  15:   GetTargetPath;TFSUrl=http://win-gs9gmujits8:8080/tfs/DefaultCollection;

  16:   "*WorkflowForwardingLogger,"c:\Program Files\Microsoft Team Foundation Server 

  17:   2010\Tools\Microsoft.TeamFoundation.Build.Server.Logger.dll";"Verbosity=Normal;"

  18:  

  19: 00:00

  20: Built $/LabsAgile/Build/Dev/src/BuildDemo/BuildDemo.sln for default targets.

  21:  

  22: 00:00

  23: Built $/LabsAgile/Build/Dev/src/BuildDemo/BuildDemo/BuildDemo.csproj for default targets.

  24:  

  25: 00:00

  26: Built $/LabsAgile/Build/Dev/src/BuildDemo/BuildDemo.Tests/BuildDemo.Tests.csproj for default targets.

  27:  

  28: 00:00

  29: Built $/LabsAgile/Build/Dev/src/BuildDemo/BuildDemo/BuildDemo.csproj for default targets.

  30: MSBuild Log File

  31:  

  32: 00:04

  33: MSBuild

  34:  

  35: 00:00

  36: Built $/LabsAgile/Build/Dev/src/MsBuild/DemoTasks.proj for target(s) Target1.

  37: C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /nologo /noconsolelogger 

  38: "C:\Builds\1\LabsAgile\Build MsBuild Integration\Sources\Build\Dev\src\MsBuild\DemoTasks.proj" 

  39: /m:1 /t:"Target1" /fl /flp:"logfile=DemoMSBuild.log;encoding=Unicode;verbosity=normal" 

  40: /p:RunCodeAnalysis="False"  /dl:WorkflowCentralLogger,"c:\Program Files\Microsoft Team Foundation 

  41:   Server 2010\Tools\Microsoft.TeamFoundation.Build.Server.Logger.dll";

  42:   "Verbosity=Normal;BuildUri=vstfs:///Build/Build/35;InformationNodeId=2910;

  43:   TFSUrl=http://win-gs9gmujits8:8080/tfs/DefaultCollection;"*WorkflowForwardingLogger,

  44:   "c:\Program Files\Microsoft Team Foundation Server 2010\Tools\Microsoft.TeamFoundation.Build.Server.Logger.dll";

  45:   "Verbosity=Normal;"

10. Finalmente si accedemos al directorio de [DROPS] de la build, en el directorio de logs, podremos ver el archivo creado con el output de la ejecución de nuestro proyecto de MSBuild.

 image

Pues bien, en los próximos días un poco de integración más complicada y algún que otro ejemplo interesante.

 

Saludos @ Home

El Bruno

   

2 thoughts on “[TFS2010] HowTo: Incluir scripts de MSBuild en una definición de Build de TFS2010

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.