Oto jak tego dokonał (http://sajojacob.com/2009/08/how-to-chain-tfs-builds/)
Jak Chain TFS Budowy? Wysłany 5 sierpnia 2009 przez Sajo - Brak komentarzy ↓
Jeden z moich kolegów @ gdurzi niedawno zadał mi to pytanie. Brzmi dość prosto, aby być wspieranym po wyjęciu z pudełka z TFS w prawo? Zbyt wiele dziwactw z tym. I zaleciłem, aby za pomocą zawsze wiernego zadania MSBuild zadzwonić do TFSBuild.exe, aby ustawić kolejkę nowej wersji z pierwszego TFSBuild.proj z czymś podobnym do tego:
TFSBuild.exe start/kolejka% TFSSVR%% TEAMPROJECT%% BUILDTYPE %
Problem z korzystaniem z TFSBuild.exe polega na tym, że nie można przekazać Build agentów jako argumentu wiersza poleceń, który był dla nas złamaniem umowy.
Istnieje kilka podejść, które można podjąć w oparciu o konkretny scenariusz, więc określmy scenariusz tutaj, masz definicję budowania Main_Build TFS, która buduje twój podstawowy projekt i chcesz mieć możliwość tworzenia wielu wersji pomostowych z tym samym Main_Bild do kompilacji/budowania, ale należy ustawić niestandardową dla wdrożenia na podstawie, kto wywołuje Main_Build. Bardzo przydatne, gdy masz produkt, który wyświetla się na wielu klientach z wymaganą niestandardową budową wstępną i działaniami po instalacji na kliencie. Oto jeden ze sposobów budowania łańcucha z TFS 2008.
Krok 1: Utwórzmy niestandardowe zadanie MSBuild, używając modelu obiektowego Team Foundation, który kolejkuje kompilację przy użyciu domyślnego agenta kompilacji powiązanego z plikiem definicji kompilacji.
Przykładowy kod dla kolejkowania: 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);
Krok 2: Teraz skopiuj QueueTFS.dll do nowego folderu w TFS, w którym chcesz utworzyć plik definicji Budowa postoju.
Teraz utwórzmy minimalny plik TFSBuild.proj, który wykorzystuje nasze nowe zadanie MSBuild i zastępuje cel EndToEndIteration. Będzie to nasza definicja kompilacji pomostowej, która uruchomi kompilację Main_Build. Zauważ, że będziesz musiał ręcznie utworzyć ten TFSBuild.proj i po prostu wskaż lokalizację pliku projektu z interfejsu definicji definicji do nowego folderu.
Przykładowy kod dla minimalnej TFSBuild.proj:
<?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>
Krok 3: Edycja pliku Main_Build TFSBuild.proj z pre-produkcji i post-build połączeń docelowych.
<Target Name=“BeforeCompile“>
<CallTarget Targets=“Custom_PreBuild“/>
</Target>
<Target Name=“AfterDropBuild“ Condition=“‘$(BuildBreak)’!=’true’“>
<CallTarget Targets=“Custom_PostBuild“/>
</Target>
Chcieliśmy możliwość uruchamiania Main_Build sama, jak również, na poparcie tego dodamy import warunkowych w naszej Main_Build TFSBuild.proj zaimportować plik default cele z pustymi Custom_PreBuild i Custom_PostBuild celów. $ (CustomTarget) to co byś przekazać jako argument wiersza polecenia w kroku 1 dla request.CommandLineArguments
<Import Project="$(CustomTarget)" Condition="'$(CustomTarget)'!=''"/>
<!--Import CustomContoso.Target if no partner is passed in—>
<Import Project="EmptyCustom.Target" Condition="'$(CustomTarget)'==''"/>
Krok 4: Teraz należy stworzyć plik Custom.Target twoje cele i EmptyCustom.Target z Custom_PreBuild i Custom_PostBuild celów i ciebie są skończone.
Dodałem obsługę aktualizacji kroków kompilacji i kilka innych drobnych rzeczy, które nie mieszczą się w zakresie tego posta na blogu, ale mam nadzieję, że zaczniesz.
zmieniliśmy CC.NET - co łatwo obsługuje tego rodzaju scenariusza. – Sneal
Zrobiłem to wiele razy z CC.NET też, musi być schludny sposób zrobić to samo z TFS, zakładam! – user22242