Ecco come ho realizzato questa (http://sajojacob.com/2009/08/how-to-chain-tfs-builds/)
Come catena TFS costruisce? Pubblicato il 5 agosto 2009 da Sajo - Nessun commento ↓
Uno dei miei colleghi @ gdurzi mi ha recentemente posto questa domanda. Sembra abbastanza semplice da essere supportato immediatamente con TFS? Troppe stranezze con questo. E ho consigliato di utilizzare l'attività MSBuild sempre fedele per effettuare una chiamata a TFSBuild.exe per accodare una nuova build dal primo TFSBuild.proj con qualcosa di simile a
TFSBuild.exe avvio/coda% TFSSVR%% TEAMPROJECT%% BUILDTYPE %
Un problema con l'utilizzo di TFSBuild.exe è che non è possibile passare agli agenti di compilazione come un argomento della riga di comando che è stato un compromesso per noi.
Esistono diversi approcci che è possibile effettuare in base al proprio scenario particolare, quindi definiamo lo scenario qui, si dispone di una definizione di build TFS Main_Build che crea il progetto principale e si desidera la possibilità di avere più build di gestione temporanea che eseguono lo stesso Main_Build per la compilazione/creazione, ma essere personalizzato per l'implementazione basata su chi chiama Main_Build. Molto utile quando si dispone di un prodotto che viene distribuito a più client con la necessità di azioni personalizzate pre-build e post-build per client. Ecco un modo per creare Chaining con TFS 2008.
Passaggio 1: Creiamo un'attività MSBuild personalizzata utilizzando il modello a oggetti Team Foundation che accoda una build utilizzando l'agente di creazione predefinito associato al file di definizione Build.
Codice di esempio per la fila: 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);
Fase 2: Ora copiare il QueueTFS.dll in una nuova cartella in TFS in cui si desidera creare il file di definizione build messa in scena.
Ora creiamo un file TFSBuild.proj minimale che utilizza la nostra nuova attività MSBuild e sovrascrive la destinazione EndToEndIteration. Questa sarà la nostra build build di Staging che attiverà la build di Main_Build. Nota che dovrai creare questo TFSBuild.proj a mano e semplicemente puntare il percorso del file di progetto dall'interfaccia utente di definizione Build alla nuova cartella.
Codice di esempio per un TFSBuild.proj minima:
<?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>
Fase 3: Modificare il file Main_Build TFSBuild.proj con la pre-compilazione e chiamate di destinazione post-generazione.
<Target Name=“BeforeCompile“>
<CallTarget Targets=“Custom_PreBuild“/>
</Target>
<Target Name=“AfterDropBuild“ Condition=“‘$(BuildBreak)’!=’true’“>
<CallTarget Targets=“Custom_PostBuild“/>
</Target>
Abbiamo voluto la possibilità di eseguire Main_Build da solo così, per sostenere questo aggiungiamo le importazioni condizionali nel nostro Main_Build TFSBuild.proj per importare un file default bersagli con Custom_PreBuild e Custom_PostBuild obiettivi vuoti. $ (CustomTarget) è quello che si potrebbe passare come argomento della riga di comando nel passaggio 1 per request.CommandLineArguments
<Import Project="$(CustomTarget)" Condition="'$(CustomTarget)'!=''"/>
<!--Import CustomContoso.Target if no partner is passed in—>
<Import Project="EmptyCustom.Target" Condition="'$(CustomTarget)'==''"/>
Fase 4: Ora creare il file i vostri obiettivi e Custom.Target EmptyCustom.Target con Custom_PreBuild e Custom_PostBuild obiettivi e si sono fatti.
Ho aggiunto il supporto per l'aggiornamento dei passaggi di costruzione e alcune altre cose minori che non rientrano nell'ambito di questo post del blog, ma si spera che questo possa iniziare.
Siamo passati a CC.NET - che supporta facilmente questo tipo di scenario. – Sneal
L'ho fatto anche molte volte con CC.NET, deve esserci un modo pulito di fare lo stesso con TFS, presumo! – user22242