Msbuild 在TFS 2008中另一个成功完成时触发生成

Msbuild 在TFS 2008中另一个成功完成时触发生成,msbuild,continuous-integration,tfsbuild,Msbuild,Continuous Integration,Tfsbuild,这是我在TeamCity中使用的一个功能-我可以指定某个构建配置将由另一个构建配置的成功触发 我甚至可以将一个构建的结果传递给另一个构建——但这可能要求太高了 我正在寻找TFS2008中的类似功能,是否有方法在生成配置上设置触发器,使其在另一个成功完成后启动?我在TFSBuild.proj中使用以下目标: 将新目标注入到构建过程中。只有在成功创建“删除”时,我们才会触发依赖的生成: <PropertyGroup> <DropBuildDependsOn>

这是我在TeamCity中使用的一个功能-我可以指定某个构建配置将由另一个构建配置的成功触发

我甚至可以将一个构建的结果传递给另一个构建——但这可能要求太高了


我正在寻找TFS2008中的类似功能,是否有方法在生成配置上设置触发器,使其在另一个成功完成后启动?

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

将新目标注入到构建过程中。只有在成功创建“删除”时,我们才会触发依赖的生成:

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

美元(DropBuildDependsOn);
CreateDependentBuildItemGroup;
触发器相关的构建;
创建一个项目组,其中包含要触发的依赖生成的列表(Include属性将列出在构建资源管理器中显示的依赖生成的名称-在下面的示例中,依赖生成称为“集成”)。在我们的构建过程中,有时我们希望触发多个构建,并且我们希望将下一个构建指向当前构建生成的二进制文件(在本例中,我希望对生成的二进制文件运行集成测试)。请注意,绕过配置名称中空格的黑客行为-例如“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>

/p:CallingBuildDropFolder=$(DropLocation)\$(BuildNumber)\Mixedp~1\Ship;CiSmallBuildNumber=$(CiSmallBuildNumber);BuildNumberPostFix=$(BuildNumberPostFix)
/优先权:高于正常
现在,触发构建。请注意,我们使用了一个自定义的GetOption:我们希望确保依赖的生成使用与当前生成相同的变更集-我们不能使用最新的,因为可能有人同时签入了-因此我们希望“链”中的所有依赖生成都基于相同的变更集。实际的命令在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>

TfsBuild开始$(TeamFoundationServerUrl)$(TeamProject)

我希望这有助于……

你能发布完整的文件吗?(和模板)?感谢书-离开了那份工作,不再有访问权。真的,以上这些应该足够了……没问题。使用构建定义模板解决了这个问题。