Team Build 2008

Team Foundation Server (TFS) 本质上是面向团队的。当然,由一个人组成的团队也可以使用它,但 TFS 实际上是针对与开发项目中其他人之间的协作。
构建自动化不再只是按 F5。构建自动化涉及的是收集、汇编、验证和审核。其要旨就是收集组成解决方案的所有产物,然后根据定义明确的集成计划将这些产物进行汇编。编译是在汇编阶段中定义的典型任务。您可以使用各种自动化测试(通常使用构建验证测试 (BVT) 或冒烟测试)来验证团队的集体作品。
最后,您需要执行某些类型的审核来评估构建的整体质量。审核流程所提供的数据可帮助您解答各种棘手的问题。例如,截至此构建的各功能是否能创造一个产品?产品是否具备高质量?是否出现了某些退步?是否是按照日程表完成工作?构建审核的价值在于使您可以轻松地掌握团队工作情况。
在本专栏中,我将向您介绍 Visual Studio 2008 Team Foundation Server Build (Team Build),并带您了解创建和运行 Team Build 的过程。我还将展示目前可供您用于针对 Team Build 2008 进行编程的托管 API。

关于 Team Build
Team Build 是 TFS 2008 的核心功能。Microsoft 旨在将其打造为行业强势构建自动化工具。可以说它为您的团队提供了 F5 体验。在典型环境中,您将在其专用的服务器上安装 Team Build(如果您的团队非常小或预算很紧张,则可以在 TFS 上安装 Team Build)。
2008 版本的 Team Build 是一次较大的更新,这一点与 TFS 的其他部分不同。在 2005 版本中,Microsoft 打造了一款优秀的构建自动化产品。Team Build 2005 利用 MS-Build 作为其引擎,支持多项您所期望的核心自动化功能:版本控制、编译、多构建类型、单元测试、静态分析和代码覆盖。
此外,它还提供卓越的报告功能,包括构建报告和对 TFS 数据仓库的数据更新,以支持历史趋势分析。2005 版本的 Team Build 还支持多构建计算机、构建通知以及从命令行或通过团队资源管理器用户界面启动构建。
在 Team Build 2008 中,Microsoft 做出了更深层次的改进。主要的增强功能包括持续集成支持、构建排队、通过“团队资源管理器”安排构建日程以及托管对象模型。此外,Microsoft 将构建代理定义与构建定义分离,创建了一个构建定义编辑用户界面,并添加了更高效的构建管理工具。
与稳健的 Team Build 2005 功能集相结合后,Team Build 2008 呈现了一个引人注目的构建自动化解决方案。此外,由于 Microsoft 继续支持向后兼容性,因此,即使开发团队仍在使用 Visual Studio 2005,您也可以升级 TFS 安装和 Team Build 服务器。

