代码之家  ›  专栏  ›  技术社区  ›  Dror Helper

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

  •  10
  • Dror Helper  · 技术社区  · 14 年前

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

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

    我在tfs2008中寻找类似的功能,有没有一种方法可以在构建配置上设置触发器,该配置将在另一个成功完成后启动?

    1 回复  |  直到 8 年前
        1
  •  6
  •   Peter McEvoy    14 年前

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

    将新目标注入到构建过程中。只有成功创建了一个“drop”,我们才会触发依赖的构建:

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

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

    我希望这有助于…