2010-09-27 23 views
10

這是我從TeamCity中習以爲常的特性 - 我可以指定某個生成配置將由另一個生成配置的成功觸發。當TFS 2008中的另一個成功完成時觸發生成

我甚至可以將一個構建的結果傳遞給另一個構建 - 但也許這是太多了。

我正在尋找類似的功能在TFS2008,有沒有辦法在一個構建配置上設置觸發器,它應該在另一個成功完成後啓動?

回答

6

我用下面的目標在我TFSBuild.proj:

注入新的指標納入構建過程。我們只觸發相關的建立,如果一個「降」已成功創建:

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

創建包含相關的列表構建我們要觸發的ItemGroup(中包含的屬性將列出相關的構建的因爲它出現在構建資源管理器中 - 在我的情況下,依賴構建被稱爲「集成」)。在我們的構建過程中,我們有時需要觸發多個構建,並且我們希望將下一個構建指向由當前構建生成的二進制文件(在本例中,我想對所生成的二進制文件運行集成測試)。注意hack繞過配置名稱中的空格 - 例如「Any CPU」會在MsBuild參數中引起問題。使用這種格式,我們可以爲每個相關版本定製MSBuild參數。

<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> 

現在,觸發構建。請注意,我們使用自定義GetOption:我們要確保依賴的構建使用與當前構建使用的變更集相同的變更集 - 我們不能使用Latest,同時可能有人檢查過 - 因此我們需要所有依賴構建我們的「連鎖」都是基於相同的變更集。實際的命令在Exec中,而BuildStep的目的是確保我們報告Exec的成功(或失敗)。

<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> 

我希望幫助...

+0

你可以發佈完整的文件? (和模板)?謝謝 – 2012-11-06 11:18:21

+0

對不起 - 從該工作繼續前進,不再有權限。真的,在上面tho應該有足夠的... – 2012-11-06 15:25:00

+0

沒問題。使用構建定義模板弄明白了。 – 2012-11-06 19:31:54

相關問題