创建 Team Build
要使用 Team Build,您自然需要安装 TFS,单个服务器或双服务器配置皆可。您需要已安装 Team Build 并正确配置您的构建服务器。有关详细信息,请参阅最近更新的 Team Foundation 安装指南。最后,您还需要一个已将某些代码签入版本控制库的团队项目。
在安装了 Team Foundation 服务器客户端的 Visual Studio 2008 中,打开加载了您的团队项目的“团队资源管理器”窗口。在本示例中,假定您已使用 MSF-Agile 模板创建了一个名为 MSDNMag 的团队项目。(如果您希望向下继续进行,可从本专栏及 Team System 2008 TFS 和 Team Suite 虚拟 PC 映像下载代码。)本例使用一个名为 MSDNMag 的自定义工作区,并将树干映射到虚拟 PC 映像中的 C:\Work。
完成上述所有操作后,可以在“团队资源管理器”窗口中展开 MSDNMag 团队项目节点并找到 Builds 文件夹。如果右键单击 Builds 文件夹,会显示出很多选项。此时您应关注的是“New Build Definition”(新建构建定义)命令。选中该选项后,随即显示“Build Definition”(构建定义)对话框(请参见图 1)。
图 1 空白的“Build Definition”(构建定义)对话框(单击图像可查看大图)
与 Team Build 2005 中的向导不同,在您需要编辑某个构建定义时可以返回此对话框。首先要提供构建名称,例如 SimpleBuildExplorer-OnDemand。另外,您可以通过选中“Disable This Build Definition”(禁用该构建定义)选项使该构建保持离线状态。
创建新构建时,您必须提供构建定义名称和 Team Build 项目文件,并指定构建代理和放置位置。也就是说,我认为第二个选项“Workspace”(工作区)很关键。
在 Team Build 2005 中,“Workspace”(工作区)选项是您必须了解的选项。实现细节已经发生了更改,但用途保持不变:限制 Team Build 在构建中获取资源时下载的产物。在 Team Build 2005 中,您需要修改一个名为 WorkspaceMapping.xml 的文件。在 Team Build 2008 中,可使用与工作区映射对话框中类似的 GUI 来进行版本控制(请参见图 2)。
图 2 “Build Definition”(构建定义)对话框的工作区页面(单击图像可查看大图)
通过工作区可定义将源代码库的哪些内容用作构建的组成部分。默认情况下,Team Build 将团队项目的树干映射到构建所使用的源下载位置(运行构建的代理与构建定义相关联时可以控制的要素)。有一点需要明确,如果您不调整此设置,则每次执行构建时,Team Build 都会对树干执行一个 get 命令,从而获取一切最新内容。在您进行演示或测试时这算不上什么大事,但一旦您在团队项目和多个分支中要从事半年的工作,则最好不要通过此方式运行构建。
即使此处的演示场景只有一个 Visual Studio 解决方案,您也应该调整该映射。单击“Source Control Folder”(源代码管理文件夹)列下的第一项时,您可以选择键入一个受限路径,也可以使用“Browse for Folder”(浏览文件夹)对话框。在本例中,我将“Source Control Folder”(源代码管理文件夹)设置为 $/MSDNMag/Main/src/TeamSystem/C08。
就像在用于版本控制工作区映射的对话框中一样,您可以定义多个文件夹映射。变量 $(SourceDir) 是 Team Build 扩展到构建目录的环境变量,在构建代理属性对话框中为构建代理指定该目录。通常您要使用的是 $(SourceDir),以便路径为相对路径。但 Team Build 并不强制您使用它。在本例中,我将其保持原样。
最后,如果您现有工作区中的所有映射都按照您的期望进行的配置,则您可以使用“Copy Existing Workspace”(复制现有工作区)选项复制映射的版本控制文件夹部分,从而节省您的时间。
在定义了工作区设置后,您需要定义构建项目文件。单击“Project File”(项目文件)选项时,您可以提供已在版本控制下的现有 TFSBuild.proj 文件的路径。TFSBuild.proj 是 2005 版本中包含所有构建配置数据的 XML 文件,也是用户进行定制以增强实际构建过程的文件。Team Build 2008 在构建定制中继续使用该文件,但与构建定义相关的大多数数据均存储在 TFS 数据库中。如果您还没有该文件,可单击“Create”(创建)按钮并使用简单向导构建一个文件。
Team Build 2008 中的一个重大变化是您现在可以自己指定 TFSBuild.proj 文件的存储位置。在 Team Build 2005 中,Microsoft 会将该路径硬编码为版本控制库中某个特定位置。默认情况下,Team Build 2008 对话框指定一个与 Team Build 2005 兼容的路径,形式为 %TeamProjectName%/TeamBuildTypes/%BuildDefinitionName%。
在本例中,为所提议的版本控制文件夹指定的路径是 $/MSDNMag/TeamBuildTypes/SimpleBuildExplorer-OnDemand。能够更改路径的最大好处是现在可以用其他产物来扩充 TFSBuild.proj 文件。在本例中,接受默认路径,然后单击“Create”(创建)按钮。
单击“Create”(创建)按钮时,Team Build 会显示一个向导。该向导是从 Team Build 2005 版本保留下来的少数 UI 之一。第一个页面会请您选择要构建的 Visual Studio 解决方案。该向导会对显示的列表进行筛选,仅显示那些相对于您的工作区映射可用的解决方案。如果不更改默认的工作区映射,您会看到团队项目中的所有解决方案。选择所提供的单个解决方案,然后单击“Next”(下一步)。
向导的第二页用于选择要构建的 Visual Studio 配置类型。尽管该向导仅提供了“Debug”(调试)和“Release”(发布)类型的配置,但您可以输入自定义配置。该规则同样适用于“平台”。接受默认选项,然后单击“Next”(下一步)。
向导的最后一页可用于控制测试和静态分析执行。需要在构建代理计算机上安装 VSTS 才能使测试执行和静态分析正常进行。与在 Team Build 2005 版本中一样,您也可以选择测试元数据文件,并从中选择任何支持无人参与执行的测试列表。但您也可以选择让 Team Build 自动扫描您的输出程序集以找出与 MSTest 兼容的测试,并在没有测试列表的情况下运行这些测试。如果您已在一个或多个 Visual Studio 项目中启用了静态分析,则可以让 Team Build 执行静态分析。本专栏中的示例解决方案不包含任何测试或静态分析,因此单击“Finish”(完成)结束该向导并创建 TFSBuild.proj 文件。
此时,您只需要完成构建默认设置即可。首先,我们来看一看保留策略和触发器设置。Team Build 2008 超越 Team Build 2005 版本的一个重大改进就是现在允许您根据每个构建定义来配置保留策略(请参见图 3)。根据特定构建的结果,您可以控制 Team Build 保留多少构建结果。
图 3 控制构建定义保留策略(单击图像可查看大图)
构建完成后,您可以对构建结果作出标记,这样 Team Build 就可以忽略保留策略而将其保存。在本例中要注意的是,您应将保留策略设置为默认值。
如果您在 Team Build 2008 中单击“Trigger”(触发器)选项,则它会像 Team Build 2005 一样仅在您要求时才运行构建。但您将注意到,Team Build 现在也支持持续集成 (CI)。(有关 CI 的详细信息,请参阅 2008 年 3 月的文章“使用持续集成重新定义构建过程”。)这意味着,只要有人签入对构建定义的工作区映射所映射的文件的更改,就会有一个构建排入队列。该对话框以“Build each check-in (more builds)”(构建每个签入(更多构建))选项表明了这一点。
第二个选项“Accumulate check-ins until the prior build finishes (fewer builds)”(累积签入,直到上一个构建完成(更少构建))可提供延迟形式的 CI。最后一个选项可使您配置按日程表执行的构建(请参见图 4)。
图 4 将 Team Build 配置为按日程表执行构建(单击图像可查看大图)
您应保留触发器的默认设置,即签入不触发新构建,然后选择“Build Defaults”(构建默认值)选项。使用构建默认值指定要使用的构建代理以及构建输出的放置位置。您可以使用 UNC 路径指定放置位置。如果使用 Microsoft 提供的虚拟 PC 映像,则可以输入 \\localhost\Drops\MSDNMag\SimpleBuildExplorer-OnDemand。仅需要存在共享项。Team Build 将在必要时创建额外的子文件夹。Team Build 将使用构建号在此路径下创建一个文件夹。
创建共享项时,您需要确保分配了正确的权限。Team Build 和 TFS 服务帐户至少需要具备对共享项的“完全控制”权限。此外,您需要向负责发布与构建相关的测试结果的人员赋予“写入”权限。您应向需要获取已完成构建的人员赋予“读取”权限。
假定已完成了共享配置,则需要指定构建代理。如果您已经定义了某个构建代理,可从组合框中选择它。如果没有定义,则可以单击“New”(新建)按钮,这将打开标准的“Build Agent Properties”(构建代理属性)对话框。在本例中,您需要定义新代理,因此请单击“New”(新建)。

