2009-07-24 25 views
14

Mam scenariusz, w którym chcę wywołać jedną kompilację TFS od innej, pierwsza wykonuje kompilację, a druga wykonuje inscenizację. Pozwoli mi to zrobić wiele niestandardowych przemieszczeń dla tego samego rozwiązania.Jak połączyć łańcuchy TFS?

Wiem, mogę to zrobić za pomocą zadania exec w drugiej kompilacji i wywołać tfsbuild.exe, aby umieścić kolejkę kompilacji z pierwszej definicji kompilacji. Ale zastanawiał się, czy ktoś zna lepszy sposób?

+1

zmieniliśmy CC.NET - co łatwo obsługuje tego rodzaju scenariusza. – Sneal

+0

Zrobiłem to wiele razy z CC.NET też, musi być schludny sposób zrobić to samo z TFS, zakładam! – user22242

Odpowiedz

5

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.

7

Zależy od tego, co próbujesz zrobić.

1) Czy chcesz, aby kompilacja + etapowanie działało jako jedna operacja? Aby otrzymać jeden skonsolidowany raport kompilacji, jeden plik dziennika, jedno zadanie w kolejce budowania serwera, każdy krok wykonywany sekwencyjnie przez tego samego agenta Build, który wykonał poprzedni krok?

Jeśli tak, to jesteś na właściwej ścieżce. Nie chciałbym jednak, aby <Exec> na tfsbuild.exe - uruchamianie całej nowej kompilacji ma dużo narzutów i nie jestem pewien, jakie są potencjalne skutki uboczne. Zamiast tego użyłbym zadania <Call> do wykonania zadań msbuild zdefiniowanych w skryptach pomostowych.

2) Czy chcesz, aby "build build" rzeczywiście był kolejką osobnej "wersji inscenizacyjnej"? Oddzielne raporty, pliki dzienników, & miejsca w kolejce? Możliwość wykonywania równolegle, jeśli masz wielu agentów Build?

Jeśli tak, to:

  • utworzyć nową definicję (y) budowania inscenizacji
  • dodać trochę kodu do swojej pierwotnej definicji kompilacji, że kolejki [jeden/kilka] z nowymi definicjami zbudowano z użyciem Interfejs API budowania zespołu. Sample code.
  • usunąć coś nie związane z rdzenia zbudować z oryginalnej definicji kompilacji
  • upewnić nowe definicje „postoju” nie mają żadnych automatycznych wyzwalaczy (odstępach czasu zameldowania wydarzenia, itp)
+0

Zadanie 1, ale nie może być używane zgodnie z sugestią. W tym przypadku struktura przemieszczania musi być sterownikiem kompilacji. Wywołuje podstawową kompilację, a następnie wykonuje niestandardową inscenizację. Problem z użyciem pliku Minimal tfsbuild proj jest taki, że plik definicji TFSBuild utworzony za pośrednictwem interfejsu użytkownika ustawia wszystkie właściwości ścieżki w oparciu o wybrane rozwiązanie do zbudowania. (Zgodnie z tym, co się zgadza, pomijanie definicji kompilacji nie powinno odbudowywać rozwiązania). bóle, które sprawiają, że ścieżki są skonfigurowane tak, aby wywoływać właściwy główny plik TFSBuild.proj bez ich kodowania na sztywno. – user22242

+0

Nie rozumiem problemu. Dlaczego nie przechowywać skryptów przemieszczania w tym samym katalogu, co skrypty budowania? W rzeczywistości nawet to nie jest konieczne - po prostu upewnij się, że ścieżki względne pozostają takie same. ///// Jeśli to nie pomoże, podaj więcej szczegółów na temat tego, co próbujesz zrobić. Jakie dokładnie rzeczy oczekujesz w "pierwszej kompilacji" i "drugiej kompilacji?" Jakie zadania mają ze sobą wspólnego i co należy dostosować? –

+0

BTW, w zależności od tego, co próbujesz zrobić, Team Build może nie być właściwym podejściem. Na przykład moje środowiska testowe są ustawione na modelu "pull" zamiast "push". Każda maszyna subskrybuje system powiadamiania TFS. Gdy zostanie wywołane zdarzenie BuildCompletion, usługa na komputerze sprawdza pod kątem różnych kryteriów skonfigurowanych dla tego pola i odpowiednio instaluje środowisko testowe. –

0

Czy próbujesz wdrożyć swoje rozwiązanie w swoim środowisku pomostowym? Jeśli tak dobrą metodą jest użycie TFSDeployer od CodePlex, które będzie uruchomić skrypt zmierzających PowerShell w oparciu o jakość wykonania, aby wybrać ...

+1

Mogę raczej zrobić to w CC zamiast zajmować się krzywą uczenia się dla TFSDeployer dla raczej prostego zadania takiego jak to. Dlaczego tak trudno jest zrobić coś tak prostego w TFS, że trzeba polegać na innych narzędziach? Jestem zaskoczony, że wielu ludzi nawet nie mówi o łańcuchowych wersjach TFS. – user22242

+2

Łańcuchowa kompilacja wybiłaby moją numerację wersji. Używam pojedynczej kompilacji do budowania wszystkich "Artefaktów", a następnie muszę wdrożyć ją na DEV, a następnie Test systemowy, a następnie QA, a następnie Beta i na żywo. Jest to zrobione, więc nie ma absolutnie żadnej możliwości skażonej kompilacji (checkin programisty). Jeśli wystąpi problem, wracamy do DEV. Odbywa się to w każdej gałęzi funkcjonalnej, dopóki nie zostanie przekazana QA/UAT przed połączeniem z głównym i rozgałęzionym dla wydania. :) –

1

Oto inne pomocne linki. To może pomóc innym.

Utwórz kolejną definicję kompilacji i wywołaj inne definicje kompilacji, które mają być wyzwalane.

http://blogs.objectsharp.com/post/2012/02/04/Create-a-Master-Build-that-calls-other-Builds.aspx

http://blog.stangroome.com/2011/09/06/queue-another-team-build-when-one-team-build-succeeds/

Przekazywanie argumentów do Dziecko buduje.

http://blog.stangroome.com/2014/02/19/queue-a-team-build-from-another-and-pass-parameters/

TFS Budowanie Extension do kolejki innej zbudować definicję

http://tfsbuildextensions.codeplex.com/