如何链接TFS构建?

时间:2009-07-24 15:35:16

标签: tfs msbuild team-build chained

我有一个场景,我想从另一个调用一个TFS构建,第一个构建构建,第二个构建分段。这将允许我为同一解决方案进行多个自定义分段。

我知道,我可以在第二个版本中使用exec任务执行此操作,并调用tfsbuild.exe从第一个构建定义对构建进行排队。但是想知道是否有人知道更好的方法吗?

4 个答案:

答案 0 :(得分:7)

这取决于你想要做什么。

1)您是否希望build + staging作为一个操作运行?这样您最终得到一个整合的构建报告,一个日志文件,服务器构建队列中的一个作业,每个步骤由执行上一步骤的同一个构建代理按顺序执行?

如果是这样,那么你基本上就是正确的道路。我不会<Exec&gt;但是对tfsbuild.exe来说 - 运行一个全新的构建有很多开销,我不确定潜在的副作用是什么。相反,我会使用<Call&gt;执行staging脚本中定义的msbuild任务的任务。

2)您是否希望“构建版本”实际排队单独的“暂存构建”?单独的报告,日志文件和&amp;队列中的斑点?如果您有多个Build Agent,可以并行执行这些机会吗?

如果是,那么:

  • 为暂存
  • 创建新的构建定义
  • 使用Team Build API为原始构建定义添加一些代码,这些代码将[一个/几个]新构建定义排队。 Sample code
  • 从原始构建定义中删除与核心构建无关的任何内容
  • 确保新的“暂存”定义没有任何自动触发器(时间间隔,签入事件等)

答案 1 :(得分:5)

以下是我完成此操作的方法(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);

步骤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>

步骤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,为了支持这一点,我们在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)'==''"/> 

步骤4:现在使用Custom_PreBuild和Custom_PostBuild目标创建目标文件Custom.Target和EmptyCustom.Target,然后就完成了。

我添加了对更新构建步骤的支持以及本博客文章范围之外的一些其他小问题,但这应该可以帮助您入门。

答案 2 :(得分:1)

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

创建另一个构建定义并调用其他构建定义来触发。

http://blogs.objectsharp.com/post/2012/02/04/Create-a-Master-Build-that-calls-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/

答案 3 :(得分:0)

您是否尝试将解决方案部署到暂存环境中?如果是这样,一个好方法是使用codeplex中的TFSDeployer,它将根据您选择的构建质量运行不同的PowerShell脚本...