创建构建代理
与 Team Build 2005 版本不同,Team Build 2008 构建代理独立于构建定义。定义了某代理后,您很容易就可以再次使用它。通过“Build Agent Properties”(构建代理属性)对话框可以定义与该代理相关的所有关键属性。首先需要提供显示名称和可选的说明。然后以 NETBIOS 或 DNS 名称的形式提供计算机名称。显示名称和计算机名称可以完全不同。如果使用的是 SSL,则可以指定该选项。
一个关键设置就是工作目录。默认情况下,它使用的路径形式为 $(Temp)\$(BuildDefinitionPath)。尽管这对于多数构建都有效,但会由于令人生畏的 MAX_PATH 问题导致故障。Windows Server 2003 计算机上的 $Temp 将是 %SystemDrive%\Documents and Settings\<build agent service account>\Local Settings\Temp。字符实在太多了。我通常建议人们将其改短一些,尤其是在构建数据库专业版本时。在本示例中,将工作目录更改为 C:\Builds\$(BuildDefinitionPath)。
最后,您可以控制该代理的状态。这对于维护特别有用。此外,如果 TFS 无法联系某个构建代理,则会将代理的状态更改为无法访问,这样,在管理员更改设置前就会阻止使用该代理。将该设置保留为启用状态,然后单击“OK”(确定)关闭完成的“Build Agent Properties”(构建代理属性)对话框(请参见图 5)。返回“Build Definition”(构建定义)对话框,所有的三角形警告标志都将消失,您可单击“OK”(确定)完成构建定义。
图 5 已完成的“构建代理属性”对话框
在“团队资源管理器”窗口的 Builds 文件夹下,您将看到您创建的构建定义。如果右键单击该定义,则可以看到一个“Edit Build Definition”(编辑构建定义)选项,通过该选项可以返回到刚刚用过的“Build Definition”(构建定义)对话框。此外,您还可以使用“Queue New Build”(排队新构建)选项使新构建排队。
与 Team Build 2005 不同,Team Build 2008 现在支持构建的排队,如果 Microsoft 要完全支持持续集成,这是一项必要功能。选择此选项后,将打开“Queue Build”(排队构建)对话框(请参见图 6),您可以调整几个选项。首先,您可以根据需要轻松地将默认构建代理更改为替代项。其次,您可以调整放置位置。此外,您可以通过调整“Priority in queue”(队列中的优先级)选项使某个特定构建“插队”。最后,如果用户具有“管理构建”权限,则还可以传递 MSBuild 命令行参数。
图 6 “Queue Build”(排队构建)对话框

