这是我从TeamCity习惯的一个功能 - 我可以指定某个构建配置将由另一个构建配置的成功触发。
我甚至可以将一个构建的结果传递给另一个构建 - 但也许这要求太多。
我在TFS2008中寻找类似的功能,有没有办法在构建配置上设置触发器,它将在另一个成功完成后启动?
答案 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:"%(DependentBuild.MsBuildArgs)"">
<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>
我希望有帮助...