如何链TFS构建?(How to chain TFS builds?)

2019-07-30 18:47发布

我有,我想从另一个调用一个TFS构建一个场景,第一个做的构建,第二个不分期。 这将使我同样的解决方案做多个自定义升级。

我知道,我可以在第二内建一个exec任务顺利完成这件事,并呼吁tfsbuild.exe从第一生成定义排队构建。 但不知道是否有人知道的更好的办法?

Answer 1:

这取决于你正在尝试做的。

1)你想构建+分期为一个操作运行? 所以,你最终得到一个统一的构建报告,一个日志文件,在服务器的构建队列中的一个工作,由执行上一步骤相同的生成代理顺序执行的每一步?

如果是这样,那么你基本上在正确的道路上。 我不会<Exec >出来,虽然tfsbuild.exe -运行一个全新的构建有很大的开销,我不知道潜在的副作用是什么。 相反,我会用<Call >任务来执行你的脚本分期(S)定义的MSBuild任务。

2)你想“打造打造”实际上排队一个单独的“分期建设”? 独立报告,日志文件,及在排队点? 机会来并行执行,如果您有多个生成代理?

如果是这样,那么:

  • 创建分期一个新的构建定义(一个或多个)
  • 一些代码添加到您的原生成定义该队列[一个/多个]使用团队生成API新的版本定义。 示例代码 。
  • 删除任何东西不是从原来的生成定义相关的核心构建
  • 确保新的“升级”的定义没有任何自动触发(时间间隔,签入事件,等等)


Answer 2:

这里是我做到了这一点( http://sajojacob.com/2009/08/how-to-chain-tfs-builds/ )

如何串连TFS构建? 发布于2009年8月5日,由思潮 - 没有评论↓

我的一个同事最近@gdurzi问我这个问题。 听上去很直白地支持了使用TFS右侧框中的? 太多的怪癖与此有关。 我建议在使用以往忠实MSBuild任务作出TFSBuild.exe呼叫排队从第一TFSBuild.proj一个新的版本像这样的东西

TFSBuild.exe开始/队列%TFSSVR%%TEAMPROJECT%%BUILDTYPE%

使用TFSBuild.exe的问题是,你不能将生成代理作为对我们来说是一个大忌命令行参数。

有迹象表明,你可以采取根据您的具体情况的几种方法让我们在这里定义的情况下,你有一个Main_Build TFS生成定义,建立自己的核心项目,并希望有多个分期的能力建立运行编译相同Main_Build /建筑,但基于谁呼吁Main_Build进行定制上演部署。 非常有用的,当你有哪些推出多个客户需要自定义的预构建和产品生成后每个客户端的行为。 所以在这里是做建立与2008年TFS链接的一种方式。

第1步:让我们创建一个使用哪个队列使用与构建定义文件关联的默认生成代理的生成在Team Foundation对象模型的自定义MSBuild任务。

排队示例代码: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);

第2步:现在QueueTFS.dll复制到TFS要创建分段构建定义文件的新文件夹。

现在,让我们创建一个使用我们新的MSBuild任务,并覆盖EndToEndIteration目标最小TFSBuild.proj文件。 这将是我们的舞台构建定义将触发Main_Build构建。 请注意,您必须创建此TFSBuild.proj用手和简单点从构建定义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>

第3步:编辑与预构建和构建后的目标电话的Main_Build TFSBuild.proj文件。

  <Target Name=“BeforeCompile“>

    <CallTarget Targets=“Custom_PreBuild“/>    

  </Target>

  <Target Name=“AfterDropBuild“ Condition=“‘$(BuildBreak)’!=’true’“>    

    <CallTarget Targets=“Custom_PostBuild“/>

  </Target>

我们想跑,以支持这一点,我们在我们的Main_Build TFSBuild.proj添加条件进口引入缺省目标空Custom_PreBuild和Custom_PostBuild目标文件的功能本身Main_Build为好,。 $(CustomTarget)是你会通过什么样的命令行参数在步骤1中request.CommandLineArguments

<Import Project="$(CustomTarget)" Condition="'$(CustomTarget)'!=''"/>
<!--Import CustomContoso.Target if no partner is passed in—>
<Import Project="EmptyCustom.Target" Condition="'$(CustomTarget)'==''"/> 

第4步:现在创建你的目标文件Custom.Target和EmptyCustom.Target与Custom_PreBuild和Custom_PostBuild目标和你做。

我添加了更新建设步骤和该博客文章的范围,但超出这个应该有希望让你开始其他一些次要的东西支持。



Answer 3:

下面是其他有用的链接。 它可以帮助别人。

创建另一个构建定义和调用其它生成定义被触发。

http://blogs.objectsharp.com/post/2012/02/04/Create-a-Master-Build-that-c​​alls-other-Builds.aspx

http://blog.stangroome.com/2011/09/06/queue-another-team-build-when-one-team-build-succeeds/

传递参数给儿童构建。

http://blog.stangroome.com/2014/02/19/queue-a-team-build-from-another-and-pass-parameters/

TFS构建扩展到队列中的另一个生成定义

http://tfsbuildextensions.codeplex.com/



Answer 4:

你们是不是要部署的解决方案,以暂存环境? 如果是一个很好的方法是使用TFSDeployer从CodePlex上,这将运行基于您选择构建质量diferent PowerShell脚本...



文章来源: How to chain TFS builds?