【发布时间】:2011-04-17 19:04:58
【问题描述】:
这是我习惯于 TeamCity 的一个功能 - 我可以指定某个构建配置将由另一个构建配置的成功触发。
我什至可以将一个构建的结果传递给另一个构建 - 但也许这要求太多了。
我正在寻找 TFS2008 中的类似功能,有没有办法在构建配置上设置触发器,使其在另一个成功完成后启动?
【问题讨论】:
标签: msbuild continuous-integration tfsbuild
这是我习惯于 TeamCity 的一个功能 - 我可以指定某个构建配置将由另一个构建配置的成功触发。
我什至可以将一个构建的结果传递给另一个构建 - 但也许这要求太多了。
我正在寻找 TFS2008 中的类似功能,有没有办法在构建配置上设置触发器,使其在另一个成功完成后启动?
【问题讨论】:
标签: msbuild continuous-integration tfsbuild
我在 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:"%(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>
希望对你有帮助……
【讨论】: