Aquí es cómo lo logré (http://sajojacob.com/2009/08/how-to-chain-tfs-builds/)
Cómo cadena TFS ¿Construye? Publicado el 5 de agosto de 2009 por Sajo - Sin comentarios ↓
Uno de mis colegas @gdurzi me hizo esta pregunta recientemente. Suena bastante sencillo para ser compatible con TFS ¿verdad? Demasiadas peculiaridades con esto. Y recomendé usar la siempre fiel tarea MSBuild para hacer una llamada a TFSBuild.exe para poner en cola una nueva compilación desde el primer TFSBuild.proj con algo como esto
TFSBuild.exe start/queue% TFSSVR%% TEAMPROJECT%% BUILDTYPE %
Un problema con el uso de TFSBuild.exe es que no puede pasar Agentes de compilación como un argumento de línea de comandos que fue un factor decisivo para nosotros.
Existen varios enfoques que puede seguir en función de su escenario particular, así que definamos el escenario aquí, tiene una definición de compilación de MainSuite TFS que construye su proyecto central y desea la posibilidad de tener varias compilaciones en etapas ejecutando el mismo Main_Build para la compilación/creación, pero se debe organizar de forma personalizada para la implementación en función de quién llame a Main_Build. Muy útil cuando tiene un producto que se lanza a múltiples clientes con la necesidad de acciones personalizadas de preconstrucción y postconstrucción por cliente. Así que aquí hay una forma de crear Build Chaining con TFS 2008.
Paso 1: Creemos una tarea personalizada de MSBuild utilizando el modelo de objetos de Team Foundation que pone en cola una compilación utilizando el agente de compilación predeterminado asociado con el archivo de definición Build.
Código de ejemplo para poner en cola: QueueTFS.cs
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.Build.Client;
// Get the team foundation server.
TeamFoundationServer _tfsServer = TeamFoundationServerFactory.GetServer(_tfs);
// Get the IBuildServer
IBuildServer buildServer = (IBuildServer)_tfsServer.GetService(typeof(IBuildServer));
// Get the build definition for which a build is to be queued.
IBuildDefinition definition = buildServer.GetBuildDefinition(teamProject, buildDefinition);
// Create a build request for the build definition.
IBuildRequest request = definition.CreateBuildRequest();
request.CommandLineArguments = "Pass any custom command line args here"; // Ex: Custom Targets file
// Queue the build.
buildServer.QueueBuild(request, QueueOptions.None);
Paso 2: Ahora copiar el QueueTFS.dll a una nueva carpeta en TFS en la que desea crear el archivo de definición de Build puesta en escena.
Ahora crearemos un archivo TFSBuild.proj mínimo que utiliza nuestra nueva tarea MSBuild y anula el objetivo EndToEndIteration. Esta será nuestra definición de compilación de etapas que activará la compilación Main_Build. Tenga en cuenta que deberá crear este TFSBuild.proj a mano y simplemente señalar la ubicación del archivo de proyecto desde la UI de definición de compilación a la nueva carpeta.
Código de ejemplo para un TFSBuild.proj mínima:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TeamBuild\Microsoft.TeamFoundation.Build.targets" />
<UsingTask TaskName="MyNewCustomTFSTask" AssemblyFile="QueueTFS.dll"/>
<Target Name="EndToEndIteration">
<Message Text="About to trigger main build" Importance="high"/>
< MyNewCustomTFSTask TFS="http://TFSServer.com:8080/" TeamProject="TeamProject" BuildDefinition="Main_Build" TargetsFile="Custom.Target" XYZ="XYZ" />
<!-- When everything is done, change the status of the task to "Succeeded" -->
<SetBuildProperties TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" TestStatus="Succeeded" CompilationStatus="Succeeded"/>
</Target>
</Project>
Paso 3: Editar el archivo de Main_Build TFSBuild.proj con la pre-construcción y las llamadas de destino posterior a la generación.
<Target Name=“BeforeCompile“>
<CallTarget Targets=“Custom_PreBuild“/>
</Target>
<Target Name=“AfterDropBuild“ Condition=“‘$(BuildBreak)’!=’true’“>
<CallTarget Targets=“Custom_PostBuild“/>
</Target>
queríamos la capacidad de ejecutar Main_Build por sí mismo, así, para apoyar esto le sumamos las importaciones condicionales en nuestra Main_Build TFSBuild.proj para importar un archivo default objetivos con los objetivos y Custom_PreBuild Custom_PostBuild vacías. $ (CustomTarget) es lo que le pasa como argumento de línea de comandos en el paso 1 para request.CommandLineArguments
<Import Project="$(CustomTarget)" Condition="'$(CustomTarget)'!=''"/>
<!--Import CustomContoso.Target if no partner is passed in—>
<Import Project="EmptyCustom.Target" Condition="'$(CustomTarget)'==''"/>
Paso 4: Ahora cree un archivo de sus objetivos y Custom.Target EmptyCustom.Target con objetivos Custom_PreBuild y Custom_PostBuild y se están hechos.
Agregué soporte para actualizar los pasos de compilación y algunas otras cosas menores que están fuera del alcance de esta entrada de blog, pero espero que esto comience.
Nos cambiamos a CC.NET - que fácilmente compatible con este tipo de escenario. – Sneal
Lo he hecho muchas veces con CC.NET también, ¡tiene que haber una manera ordenada de hacer lo mismo con TFS, supongo! – user22242