Voici comment j'accompli ce (http://sajojacob.com/2009/08/how-to-chain-tfs-builds/)
Comment la chaîne TFS Construit? Publié le août 5, 2009 par Sajo - Pas de commentaires ↓
Un de mes collègues @ gdurzi m'a récemment posé cette question. Semble assez simple pour être pris en charge hors de la boîte avec TFS non? Trop de bizarreries avec ça. Et j'ai recommandé d'utiliser la tâche MSBuild toujours fidèle pour faire un appel à TFSBuild.exe pour mettre en file d'attente une nouvelle construction du premier TFSBuild.proj avec quelque chose comme ceci
TFSBuild.exe start/queue% TFSSVR%% TEAMPROJECT%% BUILDTYPE Un problème avec l'utilisation de TFSBuild.exe est que vous ne pouvez pas passer des agents de construction en tant qu'argument de ligne de commande qui était un briseur d'affaire pour nous.
Il existe plusieurs approches que vous pouvez prendre en fonction de votre scénario particulier. Définissons le scénario ici, vous avez une définition de construction Main_Build TFS qui construit votre projet principal et vous voulez pouvoir avoir plusieurs générations de stockage exécutant le même Main_Build pour la compilation/construction, mais être personnalisé pour le déploiement basé sur qui appelle Main_Build. Très utile lorsque vous avez un produit qui s'étend à plusieurs clients avec un besoin d'actions personnalisées avant et après la construction par client. Etape 1: Créons une tâche MSBuild personnalisée à l'aide du modèle d'objet Team Foundation qui met en file d'attente une construction à l'aide de l'agent de construction par défaut associé au fichier de définition de construction.
Exemple de code pour faire la queue: 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);
Etape 2: Maintenant, copiez le QueueTFS.dll dans un nouveau dossier dans TFS où vous voulez créer la mise en scène fichier de définition de génération.
Maintenant, créons un fichier TFSBuild.proj minimal qui utilise notre nouvelle tâche MSBuild et remplace la cible EndToEndIteration. Ce sera notre définition de construction Staging qui déclenchera la construction Main_Build. Notez que vous devrez créer ce fichier TFSBuild.proj à la main et pointer simplement l'emplacement du fichier du projet de l'interface utilisateur de définition de construction vers le nouveau dossier.
Exemple de code pour une TFSBuild.proj minimale:
<?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>
Étape 3: Modifier votre fichier Main_Build TFSBuild.proj avec la pré-construction et les appels cibles post-construction.
<Target Name=“BeforeCompile“>
<CallTarget Targets=“Custom_PreBuild“/>
</Target>
<Target Name=“AfterDropBuild“ Condition=“‘$(BuildBreak)’!=’true’“>
<CallTarget Targets=“Custom_PostBuild“/>
</Target>
Nous voulions la possibilité d'exécuter Main_Build par lui-même et, pour soutenir ce que nous ajoutons des importations conditionnelles dans notre Main_Build TFSBuild.proj d'importer un fichier cible par défaut avec des cibles vides de Custom_PreBuild et Custom_PostBuild. $ (CustomTarget) est ce que vous passeriez comme argument de ligne de commande à l'étape 1 pour request.CommandLineArguments
<Import Project="$(CustomTarget)" Condition="'$(CustomTarget)'!=''"/>
<!--Import CustomContoso.Target if no partner is passed in—>
<Import Project="EmptyCustom.Target" Condition="'$(CustomTarget)'==''"/>
Étape 4: Maintenant, créez votre fichier cibles Custom.Target et EmptyCustom.Target avec des cibles Custom_PreBuild et Custom_PostBuild et vous sont fait.
J'ai ajouté le support pour la mise à jour des étapes de construction et quelques autres petites choses qui sortent du cadre de ce blog, mais cela devrait vous aider à démarrer.
Nous sommes passés à CC.NET - qui soutient facilement ce genre de scénario. – Sneal
Je l'ai fait de nombreuses fois avec CC.NET aussi, il doit y avoir une bonne façon de faire la même chose avec TFS, je suppose! – user22242