当另一个在TFS 2008中成功完成时触发构建

时间:2010-09-27 13:51:15

标签: msbuild continuous-integration tfsbuild tfs2008

这是我从TeamCity习惯的一个功能 - 我可以指定某个构建配置将由另一个构建配置的成功触发。

我甚至可以将一个构建的结果传递给另一个构建 - 但也许这要求太多。

我在TFS2008中寻找类似的功能,有没有办法在构建配置上设置触发器,它将在另一个成功完成后启动?

1 个答案:

答案 0 :(得分:6)

我在TFSBuild.proj中使用以下目标:

将新目标注入构建过程。如果成功创建了“drop”,我们只触发依赖构建:

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

创建一个包含我们想要触发的依赖构建列表的项目组(Include属性将列出构建资源管理器中显示的依赖构建的名称 - 在我的情况下,依赖构建称为“集成”)。在我们的构建过程中,我们有时希望触发多个构建,并且我们希望将下一个构建指向由当前构建生成的二进制文件(在此示例中,我希望针对生成的二进制文件运行集成测试)。注意黑客绕过配置名称中的空格 - 例如“Any CPU”会导致MsBuild args出现问题。使用这种格式,我们可以为每个依赖构建定制MSBuild args。

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

现在,触发构建。请注意,我们使用Custom 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>

我希望有帮助...