use*_*242 16 msbuild tfs team-build chained
我有一个场景,我想从另一个调用一个TFS构建,第一个构建构建,第二个构建分段.这将允许我为同一解决方案进行多个自定义分段.
我知道,我可以在第二个构建中使用exec任务执行此操作,并调用tfsbuild.exe从第一个构建定义对构建进行排队.但是想知道是否有人知道更好的方法?
这取决于你想要做什么.
1)您是否希望build + staging作为一个操作运行?这样您最终得到一个整合构建报告,一个日志文件,服务器构建队列中的一个作业,每个步骤由执行上一步骤的同一构建代理按顺序执行?
如果是这样,那么你基本上就是正确的道路.我不会<Exec> tfsbuild.exe - 运行一个全新的构建有很多开销,我不知道潜在的副作用是什么.相反,我会使用<Call>任务来执行在暂存脚本中定义的msbuild任务.
2)您是否希望"构建版本"实际排队单独的"暂存构建"?队列中是否有单独的报告,日志文件和点?如果您有多个Build Agent,可以并行执行这些机会?
如果是这样,那么:
以下是我如何完成这项工作(http://sajojacob.com/2009/08/how-to-chain-tfs-builds/)
如何链接TFS构建?发表于2009年8月5日由Sajo发表 - 没有评论↓
我的一位同事@gdurzi最近问了我这个问题.听起来很简单,TFS支持开箱即用吗?这有太多的怪癖.我建议使用永远忠实的MSBuild任务来调用TFSBuild.exe,从第一个TFSBuild.proj中为这个新构建排队
TFSBuild.exe开始/队列%TFSSVR %% TEAMPROJECT %% BUILDTYPE%
使用TFSBuild.exe的一个问题是,您无法将Build代理作为命令行参数传递,这对我们来说是一个交易破坏者.
根据您的特定场景,您可以采用多种方法,所以让我们在这里定义场景,您有一个Main_Build TFS构建定义,用于构建您的核心项目,并且您希望能够有多个分段构建运行相同的Main_Build进行编译/构建,但可以根据谁调用Main_Build进行自定义暂存.当您的产品推出到多个客户端时需要为每个客户端进行自定义预构建和后构建操作,这非常有用.所以这是使用TFS 2008进行Build Chaining的一种方法.
步骤1:让我们使用Team Foundation对象模型创建自定义MSBuild任务,该模型使用与Build定义文件关联的默认构建代理对构建进行排队.
排队示例代码:QueueTFS.cs
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.Build.Client;
// Get the team foundation server.
TeamFoundationServer _tfsServer = TeamFoundationServerFactory.GetServer(_tfs);
// Get the IBuildServer
IBuildServer buildServer = (IBuildServer)_tfsServer.GetService(typeof(IBuildServer));
// Get the build definition for which a build is to be queued.
IBuildDefinition definition = buildServer.GetBuildDefinition(teamProject, buildDefinition);
// Create a build request for the build definition.
IBuildRequest request = definition.CreateBuildRequest();
request.CommandLineArguments = "Pass any custom command line args here"; // Ex: Custom Targets file
// Queue the build.
buildServer.QueueBuild(request, QueueOptions.None);
Run Code Online (Sandbox Code Playgroud)
步骤2:现在将QueueTFS.dll复制到TFS中要创建登台构建定义文件的新文件夹.
现在让我们创建一个最小的TFSBuild.proj文件,它使用我们新的MSBuild任务并覆盖EndToEndIteration目标.这将是我们的Staging构建定义,它将触发Main_Build构建.请注意,您必须手动创建此TFSBuild.proj,并将项目文件位置从Build definition UI指向新文件夹.
最小TFSBuild.proj的示例代码:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TeamBuild\Microsoft.TeamFoundation.Build.targets" />
<UsingTask TaskName="MyNewCustomTFSTask" AssemblyFile="QueueTFS.dll"/>
<Target Name="EndToEndIteration">
<Message Text="About to trigger main build" Importance="high"/>
< MyNewCustomTFSTask TFS="http://TFSServer.com:8080/" TeamProject="TeamProject" BuildDefinition="Main_Build" TargetsFile="Custom.Target" XYZ="XYZ" />
<!-- When everything is done, change the status of the task to "Succeeded" -->
<SetBuildProperties TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" TestStatus="Succeeded" CompilationStatus="Succeeded"/>
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)
步骤3:使用预构建和后构建目标调用编辑Main_Build TFSBuild.proj文件.
<Target Name=“BeforeCompile“>
<CallTarget Targets=“Custom_PreBuild“/>
</Target>
<Target Name=“AfterDropBuild“ Condition=“‘$(BuildBreak)’!=’true’“>
<CallTarget Targets=“Custom_PostBuild“/>
</Target>
Run Code Online (Sandbox Code Playgroud)
我们希望能够自行运行Main_Build,为了支持这一点,我们在Main_Build TFSBuild.proj中添加条件导入,以导入具有空Custom_PreBuild和Custom_PostBuild目标的默认目标文件.$(CustomTarget)是您在步骤1中作为命令行参数传递给request.CommandLineArguments的内容
<Import Project="$(CustomTarget)" Condition="'$(CustomTarget)'!=''"/>
<!--Import CustomContoso.Target if no partner is passed in—>
<Import Project="EmptyCustom.Target" Condition="'$(CustomTarget)'==''"/>
Run Code Online (Sandbox Code Playgroud)
第4步:现在使用Custom_PreBuild和Custom_PostBuild目标创建目标文件Custom.Target和EmptyCustom.Target,您就完成了.
我添加了对更新构建步骤的支持以及本博客文章范围之外的一些其他小问题,但这应该可以帮助您入门.