【问题标题】:Trigger build when another finished successfully in TFS 2008当另一个在 TFS 2008 中成功完成时触发构建
【发布时间】:2011-04-17 19:04:58
【问题描述】:

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

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

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

【问题讨论】:

    标签: msbuild continuous-integration tfsbuild


    【解决方案1】:

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

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

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

    创建一个项目组,其中包含我们要触发的依赖构建的列表(Include 属性将列出依赖构建的 name,因为它出现在构建浏览器中 - 在下面的例子中,依赖的构建称为“集成”)。在我们的构建过程中,有时我们希望触发多个构建,并且我们希望将下一个构建指向当前构建生成的二进制文件(在此示例中,我想对生成的二进制文件运行集成测试)。请注意绕过配置名称中的空格的技巧 - 例如,“任何 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:我们要确保依赖构建使用与当前构建使用相同的变更集 - 我们不能使用最新的,因为同时有人可能已经签入 - 所以我们希望所有依赖构建我们的“链”都基于相同的变更集。实际的命令在 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>
    

    希望对你有帮助……

    【讨论】:

    • 你能发布完整的文件吗? (和模板)?谢谢
    • 抱歉 - 从那份工作继续,不再有访问权限。真的,上面应该有够了……
    • 没问题。确实使用构建定义模板弄清楚了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    相关资源
    最近更新 更多