运行 Team Build
单击“Queue”(队列)以启动构建。执行此操作时,将打开更新的“Build Explorer”(构建资源管理器)窗口。该窗口有两个主选项卡。默认情况下,“已排队”(Queued)选项卡将显示所有已排队的构建,而不考虑其代理或状态是什么。您会看到几个组合框,用于根据构建定义、构建状态或构建代理来调整“构建资源管理器”将显示哪些构建。
“已完成”(Completed)选项卡将显示已完成的构建并支持相同类型的筛选。启动构建时,可双击构建以查看实时构建报告。Team Build 会在整个构建过程中实时更新此报告。
运行 Team Build 时,会发生很多操作。TFS 从队列中启动该构建后,构建代理就已准备好运行该构建。TFS 将创建一个构建号,构建代理会将源代码与构建定义中指定的位置同步。该代理随后将编译这些代码并在必要时运行代码分析。然后构建代理将运行测试。然后该代理会运行一个用于更新与该构建号关联的所有工作项的任务。
例如,MSF-Agile 模板中的默认任务工作项具有一个 Team Build 更新的“Integration Build”(集成构建)字段。该代理将计算代码覆盖率(如果将测试配置为作为构建的一部分运行且启用了代码覆盖)并确定上一个合格构建(编译成功)与当前构建之间的所有更改集。它会将文件复制到放置共享、将构建结果公布给 TFS,而 TFS 会触发一个构建完成事件。有关 TFS 事件的详细信息,请参阅本人的2008 年 5 月专栏
Microsoft 在 Team Build 2008 中作出了两个与测试和工作项相关的重要变更。 第一个变化是如果构建出现一次或多次测试失败,并不算做构建失败。 与在 Team Build 2005 中一样,具有一个或多个失败测试的构建将显示为“部分完成”,而不是“失败”。其次,在 Team Build 2005 中,在第一次运行构建时,Team Build 会列出自团队项目开始以来在第一个构建报告中构建的所有工作项以及与工作项相关的更改集。Team Build 2008 仅在构建第一次成功运行后才开始显示和更新工作项。在我的下个专栏中,我将介绍如何通过构建定制来调整这些行为。

