2010-09-27 6 views
10

Dies ist eine Funktion, die ich von TeamCity gewohnt bin - ich könnte angeben, dass eine bestimmte Build-Konfiguration durch den Erfolg einer anderen Build-Konfiguration ausgelöst wird.Trigger erstellen, wenn ein anderer erfolgreich in TFS 2008

Ich könnte sogar die Ergebnisse von einem Build zum anderen weitergeben - aber vielleicht ist das zu viel verlangt.

Ich bin auf der Suche nach einer ähnlichen Funktionalität in TFS2008, gibt es eine Möglichkeit, einen Trigger auf eine Build-Konfiguration zu setzen, die nach einem anderen erfolgreich beendet werden soll?

Antwort

6

Ich benutze das folgende Ziel in meinem TFSBuild.proj:

injizieren die neuen Ziele in den Build-Prozess. Wir auslösen nur abhängig baut, wenn ein „drop“ erfolgreich erstellt wurde:

<PropertyGroup> 
    <DropBuildDependsOn> 
     $(DropBuildDependsOn); 
     CreateDependentBuildItemGroup; 
     TriggerDependentBuilds; 
    </DropBuildDependsOn> 
</PropertyGroup> 

eine ItemGroup erstellen, die eine Liste der abhängigen enthält baut wir (das Include-Attribut listet die Namen des abhängigen Build auslösen soll wie es im Build-Explorer erscheint - in meinem Fall unten heißt das abhängige Build "Integration". In unserem Build-Prozess möchten wir manchmal mehr als einen Build auslösen, und wir möchten den nächsten Build auf die Binaries verweisen, die vom aktuellen Build erzeugt wurden (in diesem Beispiel möchte ich Integrationstests für die produzierten Binaries ausführen). Beachten Sie den Hack, um Leerzeichen in Konfigurationsnamen zu umgehen - zB "Any CPU" verursacht ein Problem in den MsBuild-Argumenten. Mit diesem Format können wir benutzerdefinierte MSBuild-Argumente für abhängige Builds erstellen.

<Target Name="CreateDependentBuildItemGroup"> 
    <ItemGroup> 
     <DependentBuild Include="Integration"> 
      <!--Using 8dot3 format for "Mixed Platforms" as it's tricky (impossible?) to pass a space char within /msbuildarguments of tfsbuild--> 
      <MsBuildArgs>/p:CallingBuildDropFolder=$(DropLocation)\$(BuildNumber)\Mixedp~1\Ship;CiSmallBuildNumber=$(CiSmallBuildNumber);BuildNumberPostFix=$(BuildNumberPostFix)</MsBuildArgs> 
      <PriorityArg>/priority:AboveNormal</PriorityArg> 
     </DependentBuild> 
    </ItemGroup>  
</Target> 

Jetzt die Builds auslösen. Beachten Sie, dass wir eine benutzerdefinierte GetOption verwenden: Wir möchten sicherstellen, dass abhängige Builds das gleiche Changeset verwenden, das der aktuelle Build verwendet hat - wir können Latest nicht verwenden, da sich jemand zwischenzeitlich eingecheckt hat. Daher möchten wir alle abhängigen Builds Unsere "Kette" basiert auf dem gleichen Changeset. Der eigentliche Befehl befindet sich innerhalb des Exec, und der BuildStep-Befehl soll sicherstellen, dass wir den Erfolg (oder den Fehler) des Exec melden.

<Target Name="TriggerDependentBuilds" 
     Condition=" '$(CompilationStatus)' == 'Succeeded' "> 
    <BuildStep TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
       BuildUri="$(BuildUri)" 
       Name="TriggerStep" 
       Message="Triggering Dependent Builds"> 
     <Output TaskParameter="Id" 
       PropertyName="TriggerStepId" /> 
    </BuildStep> 

    <PropertyGroup> 
     <TriggerBuildCommandBase>TfsBuild start $(TeamFoundationServerUrl) $(TeamProject)</TriggerBuildCommandBase> 
    </PropertyGroup> 

    <Exec 
     ContinueOnError="true" 
     WorkingDirectory="C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE" 
     Command="$(TriggerBuildCommandBase) %(DependentBuild.Identity) /queue /getOption:Custom /customGetVersion:$(GetVersion) %(DependentBuild.PriorityArg) /msbuildarguments:&quot;%(DependentBuild.MsBuildArgs)&quot;"> 
     <Output TaskParameter="ExitCode" 
       ItemName="TfsBuildResult"/> 
    </Exec> 

    <BuildStep Condition="'@(TfsBuildResult)'=='0'" 
       TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
       BuildUri="$(BuildUri)" 
       Id="$(TriggerStepId)" 
       Status="Succeeded" /> 
    <BuildStep Condition="'@(TfsBuildResult)'!='0'" 
       TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
       BuildUri="$(BuildUri)" 
       Id="$(TriggerStepId)" 
       Status="Failed" /> 
</Target> 

Ich hoffe, das hilft ...

+0

Könnten Sie die komplette Datei schreiben? (und Vorlage)? Danke –

+0

Entschuldigung - von diesem Job weitergegangen und habe keinen Zugriff mehr. Wirklich, es sollte genug in den oben genannten geben .... –

+0

Kein Problem. Habe es mithilfe der Builddefinitionsvorlage herausgefunden. –