Team Build 编程
Team Build 2008 中最明显的增强功能之一就是添加了托管 API。Microsoft.TeamFoundation.Build.Client.dll 是您将使用的主要程序集。本专栏的示例应用程序引用了此程序集以及 Microsoft.TeamFoundation.Client.dll 和 Microsoft.TeamFoundation.VersionControl.Client.dll 程序集。
该示例应用程序是一个运用某种新 APL 的简单的 Windows 窗体应用程序。该应用程序与 TFS 连接并枚举了所有团队项目的列表,从而将它们加载到树视图控件中。在各个团队项目下,它将添加“Build Agents”(构建代理)和“Build Definitions”(构建定义)节点(请参见图 7)。
图 7 示例应用程序(单击图像可查看大图)
展开某节点时,TreeNode 的 BeforeExpand 事件中的代码将运行并枚举可用的构建代理、构建定义或已完成的构建,这具体取决于您已展开的节点。此外,主窗体承载了一个“Property Grid”(属性网格)控件。在选择具有非空标记值的节点时,该应用程序会将引用对象加载到“Property Grid”(属性网格)的 SelectedObject 属性中。图 7 显示了已展开 MSDNMag 团队项目并选定了主构建代理的应用程序。
应用程序的大部分都是简单的枚举代码。但它却具有一个 Microsoft 在“团队资源管理器”没有体现的功能。当您定义某构建代理时,TFS 会将构建代理的范围限定在该特定团队项目。但我发现很多组织仅有一个或两个构建代理。这意味着他们必须多次重新创建构建代理。使用示例应用程序时,如果右键单击某构建代理实例,将显示一个上下文菜单以及一个“Copy Agent To”(将代理复制到)命令(请参见图 8)。
图 8 Copy Agent To(将代理复制到)命令
选择此选项会打开一个对话框,该对话框用于选择要将构建代理定义复制到的团队项目。所有相关的代码均在图 9 所示的CopyAgentToToolStripMenuItem_Click 事件处理程序中。
Private Sub CopyAgentToToolStripMenuItem_Click( _
  ByVal sender As System.Object, _
  ByVal e As System.EventArgs) _
  Handles CopyAgentToToolStripMenuItem.Click

  Dim current As TreeNode = tv.SelectedNode
  Dim ba As IBuildAgent = _
    TryCast(current.Tag, IBuildAgent)

  If ba Is Nothing Then Exit Sub

  Dim parentProject As String = ba.TeamProject

  Using frm As New frmPickProject
    frm.cboProjects.DataSource = _
      (From item In teamProjectNames _
       Where item <> parentProject _
       Select item).ToArray()

    If frm.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
      Dim teamProjectName As String = _
        frm.cboProjects.SelectedItem.ToString()

      Dim existingAgent = _
        (From item As IBuildAgent In _
         m_bs.QueryBuildAgents(teamProjectName) _
         Where item.Name = ba.Name).SingleOrDefault

      If existingAgent Is Nothing Then
        Dim newBuildAgent As IBuildAgent = _
        ba.CopyTo(teamProjectName)
        newBuildAgent.Save()

        MessageBox.Show(newBuildAgent.Name & " copied.")
      Else
        MessageBox.Show(existingAgent.Name & " already exists.")
      End If
    End If
  End Using
End Sub
假定选定的代码将某标记设置为 IBuildAgent 引用,该代码将显示 frmPickProject 窗体。此窗体包含一个显示所有可用团队项目(当前构建代理的团队项目除外)的组合框。
该代码对所有团队项目名称(您第一次展开树视图根项时所收集的)字符串阵列执行 LINQ 查询,以此填充该组合框的数据源。假定您选择了某团队项目并在项目选择窗体中单击“OK”(确定),该代码会运行 LINQ 查询以验证目标团队项目是否有同名的构建代理。如果发现一个同名的构建代理,则会显示一条消息。但如果没有发现,它将复制该构建代理定义。
特别要注意的是,Microsoft 提供了一种 CopyTo 方法。当我最初设计出该代码时,我计划对新的 IBuildAgent 实例执行逐个属性的复制。这看起来就像 Microsoft 引入了 API 但未添加到用户界面一样。
希望您能感受到 Team Build 2008 是一款行业强势构建产品。如果您目前正在使用 Team Build 2005,则升级到 Team Build 2008 会为您增加很多价值。在我的下个专栏中,我将深入探讨构建定制以及如何使您的构建不仅能编译解决方案,还可以部署到测试环境中等内容。

 源文:http://msdn.microsoft.com/zh-cn/magazine/dd150090.aspx

 

posted @ 2010-02-22 14:30  Jim哥  阅读(505)  评论(0)    收藏  举报