DevOps敏捷开发动手实验

注意

本文档使用reST格式编写,内容托管于GitHub。文档内容正在持续编写中,所有标注为 🔧 的部分表示还未编写完毕,如果您在使用中遇到问题,可以通过我们的 coding.net讨论组 来提交问题。

本文档提供2个主要版本:

  • stable: 稳定版本,按照VSALM企业版进行标识,如:v2015.1 表示所对应的是 2015 Update 1版本
  • latest: 最新版本,持续更新。

版本记录:

  • v2015.2: 当前最新稳定版本,适用于Team Foundation Server 2015 Update 2中文版
  • gitlab support

概述

微软DevOps工具链是基于Visual Studio 应用生命周期管理(VSALM - Visual Studio Application Lifecycle Managemnet)的软件管理平台,其中包括如下能力:

  • 产品管理
  • 需求管理
  • 项目管理
  • 任务跟踪
  • 源代码管理(SCM)
  • 测试管理
  • 代码编译持续集成(CI)
  • 发布管理(Release Management)
  • 自动化和数据分析与报表

具体信息可以通过 Visual Studio 产品主页进行了解,或者参考本文档中 关于VSALM 部分。

本动手实验希望通过模拟一个产品从需求到上线的全过程让参与者感受到微软DevOps工具链端到端的管理能力。

更新日期:2016 年 08 月 11 日
作者:徐磊何超
主页:DevOps Hub

内容

快速入门

获取实验账号

获取实验环境

样例项目背景

我们的动手实验将引用一个真实应用。这个样例叫做PartsUnlimited,是根据《凤凰项目》这本书为背景制作的。

_images/the-phoenix-project-book.png

本书讲述了一位IT经理临危受命,在未来董事的帮助和自己“三步工作法”理念的支撑下,最终挽救了一家具有悠久历史的汽车配件制造商的故事。 小说揭示了管理现代IT组织与管理传统工厂的共通之处,让读者不仅能对如何管理IT组织心领神会,更重要的是将以完全不同于以往的视角看待自己的工作环境。

为了让开发者验证微软的DevOps工具链,微软提供了一套以本书中的PartsUnlimited公司为背景的样例程序,由三部分构成: * 使用ASP.NET VNext电子商务网站, * 使用开源的Java和MongoDB的生产管理系统 * 以及中间件系统

全部源代码可以通过GitHub下载,地址:https://github.com/Microsoft/PartsUnlimited

这次所做的演练是基于ASP.NET的电子商务网站中的用户故事而做的。共完成了5个故事,涵盖了用户注册,登陆,查看产品,下订单等主要流程。下面的图片所展示的是PartsUnlimited开发团队使用“用户故事地图”的方式针对这5个用户故事进行的功能点分解,用户故事本身在第一张图片中按照用户的操作流程进行展示,每个用户故事在不同的功能区域(模块)中所需要的功能点在第二张图片中展示。

1.新用户注册
_images/UserStoryOfRegister-1.jpg
_images/UserStoryOfRegister-2.jpg
2.浏览产品
_images/UserStoryOfBrowseProduct-1.jpg
_images/UserStoryOfBrowseProduct-2.jpg
3.下订单
_images/UserStoryOfOrder-3.jpg
_images/UserStoryOfOrder-4.jpg
4.主页促销
_images/UserStoryOfSalePromotion-1.jpg
_images/UserStoryOfSalePromotion-2.jpg
5.产品搜索
_images/UserStoryOfProductSearch-1.jpg
_images/UserStoryOfProductSearch-2.jpg
最后我们将用户故事放入Kanban中的待开发一栏
_images/UserStoryOfWholeKanban.jpg

这些用户故事构成了PartsUnlimited应用的backlog,其中用户故事和功能点分别使用2中不同类型的工作项出现在TFS的敏捷规划工具中。

开发团队介绍

下面介绍下我们这个样例项目的Scrum团队。Scrum中的角色主要分为产品负责人(Product Owner),Scrum主管(Scrum Master)和开发团队。

我们这个虚拟的团队来源于《三国演义》中的刘备团体。因为在《三国演义》中,刘备以帝室之胄,展雄才大略,集五虎上将之勇、伏龙凤雏之智,乱世之中,创蜀汉基业。所以今天我们就借用这个古代敏捷团队来实现我们这个动手实验。

_images/sanguoyanyi.jpg

产品负责人(Product Owner):刘备 职责:主要负责编写用户故事(User Story),为用户故事排列优先级并放入产品积压工作(Product Backlog)

Scrum主管(Scrum Master):诸葛亮 职责:确保所有项目参与者都遵守Scrum规则,保证团队开发计划的正确执行,消除那些影响团队交付目标的障碍,也是团队与外界交互的接口,屏蔽外界对开发团队的干扰。

开发团队:赵云,关羽,张飞(开发) 马超,黄忠(测试) 庞统(架构) 职责:通过实行自管理、自组织和跨职能的开发协作,实现每个迭代的开发计划和产品交付

团队的用户名和密码如下:

动手实验

敏捷项目规划 – 产品规划,迭代规划和项目监控

在这个试验中,您和您的团队成员将使用TFS内置的敏捷规划工具完成产品backlog管理(包括用户故事和积压工作项2级backlog)。对于已经放入backlog的需求进行优先级排序,并按照产品发布版本进行迭代规划,将需求放入迭代形成迭代开发计划,对需求工作量进行估计并按照团队的能力进行迭代工作量规划。

我们还将模拟2-3个迭代的开发过程,由您和你的团队一起完成具体开发任务的更新,跟踪和交付。

最终,我们将使用报表对您的团队的开发过程进行监控和评估,您将可以使用自定义的报表了解在已经完成的迭代中您的团队的效率如何。

在开发中,我们需要对版本进行2个维度的管理,一个是 计划版本 一个是 发布版本 。 计划版本指的是我们希望团队所完成的内容,而发布版本指的是团队实际完成的内容。我们需要跟踪这2个维度之间的差异,以及每个维度内所包含的内容,这样才能完成产品的端到端管理。

_images/end-to-end-planning.png

通过本次实验,您可以学到内置在TFS2015中的敏捷工具和多层级backlog管理工具,以及如何利用它们来帮助您实现在您的团队中快速规划、管理、跟踪您的工作。您将用一个具体的迭代来了解产品积压工作看板、迭代积压工作看板、任务看板来跟踪您的工作流程。我们也将简要了解针对大型团队和组织的增强工具。

练习列表

练习一:敏捷项目管理

本次练习中,您将会学到如何利用TFS2015来管理您的积压工作、创建工作项、将工作细化成任务、分配任务给指定成员、用任务看板来跟踪任务状态。本次练习中所使用的项目管理工具适用于中小型开发团队进行项目开发。

任务一:登陆TFS Web门户
  1. 从任务栏中打开IE浏览器并从收藏栏中打开 TFS Web Portal 链接。
_images/Exercise-1-Open-TFS-Web-Portal-From-Browse.png
  1. 使用用户 刘备 登陆。(用户名和密码请参考快速入门的 样例项目背景 一节内容)
_images/Exercise-1-Login-TFS-Web-Portal-From-Browse.png
  1. 从TFS主页中,选择 浏览 按钮打开项目和团队信息。
_images/Exercise-1-Browse-Projects-and-Teams.png
  1. 选择 PartsUnlimited 项目和默认的团队。
_images/Exercise-1-Select-Project-PartsUnlimited-and-default-team.png
  1. 接下来会出现PartsUnlimited默认团队的主页视图。该视图提供包含各种信息的卡片组合,例如查询结果卡片、新建工作项卡片、冲刺燃尽图卡片、团队成员卡片等等。
_images/Exercise-1-The-team-Portal-of-Project-PartsUnlimited-default-team.png
任务二:管理积压工作项列表
  1. 通过选择屏幕顶部的 Work 标签来导航到积压工作项界面
_images/Exercise-1-Go-to-Backlog-UI.png
  1. 产品积压工作项可以帮助我们定义那些需要做的工作。一旦你拥有一个积压工作,你可以用它来管理当工作进展的状态变更,如:工作完成或与工作项关联的事项被迁入,测试通过,或者其他一些相关事项发生的情况。每个产品积压工作项均有很多不同的字段帮助你对要管理的信息进行跟踪,并提供基于状态转换的工作流来帮助你跟踪进度。
_images/Exercise-1-The-Backlog-UI.png
  1. 试想下当我们的团队成员被要求实现一个新的产品积压工作项。这个产品积压工作项可以使顾客将浏览的产品加入购物车。这个产品积压工作项应该被设置为高优先级,因为产品负责人(PO)从用户那里得到了很强烈需要此功能的反馈。

现在你需要在标题这一栏中输入 将产品加入购物车 ,并点击 添加 按钮将此积压工作项加入列表。

_images/Exercise-1-Create-the-ShoppingCart-service-backlog-item.png

注解

请注意列表中有一条红色的横线,这表示你所新添加的工作项出现的位置,你可以通过点选不同的工作项来控制这条线的位置,将新工作项直接放入特定位置。

如果你的工作项不在正确的位置,请使用鼠标拖拽完成优先级排序操作。

  1. 在产品积压工作列表中,工作项是按照优先级来进行排序的,优先级高的位于最上面。我们刚才创建的工作项拥有高优先级,所以我们应该将它拖拽到列表的最顶端。
_images/Exercise-1-Drag-and-Drop-backlog-item-for-list.png
  1. 双击打开我们刚创建的工作项,我们可以在工作项信息界面中配置该工作项的详细信息。

将该工作项指派给诸葛亮,设置状态为 已批准 ,将工作量设置为 8 。点击 保存并关闭 按钮

注解

在Scrum中,敏捷团队一般使用 故事点 的方式来标识工作量,故事点使用1,2,3,5,8,11这样的 斐波那契数列值 来标识相对工作量。由于在我们进行项目规划时往往无法准确的估计工作量的大小,但是不同工作项之间的相对大小比较容易判断,所以我们这里只标识相对工作量的大小,而将更加准确的工作量估算留待迭代中进行,因为那个时候团队将对积压工作进行分解,形成具体的开发任务,这是我们就可以使用小时来进行更加准确的估算了。

关于**斐波那契数列值**,请查考

https://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97

关于 故事点, 请参考

https://agilefaq.wordpress.com/2007/11/13/what-is-a-story-point/

_images/Exercise-1-Edit-the-detail-information-of-backlog-item.png
  1. 通过将刚创建的工作项拖拽到当前的迭代上来指定该工作项处于当前的迭代周期内。

注意屏幕左侧所列出的迭代列表,这些可以被视为迭代开发计划,将工作项拖入这些节点表示将工作项加入开发计划。

_images/Exercise-1-Drag-and-Drop-backlog-item-to-current-iteration.png

可以在列表中检查该工作项的 迭代路径 列的值来确定该工作项是否已分配到当前迭代周期内。

_images/Exercise-1-Check-the-backlog-item-iteration.png

注解

如果工作项的状态设置为 已关闭 时,该工作项将会从该列表中消失。这样设计正是表达了“积压工作”的含义,只有那些还没有完成的工作才会被显示在这个列表中。

  1. 产品积压工作项视图中我们可以点击右上角的两个缩略的小图表来打开速度图和累积流。速度图通过对比团队在每个迭代完成的工作量来反应团队的开发速度情况。累积流表示在一段时间里处于不同状态的工作项的数量及其变化趋势。
_images/Exercise-1-Velocity-chart-and-burndown-chart.png
任务三:团队容量计划

1. 点击左侧的 冲刺(sprint)1 ,进入迭代1的工作项视图。在此视图中可以看到我们刚放入迭代1的积压工作项“将产品放入购物车”。利用上述方法我们添加多个积压工作项,并将其放入迭代1中,如下图所示。同时在此视图的右上角我们可以为该迭代设置起始日期。一旦我们为迭代设置起始日期后,我们就可以为这个迭代内分配团队资源了。 迭代内的团队的资源分配可以通过 容量 视图来设置。

_images/Exercise-1-The-view-of-sprint-1.png
  1. 选择 容量 链接来查看和设置迭代1的团队资源。
_images/Exercise-1-Select-team-capacity.png

3. 在 容量 视图中,我们可以看到每个团队成员都对应有 休息日活动每天的容量 三个字段。其中 休息日 表示该成员在这个迭代中有多少天是不工作的,活动 表示该成员在迭代中所做的工作是什么类型的,每天的容量表示该成员在一天中花多长时间来处理迭代中的工作。 我们假设这个迭代中只有 赵云 在公司进行开发,并且只能工作 8 小时,那么此时的 容量 视图如下所示:

_images/Exercise-1-Set-team-capacity.png
  1. 回到我们的 积压工作(backlog) 视图,我们假设我们新建的积压工作已经确认通过了,那么现在可以将该积压工作添加任务。选定该积压工作,然后点击左边的 + 符号来添加任务。这个任务将会自动表现为积压工作项的子任务,用来帮助描述为了实现该积压工作所需要的技术实现细节。
_images/Exercise-1-Add-task-to-backlog.png
  1. 我们可以为新加的子任务设置 标题 为“当选定一个产品时,页面上出现一个‘加入购物车’按钮”,指派给 设置为 赵云剩余工作 设置为 10 ,然后 保存并关闭
_images/Exercise-1-Set-detail-information-for-task.png

注解

这里的 剩余工作 字段所设置的 10 一般表示10个小时。

  1. 此时我们可以打开右上角的 工作详细信息 标签的 打开/关闭 按钮来查看当前迭代容量情况。由于这个迭代此时团队的总容量为8小时,而任务量为10小时,所以会出现下图所示的情形,红色表示当前任务量超过团队计划的任务量。一旦出现红色,项目负责人就必须要考虑增加人员或减少迭代的任务量,可以将一些积压工作放入下一个迭代中。
_images/Exercise-1-Open-work-detail-information.png
练习二:敏捷项目集管理

本次练习中,我们将会学习如何使用TFS进行敏捷项目组合管理,可以允许大型公司和组织进行多团队协作开发。我们将在PartsUnlimited项目上实现多个团队协同工作。

任务一:配置团队层级和区域路径

1. 点击右上角的 管理服务器 按钮(齿轮形状),进入TFS管理页面。此时从我们可以看到,PartsUnlimited项目目前只有一个默认团队,这个团队是创建项目时默认建立的。由于我们的示例项目包含前端网页和后台管理功能,所以我们可以再创建两个团队,前端开发团队和后台开发团队。 由于每个团队各自只关心分配给他们的任务,所以我们要求积压工作视图只显示每个团队自己的需求和任务,这一点可以通过给 不同团队 分配 不同的区域路径 实现。现在我们可以通过点击 新建团队 按钮来创建团队。

_images/Exercise-2-Get-into-configure-page.png
_images/Exercise-2-Profile-of-team-project.png
  1. 创建新团队 窗口中,输入 团队名称 为“前端开发”,不勾选 “使用团队名称创建区域路径”,然后点击 创建团队
_images/Exercise-2-Create-new-team.png
  1. 利用同样的方式,我们可以添加“后台开发”团队。团队添加后的界面应该如下图所示:
_images/Exercise-2-View-of-project-teams.png
  1. 接下来我们需要为我们的项目创建区域路径。区域路径是从我们 样例项目背景用户故事地图 地图中提取出来的。点击 区域 选项卡,我们可以看到当前只有以项目名称命名的根区域。我们先选择根区域,然后点击 新建子级 按钮,弹出 创建区域 窗口,在 区域名称 中输入“前端页面”,点击 保存并关闭
_images/Exercise-2-View-of-initial-Area.png
_images/Exercise-2-Create-new-area.png
  1. 可以看到在根区域中下一级出现了“前端页面”区域。同理可以在根区域中加入“后台页面”、“系统功能”。同理,当我们选定“前端页面”这个区域时,点击 新建子级 按钮,我们就可以在该区域下新建子区域了。我们可以将用户故事地图中的区域信息按照这样的方式完整的录入到 区域 下。
_images/Exercise-2-View-of-Area-1.png
_images/Exercise-2-View-of-complete-Area.png
  1. 下面我们需要做的就是为 每个团队 设置各自的 区域。当需求或积压工作分配到某个区域路径时,只有与区域对应的团队成员才能看到这些需求或积压工作,其他团队成员看不见,也就是对其他团队屏蔽。根据项目的实际情况,我们应该将区域 前端页面 分配给 前端开发 团队,后台页面系统功能 分配给 后台开发 团队。点击 概述 选项卡,进入项目的概述页面,然后点击 前端开发 团队,进入该团队的设置页面,然后点击 区域 选项卡,勾选 前端页面 ,右键点击 前端页面 ,在快捷菜单中选择 包含子区域 ,此时 前端开发 团队与 前端页面 及其子区域进行了绑定。同理可以将 后台开发 团队与 后台页面系统功能 及其子区域进行绑定。
_images/Exercise-2-Configure-Area-for-project-teams.png
  1. 接下来我们回到项目积压工作项页面,将一些前端需求和后台需求分配到相应的区域路径。选择 首页框架登陆页面 这两个积压工作,将它们的 区域路径 字段值分别设为 PartsUnlimited前端页面首页PartsUnlimited前端页面用户相关,将 用户查询用户审核区域路径 字段设为 PartsUnlimited后台页面用户管理
_images/Exercise-2-Put-some-WorkItem-to-team-Area.png
  1. 接下来我们来验证设置我们的设置。点击页面的标题部分的导航栏,选择 浏览全部 按钮,弹出项目和团队选择框,选择 前端开发 团队,点击 导航,进入该团队的积压工作页面,此时我们可以看到 积压工作(backlog) 列表中只有 首页框架登陆页面 这两个积压工作项,与我们要求的完全一致。同理可以验证 后台开发 团队能看到的积压工作项也是我们刚才设置的。
_images/Exercise-2-WorkHub-of-frontDev.png
_images/Exercise-2-WorkHub-of-endDev.png
练习三:根据项目特性配置敏捷规划工具

在前面的练习中,我们已经了解了如何使用TFS进行多团队协作开发。在本练习中,我们将会学到如何使用看板以及看板是如何提高敏捷开发效率的。同时也会介绍下工作项标记的功能。这些功能都是可以根据团队的实际情况可定制的,而不需要修改过程模板文件的。

任务一:介绍 看板 工具
  1. 可以使用看板来跟踪工作项的状态,如查看当前正在进行的工作、工作的执行人员、下一步需要执行的工作以及完成的工作等。转到团队的“积压工作(backlog)”页并打开看板。 团队项目的所有参与者都可以使用看板更新工作状态。
_images/Exercise-3-View-of-backlog-items-kanban.png

2. 此时我们可以看到kanban中共有四列,对应着backlog积压工作项的4个状态,分别是New(新建)、Approve(确认)、Committed(已提交)、Done(完成)。当前所有的工作项都处于New(新建)状态,每个工作项都是用一个小卡片表示。小卡片上当前显示工作项的标题和被指派的团队成员,我们也可以自定义工作项卡片上显示的字段, 将我们所关心的内容字段显示在卡片上。点击kanban右上角的 齿轮 图标,进入看版设置窗口,点击左侧的 字段 标签,然后点击 附加字段 下的 字段 + ,在出现的 下拉框 中选择想要在卡片上显示的字段。我们可以添加字段 Area Path (区域路径)字段和 **State**(状态)字段。

_images/Exercise-3-Add-field-to-card.png
  1. 回到kanpan视图,可以看到此时卡片上已出现了 Area Path 字段和 State 字段。当然我们可以在 设置 窗口中设置kanban的其它属性,如修改卡片的样式、颜色,在kanban中添加或移动状态列,设置每一列中工作项的最大个数,kanban中是否显示bug,设置工作日等等。
_images/Exercise-3-modify-column-for-card.png
_images/Exercise-3-modify-WIP-for-card.png
_images/Exercise-3-Add-notice-for-column.png
_images/Exercise-3-Add-style-for-card.png
_images/Exercise-3-Deal-with-bug-for-card.png
  1. 回到kanban视图,此时所有的工作项都分配给了 诸葛亮 ,需要他对这些工作项进行审批确认。假设此时诸葛亮已经对前三个工作项进行了确认,那他需要将前三个工作项 托拽Approve 列。
_images/Exercise-3-Drag-workitem-to-other-column-1.png
_images/Exercise-3-Drag-workitem-to-other-column-2.png
_images/Exercise-3-Drag-workitem-to-other-column-3.png
  1. 可以看到此时该三个工作项卡片上的 State 的值变为 Approve 了。此时诸葛亮可以将该三个工作项指派给其他开发人员,开发人员根据自己的完成情况来同样拖拽卡片,来更改工作项状态,使流程继续走下去。
_images/Exercise-3-Change-state-of-workitem-card.png
任务二:使用 标记
  1. 使用标记可以很容易对工作项进行归类,方便以后对工作项的查询和刷选。
  2. 回到积压工作项列表。假设我们现在的积压工作有部分同时需要同时在手机端实现,我们就可以利用标记功能来对这些积压工作项进行标记,方便以后进行查找。例如,序号为1、4、6这三个工作项需要同时在手机端实现,那么可以分别打开这三个工作项,添加 标记 “手机”。
_images/Exercise-3-Add-flag-to-workitem-1.png
_images/Exercise-3-Add-flag-to-workitem-2.png
_images/Exercise-3-Add-flag-to-workitem-3.png
  1. 接下来我们就可以利用 标记 来查看我们刷选工作项。点击工作项列表的右上角 漏斗 图标,会在下面出现标记 手机 字样,我们点击 手机 标签,会发现积压工作项列表中已经刷选出含有标记 手机 工作项。
_images/Exercise-3-filter-tag-from-workitems-1.png
_images/Exercise-3-filter-tag-from-workitems-2.png
练习四:创建工作项查询和图表

在本次练习中,我们将会学到如何查询工作项,以及根据查询来生成图表。利用图表我们能更好的展现项目当前的状态。

任务一:创建和共享工作项图表
  1. 我们现在回到积压工作项列表界面。假设现在我们想要更好的查看哪些工作项的状态是 Approve (已确认),都已指派给了哪些成员。点击 查询 选项卡进入工作项查询界面。
_images/Exercise-4-Navigate-to-Query-view.png
  1. 首先我们必须要定义一个查询,来获取我们想要的一些工作项数据。点击 新建 下拉按钮,选择 新建查询
_images/Exercise-4-Create-new-query.png
  1. 新建的查询默认会查询当前项目的所有状态的工作项。我们想要筛选出所有状态为 Approve 的工作项,所以必须要修改字段 State 的值为 Approve
_images/Exercise-4-modify-state-value-for-query.png
  1. 修改好查询条件后,我们可以运行查询来验证是不是我们想要的结果。点击 运行查询 图标,可以在查询定义的下面得到查询结果。
_images/Exercise-4-Result-of-query.png
  1. 当我们确认该查询无误后,可以将该查询保存到 共享查询 文件夹中。
_images/Exercise-4-Save-query-in-share-folder.png
  1. 接下来我们可以根据我们刚才新建的查询来创建图表了。点击 图表 选项卡进入创建图表的界面。
_images/Exercise-4-Navigate-to-Chart-view.png
  1. 图表创建完成后,返回 图表 界面后,可以看到刚才创建的图表已经显示出来了。我们还可以将该图表放入团队首页仪表盘,使每个团队成员都能看见。点击图表中的 ... 按钮,选择 添加到仪表盘-概述
_images/Exercise-4-View-of-query-Chart.png
  1. 当我们返回到团队的首页后,我们可以在仪表盘中看到我们刚才放入仪表盘中的图表。
_images/Exercise-4-Chart-on-dashboard.png

持续交付 - 持续集成,自动化发布和自动化测试

在这个实验中,您和您的团队成员将完成产品从代码到上线的发布管道的建立。我们将借助TFS所提供的持续集成引擎和Release Management功能构建一条全自动的发布管道,您将可以在完成代码编写后一键发布新版本到生产环境,并在这个过程中通过测试环境完成产品功能的验证和上线审批。

我们还将使用单元测试,代码覆盖率,代码分析和自动化UI测试来提高我们对代码质量的掌控能力。

最终我们将实现如下图的持续集成环境:

_images/CI-planning-chart.png

练习列表

练习一:为你的项目添加持续集成能力

TFS使用 生成定义 来管理项目的持续集成配置,在每一个 团队项目 中,可以配置多个 生成定义 分别对应不同的代码分支,测试环境或者团队。在这个实验中,我们只对如何配置 生成定义 进行描述,关于如何规划您的持续集成方案,请参考:TODO

任务一:创建生成定义
  1. 使用 诸葛亮 的账号登陆系统,并切换至您项目的 生成 功能区域下,并点击左侧的 加号 标识
_images/CI-Exercise-1-Add-Build-Definition.png
  1. 在弹出的 创建生成定义 窗口中,

选择 Visual Studio 并点击 下一步

_images/CI-Exercise-1-Add-Build-Definition-1.png

选择 存储库源 | 存储库 | 默认分支 | 勾选持续集成 | 默认代理池 并点击 创建 按钮

_images/CI-Exercise-1-Add-Build-Definition-2.png
  1. 对新创建的 生成定义 进行定制,删除下图中未出现的内容
_images/CI-Exercise-1-Modify-build-definition.png
  1. 添加 PowerShell 生成步骤

点击 添加生成步骤 | 实用工具 | 选中PowerShell 并点击 添加 按钮

_images/CI-Exercise-1-add-powershell-task.png
  1. 配置 PowerShell 生成步骤,使用 PartsUnlimited 代码库中内置的 build.ps1 脚本来进行编译

将 PowerShell 生成步骤拖放到顶端,在右侧的 Script filename 和 Arguments 中分别输入:

参数
Script filename build.ps1
Arguments -BuildConfiguration $(BuildConfiguration)
_images/CI-Exercise-1-add-powershell-task-buildscript.png

您也可以点击 Script filename 右侧的 ... 按钮来从代码库中选择 build.ps1 这个脚本文件

_images/CI-Exercise-1-add-powershell-task-buildscript-1.png

build.ps1 脚本内容如下:

[CmdletBinding()]
Param(
    [Parameter(Mandatory=$True)] [string] $BuildConfiguration
)

#Install dnvm
& scripts/Install-Dnvm.ps1

# Restore and build projects
& scripts/Call-Dnu.ps1 restore .\src
& scripts/Call-Dnu.ps1 build .\src\PartsUnlimitedWebsite --configuration $BuildConfiguration

这个脚本中我们调用了Install-Dnvm.ps1和Call-Dnu.ps1 这两个脚本来完成.NET运行时的安装,依赖恢复(dnu restore)和编译 (dnu build),并且脚本提供了一个叫做BuildConfiguration的参数允许我们提供不同的编译配置参数(release/debug)。

注解

对于许多团队来说,编写一个脚本来进行编译是非常普遍的做法,就如同很多的c应用里面都有个makefile文件一样。这样做的好处是,任何开发人员获取到源代码后都可以直接执行这个脚本来完成如依赖获取,环境配置和编译的操作。

对于一个采用敏捷开发方式的团队来说,为每一个人和每一个新的环境提供统一,简单的一键式的编译脚本非常重要,这可以大大节省开发人员和测试人员获取新的可运行环境的成本,提高效率。同时,这样做也便于我们在开发人员本地环境和持续集成环境中使用同样的方式来执行自动化,消除环境差异对效率的影响。

  1. 保存新的 生成定义

点击 保存,并在弹出的对话框中输入名称 PartsUnlimited_masterCI, 点击 确定

_images/CI-Exercise-1-add-powershell-task-buildscript-2.png

这样,我们就完成了一个最基本的 生成定义 的创建。这个定义中我们仅完成了编译的工作,在后续的练习中我们将添加更多的任务,如:自动化测试和打包。

任务二:运行生成
  1. 将生成排队

回到 生成 视图,并点选我们创建的 PartsUnlimited_masterCI 生成定义,在右侧点击 为生成排队 按钮,在弹出的对话框中点击 确定

_images/CI-Exercise-2-queue-build.png
  1. 查看生成进度

新的请求将被TFS排入生成队列,根据你所选择的代理池不同,你的请求将被逐个处理。

_images/CI-Exercise-2-build-in-queue.png

稍等片刻,您的构建请求将开始运行,这时TFS将会持续的推送日志信息

_images/CI-Exercise-2-build-running.png

如果一切顺利,您的构建将成功完成。

_images/CI-Exercise-2-build-success.png
  1. 查看生成结果

点击屏幕顶部所列出的构建ID (类似:Build 20160313.1),将进入生成结果页面

_images/CI-Exercise-2-build-result.png

这个页面包含以下信息:

内容 说明
生成详细信息 当前生成的详细信息,包括时间,触发者,代码源等
关联更改 在这次生成中所包含的代码变更列表,这是一个相对列表,会显示这次构建相对于上一次的不同
测试 这次生成中所运行的测试用例执行情况
代码覆盖率 如果测试中激活了代码覆盖率,将显示不同模块的覆盖率信息
关联工作项 这次构建中所包含的任务,需求和bug
部署 如果关联了自动化发布,这里将显示当前版本在不同环境的部署情况
练习二:建立产品发布管道 - 实现自动发布

建立发布管道可以帮助团队快速的将新版本部署到开发,测试或者生产环境,加速开发与测试,开发与运维,最终用户与开发之间的迭代速度。一个团队迭代速度的快慢决定其适应变化的能力,也是判断一个团队敏捷程度的重要标志。

任务一:在 生成定义 中添加 打包步骤

应用程序打包是为了能够方便部署而将程序的文件结构调整为目标环境可以直接使用的格式,这个格式与开发时所用的格式往往不同。

  1. 添加打包步骤

首先按照 练习一 | 任务一:创建生成定义 | 步骤4-5 中的方式在添加一个 PowerShell 任务,并将其放置在 编译 任务一下。并对这个任务的参数做如下配置

参数
Script filename publish.ps1
Arguments -BuildConfiguration $(BuildConfiguration)

如下图:

_images/CI-Exercise-1-add-powershell-task-publishscript.png

这个 publish.ps1 脚本将调用 dnu publish 这个命令来完成网站的打包工作,由于我们的网站中用到了很多前端工具,其中还会调用 npm 和 grunt 来完成前端脚本的打包工作。

publish.ps1 的内容如下:

# Publish to a self-contained folder
& scripts/Call-Dnu.ps1 publish src/PartsUnlimitedWebsite -o artifacts\Publish --runtime dnx-clr-win-x64.1.0.0-rc1-update1 --no-source
  1. 将打包结果上传至服务器

选中 Copy Files 这个生成任务,并在 Contents 这个参数中添加一行

**\publish\**

如下图:

_images/CI-Exercise-1-add-powershell-task-publishscript-1.png
  1. 触发生成以便将打包完成的文件上传至服务器

按照 练习一 | 任务二:运行生成 中的步骤触发生成并等待生成完成。

任务二:创建发布定义

生成定义 类似,在TFS中使用 发布定义 来管理发布管道。在一个 团队项目 可以创建多条发布管道分别对应不同的代码分支,团队或者目标环境。

  1. 创建 发布定义

登录系统,并切换至 发布 视图,点击 加号 图标,创建新的 发布定义

_images/CI-Exercise-2-create-release-definition.png

在弹出的 部署模板 对话框中,选择 Emtpy (空模板)并点击 确定

_images/CI-Exercise-2-create-release-definition-1.png

在名称中输入 PartsUnlimited_Pipleline,将第一个环境命名为 测试环境 ,并单击 保存 按钮

_images/CI-Exercise-2-create-release-definition-2.png
  1. 发布定义 链接到 生成定义

单机 链接到生成定义 链接,并选择 PartsUnlimited_masterCI 定义,点击 链接

_images/CI-Exercise-2-create-release-definition-3.png
  1. 配置 测试环境 的部署任务

测试环境 中点击 添加任务

_images/CI-Exercise-2-create-release-definition-4.png

在弹出的 添加任务 对话框中选择 部署 | Windows Machine File Copy , 并点击 添加 按钮

_images/CI-Exercise-2-create-release-definition-5.png
  1. 配置 Windows Machine File Copy 任务

点击 Source 参数后面的 ... 标志

_images/CI-Exercise-2-create-release-definition-6.png

在弹出的 选择文件或文件夹 对话框中选择

PartsUnlimited_masterCI/drop/artifacts/Publish 这个文件夹,并单击 确定 按钮

_images/CI-Exercise-2-create-release-definition-7.png

注解

这个文件夹由 练习二 | 任务一 创建,如果您看不到这个文件夹,请从新执行这个步骤。

并对以下参数进行配置

_images/CI-Exercise-2-create-release-definition-8.png
参数
Admin login (对目标服务器有管理员权限的账户)
P2ssw0rd (以上账户的密码)
Destination Folder c:\websites-[TeamID]\test

注解

为了简化实验的目的,我们已经在目标服务器上针对以下目录配置了IIS的站点

TeamID 目录 URL
A c:\websites-A\test http://[实验服务器]:8022
A c:\websites-A\pro http://[实验服务器]:8023
B c:\websites-B\test http://[实验服务器]:8032
B c:\websites-B\pro http://[实验服务器]:8033
C c:\websites-C\test http://[实验服务器]:8042
C c:\websites-C\pro http://[实验服务器]:8043
D c:\websites-D\test http://[实验服务器]:8052
D c:\websites-D\pro http://[实验服务器]:8053

实际工作中,可以使用其他的 PowerShell 脚本来完成这个工作,可以参考

使用Powershell创建IIS站点

  1. 克隆环境

以上我们已经完成了 测试环境 的部署任务配置,为了实验简化目的,我们使用同样服务器的不同端口来模拟不同的环境,因此 生产环境 的配置不过是另外一个目录而已。所以,我们使用 克隆环境 来完成这一步操作。

点击 测试环境 右上角的 ... 标识,并选择 克隆环境

_images/CI-Exercise-2-clone-env.png

修改 Destination Folder 这个参数为:

参数
Destination Folder c:\websites\pro

最后保存我们的 发布定义

任务三:触发部署
  1. 创建部署

PartsUnlimited_Pipleline 这个 发布定义 上点击 发布 | 创建发布

_images/CI-Exercise-2-create-deployment.png

在弹出的 创建PARTSUNLIMITED_PIPELINE的新版本 对话框中,选择最新的版本,并单击 创建 按钮

_images/CI-Exercise-2-create-deployment-1.png
  1. 运行发布

在 PartsUnlimited_Pipleline / Release 1 上选择 部署 | 测试环境 启动一个向 测试环境 的部署任务

_images/CI-Exercise-2-trigger-release.png

在弹出的 在 测试环境 上部署 Release 1 对话框中点击 部署 按钮

_images/CI-Exercise-2-trigger-release-1.png
  1. 查看部署进度

可以看到 测试环境 的进度条中显示 正在进行 或其他状态

_images/CI-Exercise-2-trigger-release-2.png

也可以切换至 日志 视图查看脚本的输出日志

_images/CI-Exercise-2-trigger-release-3.png

最终,如果一切顺利,进度条将显示 成功

_images/CI-Exercise-2-trigger-release-4.png
  1. 查看部署完成的网站

我们可以打开一下地址看到 PartsUnlimited 站点已经可以运行

  • 测试站点地址为 http://[实验服务器]:8012/
  • 生产站点地址为 http://[实验服务器]:8013/
_images/CI-Exercise-2-release-result.png

到这里为止,我们已经完成了我们所规划中的自动化编译和部署,如下图中的灰色部分:

_images/CI-planning-chart-01.png
练习三:添加自动化测试

自动化单元测试是敏捷开发中的提升质量最为有效的实践之一,为了能够确保所有的版本都经过自动化测试后才能发布,我们需要对之前创建 生成定义 进行修改,添加自动化测试步骤。

  1. 打开 PartsUnlimited_masterCI 这个 生成定义

添加一个新的 PowerShell 任务,对其参数进行以下配置

参数
Script filename test.ps1
Arguments -BuildConfiguration $(BuildConfiguration)

test.ps1 这个脚本的内容如下:

[CmdletBinding()]
Param(
    [Parameter(Mandatory=$True)] [string] $BuildConfiguration
)

& scripts/Call-Dnu.ps1 restore .\test
& scripts/Call-Dnu.ps1 build .\test\PartsUnlimited.UnitTests --configuration $BuildConfiguration

# Run tests
& scripts/Call-Dnx.ps1 -p .\test\PartsUnlimited.UnitTests test -xml testresults.xml

如下图:

_images/CI-Exercise-3-testing-powershell.png
  1. 上传测试结果

为了能够在生成结果中看到测试结果,我们在 生成定义 中添加 Publish Test Result 任务

_images/CI-Exercise-3-testing-publishresult-1.png

并对其进行以下配置

参数
Test Result Format XUnit
Test Result Files testresults.xml
始终运行 选中

注解

请注意在前面的 test.ps1 这个脚本中,我们指定了测试结果文件为 testresults.xml,这里使用同样的文件名。

  1. 运行生成并查看测试结果

打开运行完成的生成,我们可以看到一下结果

_images/CI-Exercise-3-testing-viewresult.png

切换至 测试 视图,我们可以看到更加详细的测试结果信息,包括失败测试的详细信息

_images/CI-Exercise-3-testing-viewresult-1.png

你会注意到,TFS已经为我们创建了一个 bug,点击这个bug我们可以看到这个Bug的 STEP TO REPRODUCE 中详细列出了问题细节,这样开发人员就可以根据这些信息来定位问题,修复BUG。

_images/CI-Exercise-3-testing-generatedbug.png

单击测试结果,我们还可以查看更为详细的测试信息,包括每个测试的执行情况和统计信息

运行摘要:

_images/CI-Exercise-3-testing-viewresult-2.png

测试结果:

_images/CI-Exercise-3-testing-viewresult-3.png
练习四:使用拉取请求(Pull Request)实现质量门控制

拉取请求是GitHub上用于共享代码的方式,在TFS中也支持这个方式在不同的git分支之间进行代码合并操作。通过在执行 拉取请求 时添加不同的策略,我们可以确保只有满足我们质量要求的代码进去目标分支,实现 质量门 控制。

  1. 在源代码库中创建新的开发分支

登录TFS,并切换至 代码 视图,点击 master分支 | 创建分支

_images/CI-Exercise-4-create-develop-branch.png

在弹出的 创建分支 对话框中,输入名称 develop,根据 master,并单击 创建 按钮

_images/CI-Exercise-4-create-develop-branch-1.png
  1. develop 分支上创建 生成定义

按照 练习一 中的步骤,针对 develop 分支创建一个名为 PartsUnlimited_developCI生成定义,在其中添加以下任务

任务 内容
PowerShell 任务 调用 build.ps1
PowerShell 任务 调用 test.ps1
  1. 配置分支策略

在当前 团队项目 页面的右上角,点击 齿轮 标志,进入项目管理后台,切换至 版本控制 中,对 master 分支进行以下配置

_images/CI-Exercise-4-configure-branch-policy.png

配置说明:

配置项 作用
自动生成拉取请求 当针对目标分支提交拉取请求时,自动触发构建定义,并在构建失败时阻止合并。
工作项链接需求 要求拉取请求中的代码提交必须关联工作项,否则阻止合并。
代码评审需求 要求拉取请求必须经过审阅者的代码评审,如果审阅者不批准,则阻止合并。

注解

请注意,我们的目标分支为master,而触发的 生成定义 却是 PartsUnlimited_developCI。这样做的目的是在开发人员向master分支合并代码的时候,首先确保develop分支上的代码是健康的。一般的持续集成配置都是在代码已经进入目标分之后触发的,这样就算测试失败,但是目标分支已经被污染,仍然可能引起问题。

通过这种 预编译,预测试 的方式,我们可以确保目标分支的代码健康。

  1. 提交拉取请求

现在,让我们来创建一个拉取请求,测试一下我们的 质量门

打开以下文件

/test/PartsUnlimited.UnitTests/Search/StringContainsProductSearcherTests.cs

并将第28行修改为

var thing = await searcher.Search("stillbad"); // correct value is "something"

并在注释的最后添加 #1,将此次修改链接到 #1 号工作项

_images/CI-Exercise-4-create-pr.png

保存后,切换至 拉取请求 视图,并单击 新建拉取请求 按钮

_images/CI-Exercise-4-create-pr-1.png

在以下页面中,单击 新建拉取请求 按钮

_images/CI-Exercise-4-create-pr-2.png

请注意以下页面中的 活动 部分,新的生成已经被触发

_images/CI-Exercise-4-create-pr-3.png

等待我们的生成完成,这是你会发现即便你点击 完成拉取请求 按钮,TFS也将阻止你完成此操作,这是因为我们所配置的策略在起作用。

_images/CI-Exercise-4-create-pr-4.png
  1. 修改代码,再次提交拉取请求

为了让我们可以完成合并,你可以进行一下修改,让我们的测试通过,并完成拉取请求。

打开以下文件

/test/PartsUnlimited.UnitTests/Search/StringContainsProductSearcherTests.cs

并将第28行修改为

var thing = await searcher.Search("something"); // correct value is "something"

完成拉取请求后,你会发现TFS会在合并完成后自动触发我们在masrter分支上所配置的 生成定义,进而完成部署。

总结

至此,我们就实现了一条完整的从 develop 分支到 master 分支,再到测试和生产环境的持续交付管道,这样的配置可以为敏捷开发团队提供良好的持续集成环境,并维护我们代码的健康。

_images/CI-planning-chart-02.png

快速修复生产问题

当我们建立了项目管理体系和产品发布管道后,我们将有能力大幅度降低生产问题的平均修复时间(MTTR),平均恢复时间是评估一个开发团队效率的重要指标,只有具备了成熟的DevOps实践的团队才有能力对生产问题做出快速,准确而且可靠的响应。

在这个实验中,我们将在生产环境中模拟一个严重事故,由您和您的团队完成问题的发现,评估,分配和修复过程;并使用我们之前建立的产品发布管道部署一个新版本到生产环境。在这一过程中,您将需要对已有的测试用例进行改进,以便可以避免同样问题的再次出现。

如果时间允许,您可以模拟正常迭代开发与问题修复并行的场景,这样更加接近真实项目中的情况。

_images/FB-overview.png

内容

练习一:使用探索测试工具发现和反馈问题

探索性测试(Exploratory Testing)是由Cem Caner首次提出,11年,James Whittaker出版《探索性测试》艺术后,在业内引起广泛关注。

探索性测试时一种强调个人自由与责任的测试方法,让独立的测试者可以借由不断的学习来改善测试的规划与测试的执行,而在测试的过程中也会同时的改善专案达到相辅相成的效果。 探索性测试强调测试设计和测试执行的同时性,这一点与传统的软件测试过程的“先计划,再分析,后设计,最后执行”是有一定的区别的。在探索性测试中这四个部分相互交织,相辅相成。十分强调个人的能动性,要求在测试的过程中探索学习,并不断的修正测试方法。探索性测试将戴明环方法(PDCA)使用到极致。

我们的实验中将使用 Exploratory Testing 工具来完成,这个工具是Visual Studio Team Service所提供的一个基于Chrome浏览器的插件,可以在测试过程中记录用户的操作,进行截图并上传结果到TFS作为Bug或者测试用例。

_images/FB-Exercise-1-ExploratoryTesting-Tool.png
任务一:安装Exploratory Testing工具并连接至TFS

如果您的电脑上没有安装Chrome浏览器,请先安装。

  1. 获取 Exploratory Testing 插件

从讲师处获取本地安装包, ExploratoryTestingExtension.zip,并解压缩。

  1. 在Chrome上安装插件

打开Chrome浏览器,打开 设置 页面

_images/FB-Exercise-1-ET-install1.png

进入 扩展程序 ,选中 开发者模式

_images/FB-Exercise-1-ET-install-2.png

点击 加载已解压的扩展程序 ,并选择你所解压缩出来的文件夹中的 版本号 子文件夹,单击 确定

_images/FB-Exercise-1-ET-install-3.png

Exploratory Testing (Preview) 将出现在列表中,并在工具栏中出现相应的图标

_images/FB-Exercise-1-ET-install-4.png
  1. 连接至TFS

点击工具栏中的 图标 ,选择 齿轮 标志,并选择 Connected (VSTS/TFS),输入服务器地址,点击 下一步

_images/FB-Exercise-1-ET-config.png

在下面页面中选择您的项目,并单击 保存

_images/FB-Exercise-1-ET-config-1.png
任务二:执行探索性测试并提交Bug
  1. 启动测试

点击 Start Session 开始一个 测试会话

_images/FB-Exercise-1-ET-runtest.png
  1. 完成应用测试过程

根据 持续交付 - 持续集成,自动化发布和自动化测试 这个实验中我们所创建的站点地址,打开您的站点

_images/FB-Exercise-1-ET-runtest-1.png

请按照以下步骤执行测试

步骤 说明
(1)打开首页 使用 测试环境 或者 生产环境 的地址打开首页
(2)点击 Lighting 在应用的的主菜单上点击第一个菜单项 Lighting
(3)点击 Halogen Headlights 在列出的产品中点击第一个产品 Halogen Headlights
(4)打开产品详细信息页 进入产品详细信息页,注意产品价格信息

您可以重复以上步骤 2 - 4,进入不同的产品详细信息页面,可以注意到所有产品的价格都是 $250, 这是我们应用中的一个 Bug.

注解

一般来说,进行探索测试的时候是没有测试步骤的,我们的实验为了简化目的,将测试的步骤列在这里以帮助您更快的定位问题。

您也可以不按照以上步骤进行操作。

  1. 提交 Bug

再次点击工具栏 图标,并选择 Bug 视图,输入以下内容作为 Bug 的标题

All products show same price $250

_images/FB-Exercise-1-ET-runtest-2.png

注解

您会注意到工具已经将我们刚才的操作一步一步的记录下拉,这样非常便于开发人员定位问题。另外,在标题框的右侧有一个 类似Bug 的标识,这里将按照您所输入的内容搜索TFS的数据库,帮助您定位可能已经出现过的类似问题。

最后,点击 保存 提交 Bug, 并点击 Stop Session 停止我们的 测试会话

练习二:快速修复问题

由于我们已经建立了从代码到生产环境的快速发布管道,我们可以非常快速的修复我们的问题,并进行发布。

任务一:修复Bug
  1. 打开TFS的产品backlog查看bug

打开TFS的 工作 | 积压工作(backlog),您会看到刚才所提交的bug已经出现在了列表中

_images/FB-Exercise-1-ET-fixbug.png

请双击打开这个bug,您可以看到我们刚才所提交的内容

_images/FB-Exercise-1-ET-fixbug-1.png

记录下这个Bug 的 ID。

  1. 修复Bug

为了简化实验目的,您可以按照以下方式修复bug,在实际工作中,开发人员需要自己重现问题,定位问题,修复问题。

打开一下文件,并注释掉 第57行,并在签入注释中输入 修复Bug #bugID 其中 bugID是在上一步中所记录的ID。单击 保存 按钮。

/src/PartsUnlimitedWebsite/Controllers/StoreController.cs

_images/FB-Exercise-1-ET-fixbug-2.png
// productData.Price = 250;

注解

使用#加上id可以告诉TFS此次修改与这个id的工作项相关,这将有助于我们跟踪代码变更与工作的关系。

任务二:发布新版本

请按照以下实验内容完成发布过程

练习四:使用拉取请求(Pull Request)实现质量门控制

总结

以上,我们借助于 持续交付 - 持续集成,自动化发布和自动化测试 中所创建的自动化发布管道和探索性测试工具完成了一个线上问题的快速修复。这个场景在实际工作中非常普遍。

至此,您应该可以体会到TFS所提供的一体化需求,任务,测试,构建和发布功能的强大之处。使用TFS这种高度集成的研发平台,我们可以帮助开发团队建立非常快的相应能力,同时确保质量的稳定。

参考资料

相关参考资料

关于软件工程

以下解释来自 维基百科

软件工程的由来

软件工程(英语:Software Engineering)1968年秋季,NATO(北约)的科技委员会召集了近50名一流的编程人员、计算器科学家和工业界巨头,讨论和制定摆脱 “软件危机” 的对策。在那次会议上第一次提出了软件工程(software engineering)这个概念,研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来的学科。它涉及到程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。

在现代社会中,软件应用于多个方面。典型的软件比如有电子邮件、嵌入式系统、人机界面、办公套件、操作系统、编译器、数据库、游戏等。同时,各个行业几乎都有计算机软件的应用,比如工业、农业、银行、航空、政府部门等。这些应用促进了经济和社会的发展,提高人们的工作效率,同时提升了生活质量。

软件工程师是对应用软件创造软件的人们的统称,软件工程师按照所处的领域不同可以分为系统分析师、系统架构师、软件设计师、程序员、测试工程师、界面与交互设计师等等。人们也常常用程序员来泛指各种软件工程师。

软件危机

1995年,Standish Group研究机构以美国境内8000个软件项目作为调查样本,调查结果显示,有84%软件计划无法于既定时间、经费中完成,超过30%的计划于执行中被取消,项目预算平均超出189%。

案例:美国银行信托软件系统开发案

美国银行1982年进入信托商业领域,并规划发展信托软件系统。计划原订预算 2千万美元 ,开发时程9个月,预计于1984年12月31日以前完成,后来至1987年3月都未能完成该系统,期间已投入 6千万美元 。美国银行最终因为此系统不稳定而不得不放弃,并将340亿美元的信托账户转移出去,并失去了 6亿美元 的信托生意商机。

定义
  • 创立与使用健全的工程原则,以便经济地获得可靠且高效率的软件。
  • 应用系统化,遵从原则,可被计量的方法来发展、操作及维护软件;也就是把工程应用到软件上。
  • 与开发、管理及更新软件产品有关的理论、方法及工具。
  • 一种知识或学科,目标是生产质量良好、准时交货、符合预算,并满足用户所需的软件。
  • 实际应用科学知识在设计、建构计算机程序,与相伴而来所产生的文件,以及后续的操作和维护上。
  • 使用与系统化生产和维护软件产品有关之技术与管理的知识,使软件开发与修改可在有限的时间与费用下进行。
  • 建造由工程师团队所开发之大型软件系统有关的知识学科。
  • 对软件分析、设计、实施及维护的一种系统化方法。
  • 系统化地应用工具和技术于开发以计算机为主的应用。
  • 软件工程是关于如何设计和开发优质软件的技术。
软件工程的核心知识(SWEBOK)

ACM与IEEE Computer Society联合修定的SWEBOK(Software Engineering Body of Knowledge)提到,软件工程领域中的核心知识包括:

  • 软件需求(Software requirements)
  • 软件设计(Software design)
  • 软件建构(Software construction)
  • 软件测试(Software test)
  • 软件维护与更新(Software maintenance)
  • 软件构型管理(Software Configuration Management, SCM)
  • 软件工程管理(Software Engineering Management)
  • 软件开发过程(Software Development Process)
  • 软件工程工具与方法(Software Engineering Tools and methods)
  • 软件质量(Software Quality)
软件工程的发展方向

“敏捷开发”(Agile Development)被认为是软件工程的一个重要的发展。它强调软件开发应当是能够对未来可能出现的变化和不确定性作出全面反应的。

敏捷开发被认为是一种“轻量级”的方法。在轻量级方法中最负盛名的应该是“极限编程”(Extreme Programming,简称为XP)。而与轻量级方法相对应的是“重量级方法”。重量级方法强调以开发过程为中心,而不是以人为中心。重量级方法的例子有CMM/PSP/TSP。

面向方面的程序设计(Aspect Oriented Programming,简称AOP)被认为是近年来软件工程的另一个重要发展。这里的“方面”指的是完成一个功能的对象和函数的集合。在这一方面相关的内容有泛型编程(Generic Programming)和模板。

参考资料

关于敏捷开发

敏捷软件开发(英语:Agile software development),又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力。它们的具体名称、理念、过程、术语都不尽相同,相对于「非敏捷」,更强调程序员团队与业务专家之间的紧密协作、面对面的沟通(认为比书面的文档更有效)、频繁交付新的软件版本、紧凑而自我组织型的团队、能够很好地适应需求变化的代码编写和团队组织方法,也更注重软件开发过程中人的作用。

敏捷宣言

敏捷一词来源于2001年初美国犹他州雪鸟滑雪圣地的一次敏捷方法发起者和实践者(他们发起组成了敏捷联盟)的聚会。

雪鸟会议共同起草了 敏捷软件开发宣言 。其中最重要的部分就是对一些与会者一致同意的软件开发价值观的表述。

价值观

个体和互动: 高于 流程和工具。

工作的软件: 高于 详尽的文档。

客户合作: 高于 合同谈判。

响应变化: 高于 遵循计划。

其中左边的描述是右边原则的重点。

原则

宣言中还包括以下原则:

  • 对我们而言,最重要的是通过尽早和不断交付有价值的软件满足客户需要。
  • 我们欢迎需求的变化,即使在开发后期。敏捷过程能够驾驭变化,保持客户的竞争优势。
  • 经常交付可以工作的软件,从几星期到几个月,时间尺度越短越好。
  • 业务人员和开发者应该在整个项目过程中始终朝夕在一起工作。
  • 围绕斗志高昂的人进行软件开发,给开发者提供适宜的环境,满足他们的需要,并相信他们能够完成任务。
  • 在开发小组中最有效率也最有效果的信息传达方式是面对面的交谈。
  • 可以工作的软件是进度的主要度量标准。
  • 敏捷过程提倡可持续开发。出资人、开发人员和用户应该总是维持不变的节奏。
  • 对卓越技术与良好设计的不断追求将有助于提高敏捷性。
  • 简单——尽可能减少工作量的艺术至关重要。
  • 最好的架构、需求和设计都源自自我组织的团队。
  • 每隔一定时间,团队都要总结如何更有效率,然后相应地调整自己的行为。
敏捷开发方法

除了 敏捷开发宣言_ 内所提到的价值观和原则以外,敏捷开发并没有一个完整的方法列表,因为所有的敏捷开发方法都是广大开发人员在日常的工作中摸索出来的,针对某种特定场景适用的方法。也就是说,以下所列出的敏捷开发方法并以一定适用于你的团队或者你的问题,但是敏捷鼓励所有人按照自己的方式尝试任何的方法,只要这种方法遵循以上价值观和原则,那么它就是一种敏捷方法。

  • Scrum
  • 看板方法 Kanban
  • 敏捷建模 Agile Modeling
  • 特性驱动开发 Feature-driven development (FDD)
  • 测试驱动开发 Test-drive development (TDD)
  • 极限编程 eXteme Programming (XP)
  • 精益开发 Lean Development
  • 微软解决方案框架敏捷版 Microsoft Solution Framework (MSF) for Agile
  • 敏捷数据方法 Agile Data Method
  • 自适应软件开发 Adaptive Software Development (ASD)
  • Six Sigma
  • 水晶方法 Crystal
  • 行为驱动开发 Behavior-driven development (BDD)
  • 动态系统开发方法 Dynamic Systems Development Method (BSDM)
  • 探索性测试 Exploratory Testing

以下是Forrester在2009年针对各种敏捷开发方法进行的一项调研结果,其中显示在所有敏捷方法中,Scrum的接受度最高。同时,在接受调研的开发人员中,已经有35%的人员在使用某种敏捷开发方法。

_images/agilemethods.png
为什么敏捷开发可以帮到你?

上面的调研报告中可以看出,越来越多的开发团队在使用某种敏捷开发方法来解决他们所遇到的问题。为什么敏捷开发受到大家的接受与热捧,就在于这些方法真的可以帮助我们解决问题。同时,敏捷从来不主张用同一个方法或流程套用到所有团队和所有情况中,它鼓励团队根据自己的情况找到适合自己的方法(前提是遵循敏捷价值和原则),这样其实敏捷将所有那些可以帮助到团队,让团队感受到价值的方法全部囊括,也就不难看出为什么敏捷收到热捧了。这都是我们自己想出来的办法,自然觉得好!

不过,从软件研发的本质上来分析一下,其实就不难看出为什么遵循这些价值和原则的方法可以成功。

软件开发过程是一个探索过程

_images/2-complex-factors.JPG

软件开发中的2个复杂度,分别是不确定的需求和不确定的技术。这2点在软件出现后的十几年发展中没有变得简单,而是越来越复杂。这一特性和很多的其他的行业有很大的不同,在制造业中,随着技术的发展,我们可以使用越来越成熟的技术,对产品的设计也可以通过很多方式固化下来,然后才进入大规模生产。但是软件不同,经过了这么多年的发展,我们发现我们面临的问题越来越复杂,所使用的技术也越来越繁多。这种行业性的不同特点决定了我们无法使用工业制造领域所惯用的很多方法来解决软件研发的问题,这就是瀑布模型(waterfall)会失败的原因所在。当然,近些年来工业生产中也在推行如柔性生产线,精益制造,工业4.0等。这些趋势的出现,实际都是因为市场环境发生变化的速度在加快,我们必须找到一种可以快速适应变化的方式。

_images/predefined-and-adaptive.PNG
实施敏捷转型的前提 - 自上而下

经验型管理方法需要开放的企业文化

要做好软件研发,我们就必须找到一种能够通过变化来适应变化的方法,并在开发过程中持续改进我们的流程并适时引入新的方法,废除老的方法。这种方式要求我们的团队必须能够接受问题,愿意做出改变,因此一种开放的团队文化是实施所有敏捷方法的前提。当然,我们无法要求团队在一开始就具备这种文化,这种文化的建立本身也是敏捷转型的必然结果。因此,任何团队的敏捷转型都必须是自上而下的,首先管理者(这里至少要上升到技术总负责人的层面)要认可敏捷的价值,并愿意为了这个目标而适度接受组织变革。如下面这个漫画中的情形所描述的企业文化,是无法接受这种转型的。

_images/open-culture.PNG

上图描述了迪尔伯特在和自己同事谈论项目进展情况的时候说:我们就如同15只喝醉的猴子在一起做拼图游戏一般混乱,可见他的项目有多么糟糕;但当他的领导问起同样的问题时:他的回答却是简单的一句:正常。

团队如果希望能够引入敏捷,就必须先让领导认可敏捷的价值,如果领导无法认可,这种事情宁可不做。因为在敏捷转型的过程中,我们首先就是要把团队现有的问题全部暴露出来,可以说所有的敏捷团队管理方法都是一种暴露问题的手段。如果在问题暴露出来后无法让所有人,特别是那些利益受到影响的人接受(管理者首当其冲),那么后续的改进都无法排入日程。

敏捷转型的9个成功要素

所有的敏捷方法大致可以分为2类:团队管理和工程实践。团队管理方法是敏捷转型的根基,也是持续改进的基础;而工程实践则是团队为了解决某个特定问题而选用/采用的某种具体方法。要落实这些方法,以下9点非常重要:

  • 建立团队沟通习惯:使用每日立会(Daily Standup)的方式进行计划,并且使用商业价值(Business Value)点来决定优先级
  • 透明化流程:使用燃尽图/燃上图,kanban为所有项目干系人提供项目进度,风险反馈和更新
  • 理清需求源头:从业务线中选取产品负责人(PO),并直接对软件开发项目负责
  • 控制需求粒度:将需求拆分成很小的颗粒,持续快速迭代开发,并及时收集反馈
  • 建立反馈机制:将敏捷项目与企业级PMO良好集成,提供计划和报表支持
  • 不要从新发明轮子:引入专家指导,借助外脑实现快速敏捷转型。调查结果:使用敏捷专家提供指导的企业中,有41%具备更好的预测能力
  • 评估收益:建立度量是建立管理的基础。如cycle time,自动化比例,产品中的bug数量等数据度量,持续的提供比较和改进基础
  • 明确优先级: 在用户时代,敏捷的价值就在于驱使PO按照为用户获得的商业价值来确定交付的优先级
  • 建立持续改进机制: 在过程中保持学习并持续改进。不仅仅以在每个sprint后面的Retro,而应该在每个步骤后都进行反思和改进

关于Scrum

关于看板(Kanban)方法

关于用户故事

关于 Visual Studio ALM

Team Foundation Server是微软研发平台的核心产品。在2015年Gartner的软件开发生命周期管理工具评估报告中,微软的TFS又一次在可实施性和功能完整性这两个关键性指标上位于前2名,特别是可实施性位列第一,这标志着使用TFS进行软件全生命周期管理是最可靠,最容易取得成功的选择。

_images/gartner-2015-feb.png

微软的TFS产品之所以可以具备如此完备的功能和实用性和微软几万名产品开发人员的使用有着紧密的关系,自2005年发布第一版以来,微软的主要产品线,包括Windows, Office, Visual Studio, Xbox以及Azure云计算平台都在使用TFS作为研发管理平台,经过了10年超过6个大版本的迭代,TFS已经具备了管理上万人研发团队进行大规模复杂项目开发的经过验证的能力。无论开发团队使用传统的瀑布,CMMI或者新兴的敏捷,Scrum或者Kanban来组织自己的开发流程,TFS都能提供完善的工具和高度可定制性来满足要求。仅在Visual Studio产品线,TFS就管理者超过3亿6千万源代码文件,1千9百万工作项和近5000名开发人员,每天要进行超过22万次版本编译,总数据量超过15TB。

使用微软自己的开发平台来管理自己的大规模软件研发,是微软TFS研发管理平台与其他厂商的产品最大的区别,在Gartner的评估中出现的任何一家公司都不具备如此规模的研发团队和复杂的产品来磨练自己的研发平台,这就是为什么TFS可以在“可实施性”上力拔头筹的原因。

在中国,已经有多家大型团队使用TFS进行研发管理的成功案例。在金融行业中,PICC是中国保险行业规模最大的提供商,2014年的营业规模超过2500亿元。同时,PICC的软件研发团队超过千人,分布在北京,成都和广州的多个研发中心。PICC自2014年引入TFS进行研发管理以来,已经对超过110个项目,20万条工作项进行了管理,受控代码进2亿个文件。PICC的研发平台选型工作持续近1年半的时间,完整评估了来自微软,IBM,PTC及惠普的多个解决方案,最终选定TFS作为其研发平台的单一工具,其考虑点主要有:1)全生命周期管理能力;2)多种研发模式的支持,既要支持敏捷,也要支持传统的瀑布;3)多种开发环境的支持,如:Java和.NET ; 4) 易用性,如与常用办公软件的集成;5)集成能力,接入第三方系统的能力;6)实施服务团队的能力。在整个实施过程中,微软的实施团队共提供了超过30场培训,覆盖超过700人,200多小时的培训时间。同时完成了近百张不同的报表开发和近万行定制代码的编写。

从功能上来看,微软TFS研发管理平台提供了从需求管理,项目管理,配置(源代码)管理,测试管理,代码编译持续集成,自动化测试,自动化发布及部署环境管理在内的研发运维一体化(DevOps)的完整工具链。在产品和项目开发的每个环节都可以提供完整的工具支持和良好的用户体验。

  • 需求管理:TFS提供简单易用的轻量级条目化需求管理,需求人员可以使用自己熟悉的Office办公软件完成需求的编写,修改并导入至TFS形成可追述的条目化需求,TFS对每条需求均维护详细的历史纪录并可以与其他条目(包括:需求,任务,测试用例,缺陷,代码和版本等)建立不同类型的联系。通过这种联系,我们可以从任何需求条目抽取出所关联的所有过程资产,便于管理人员进行跟踪和数据分析。在TFS中,我们对需求管理的理解是端到端的,而不仅仅处于需求收集和分析阶段。
  • 项目管理:TFS的项目管理能力包含了项目规划,跟踪,监控和控制能力。项目管理中我们需要对人,流程和工具进行结合,并使用某种方法论进行指导来完成。在TFS中,内置了瀑布,敏捷和Scrum三种研发过程方法论模型,同时允许用户定制或者导入自己的管理模型。通过与各种不同的集成开发环境(IDE)的集成,项目的过程跟踪可以和开发人员的日常操作无缝集成,大大降低项目管理造成的额外工作。对所有这些过程所产生的数据,我们都可以通过TFS所内置的数据分析引擎和报表进行可视化,让管理精细化和科学化。
  • 配置(源代码)管理:TFS中支持两种配置管理模型:1)集中式的配置管理适合需要精细化权限分离的层级化管理模式,对于使用团队成员复杂(如包含外包),产品庞大,安全性要求高的项目非常适合;2)分布式配置管理对于地域上分散,网络环境不可靠以及需要更加灵活的分支/合并模型的团队更加适合,对于敏捷开发的支持也更加灵活。我们可以混合使用2种配置管理模型,进一步提升了配置管理的灵活性。
  • 测试管理:TFS的测试管理与需求管理具有非常强的联系,对于测试V模型的支持简单直接,让测试团队和开发团队的协作更加高效。从单元测试,功能测试,集成测试,验收测试,到自动化测试,压力测试,性能测试,TFS中都提供了解决方案并可将测试结果纳入项目管理数据分析中使用。
  • 代码编译和持续集成:快速反馈是提升软件质量的最有效手段,持续集成让开发人员可以快速知晓代码质量水平,让测试人员可以快速获取可测试版本,让运维人员可以快速获取可部署版本。作为整个研发工具链的输送管道,TFS的跨平台构建引擎可以同时在Windows, Linux, Mac, Unix等主流操作系统上完成代码编译,打包,自动化代码规范校验和发布;为研发团队建立快速反馈提供了最佳的工具支撑。
  • 自动化发布和部署环境管理:TFS中所内置的Release Management功能可以方便的建立开发-测试-预生产-生产环境的发布管道,并在每一步骤接入持续集成系统的版本,在管理人员完成审批的前提下,自动完成产品版本在发布管道中的推送,并在必要的时候进行回滚操作,确保环境的可用性。与云计算平台,私有云,虚拟化以及新兴工具(如:docker, puppet, chef等)的集成,让TFS具备企业DevOps核心发布管道的能力。

TFS研发管理平台具备诸多开箱即用和功能和流程,特备适合中小型团队直接使用;对于大型研发团队,TFS同时提供了强大的集成能力。内置的流程模板可以将项目管理模型模板化,对人员和流程进行绑定;灵活的配置管理支持细致的权限划分和分支规划;跨平台的构建工具现在已经开源(可以从github获取 vs-agent),可以自行开发插件来支持不同的构建环境;后台强大的数据分析平台的数据可以通过不同的报表工具来进行数据可视化;最后,TFS提供标准的Rest API来完成第三方系统的集成。对于大型企业的研发管理来说,以上能力缺一不可。

下载VSALM DevOps解决方案文档

http://pan.baidu.com/s/1bszChK

系统安装与配置

TFS 安装和配置

注意

文档内容将与最新版TFS企业版保持同步,请确保你所使用的TFS版本与本文档的适用范围一致,再参照本文档进行TFS的安装和配置,不同版本的TFS企业版的安装配置虽然区别不大,但对于企业部署,一个很小的差异都可能造成生产系统的问题。

本文档适用于:

  • Team Foundation Server 2015 Update 2.
TFS 技术架构
服务器架构

TFS 的服务器分为核心服务和外围服务,核心服务采用2层架构,分别为数据层和应用层。

  • 数据层:采用SQL Server的数据库服务器提供数据存储,数据分析和多维数据处理能力。
  • 应用层:采用IIS所提供的Web服务器提供网站访问和Web Service供内部服务和外部服务调用,同时提供符合RestAPI标准的服务。
_images/tfs-server-arch-01.png

外围服务部分,TFS可以和以下服务进行集成提供不同的功能

  • SQL Reporting Service (SSRS) 提供报表服务
  • SharePoint 提供门户功能
  • Build Service 提供自动化和持续集成功能
  • System Center Virutal Machine Manager (SCVMM) 虚拟化平台管理,提供实验室环境管理功能
  • Proxy Server 提供分布式代理服务器功能
_images/tfs-server-arch-02.png
客户端架构

TFS 客户端通过多种方式为用户访问提供方便,包括:

  • TFS 网站 兼容任何主流浏览器的访问能力,跨平台访问
  • Viusal Studio 客户端,通过 团队资源管理器 提供集成式的IDE内访问
  • Eclipse/IntelliJ 客户端, 通过 Team Explorer Everywhere(TEE) 插件提供级城市的IDE内访问,跨平台访问
  • Office 集成组件,提供Excel/Project内直接访问TFS的能力
  • 任何标准的Git客户端,提供Git分布式源代码管理能力,跨平台访问
  • Test Controller (测试控制器) 提供自动化UI测试,压力测试和性能测试功能
_images/tfs-server-arch-03.png
操作系统兼容性

TFS服务器端兼容以下版本的操作系统

  • Windows Server 2012 R2 (Essentials, Standard, Datacenter)
  • Windows Server 2012
  • Windows Server 2008 R2 (minimum SP1) (Standard, Enterprise, Datacenter)

TFS客户端支持以下版本的操作系统

  • Windows 10 (Home, Professional, Enterprise)
  • Windows 8.1 (Basic, Professional, Enterprise)
  • Windows 8
  • Windows 7 (minimum SP1) (Home Premium, Professional, Enterprise, Ultimate)

以下操作系统通过 Team Explorer Everywhere 支持 (见以下*Java Runtime需求)

  • Linux with GLIBC 2.3 to 2.11 (x86, x86_64, PowerPC)
  • Mac OS X 10.8+ (Intel Only)
  • Solaris 8 to 11 (SPARC x64)
  • AIX 5.2 to 7.1 (32 and 64 bit)
  • HP-UX 11i v1 to v3 (PA-RISC, Itanium)

Java Runtime 需求

  • Oracle Java 1.6+ or IBM Java 1.6+ on Windows
  • Apple Java 1.6+ on Mac OS X
  • Oracle Java 1.6+ on Linux or Solaris
  • IBM Java 1.6+ on Linux or AIX
  • HP Java 1.6+ on HP-UX
TFS 部署模式

TFS 可以支持几人到几千人的不同团队规模,提供不同的单机部署模式和多级集群部署模式满足小团队或者大型企业的需求。下图中列出了小型,中型和大型三种不同的部署模式,以及相关的硬件需求和可支持的团队大小。

_images/tfs-server-deploy-model-01.png
高可用性方案

对于需要持续提供安全可靠的大型团队来说,TFS提供灵活的高可用性方案可供选择,以下列出最常用的高可用性部署方案。也可以根据企业的要求对以下方案进行定制,满足不同的可维护性要求和可用性要求。

_images/tfs-server-deploy-model-02.png
数据备份方案

研发相关数据对任何企业都是关键的资产,TFS提供内置的数据备份和恢复方案供系统管理员使用完成日常的数据备份和简单易操作的数据恢复。

_images/tfs-server-deploy-model-03.png
TFS 安装说明
为TFS部署Windows活动目录(域环境)

活动目录(Active Directory)是面向Windows Standard Server、Windows Enterprise Server以及 Windows Datacenter Server的目录服务。Active Directory存储了有关网络对象的信息,并且让管理员和用户能够轻松地查找和使用这些信息。

什么时候需要将TFS部署在域环境?

如果将要使用TFS服务器的人员很多,或者需要使用中型(双机),大型(集群)模式的部署,推荐将TFS部署在域环境中。这样便于我们配置TFS的周边服务,如:报表服务,SharePoint服务和自动化持续集成服务。一般来说,我们无法在一台服务器上完成TFS核心服务和周边服务的完整部署,而必须将这些周边服务部署在独立的服务器上,这时我们就需要TFS与这些周边服务进行通信。在这种情况下,使用域环境将更加容易,因为我们可以使用域账户在不同的服务器之间进行授权,而不用依赖NETWORK SERVICE这类的机器账号进行授权。

活动目录部署说明

注意

这里提供的是最简单的Windows活动目录部署步骤,如果您需要企业级Windows活动目录部署,请与专业的Windows网络管理员进行沟通,进行整理规划。这里所提供的安装步骤仅可作为测试和验证用途。

注意

本文档中使用Windows Server 2012 R2 Datacenter版,如果需要在其他版本的Windows上部署活动目录,请参考微软官方文档。

  1. 修改计算机名称

    新安装Windows Server将使用一个随机字符串作为机器名称,这非常不利于后期维护。所以我们需求修改这个名称。

    在 ** 服务器管理器 | 本地服务器 ** 中单击计算机名,并在弹出的对话中单击 更改,输入 新的计算机名称,单击 确定

    _images/ad-install-01-changecomputername.png

    然后按照提示重新启动服务器。

  2. 安装Windows活动目录服务

    服务器完成启动后,在 服务器管理器 | 仪表盘 上点击 添加角色和功能

    弹出的 开始之前 页面上点击 下一步

    _images/ad-install-001.png

    选择安装类型 页面上选择 基于角色或基于功能的安装 并点击 下一步

    _images/ad-install-002.png

    选择目标服务器 页面上选择 从服务器池中选择服务器 确保 TFS 服务器被选中,并点击 下一步

    _images/ad-install-003.png

    选择服务器角色 页面上选择 Active Directory 域服务,并在弹出的 添加角色和功能向导 对话框中,点击 添加功能,回到 选择服务器角色 页面上点击 下一步

    _images/ad-install-004.png
    _images/ad-install-004-1.png

    选择功能 页面上,点击 下一步

    _images/ad-install-005.png

    Active Directory 域服务 页面上点击 下一步

    _images/ad-install-006.png

    确认 页面上点击 安装

    _images/ad-install-007.png

    等待安装完成,并在 安装进度 页面上点击 关闭

    _images/ad-install-008.png
  3. 将服务器升级为域控制器

    服务器管理器 上点击右上角的旗帜标志,在 部署后配置 中点击 将此服务器提升为域控制器

    _images/ad-promote-001.png

    Active Directory 域服务配置向导 中的 部署配置 页面中选择 添加新林,并输入以下信息

    参数
    根域名 vsalm.local
    _images/ad-promote-002.png

    域控制器选项 页面中,输入 还原模式(DSRM)密码 并点击 下一步

    _images/ad-promote-003.png

    DNS选项 页面中,忽略错误信息,点击 下一步

    _images/ad-promote-004.png

    其他选项 页面中,接受 NetBIOS域名 的默认值,点击 下一步

    _images/ad-promote-005.png

    路径查看选项 页面上接受默认值,并在 先决条件检查 页面上,点击 安装

    _images/ad-promote-006.png

    等待安装完成,服务器将自动重新启动。

注意

服务器从新启动后,您将需要使用 **域用户**登录计算机,您可以使用以下2中模式的域用户格式

格式 例子
NetBIOS格式 VSALM\Administrator
UPN Administrator@vsalm.local
_images/ad-username.png

至此,我们就为TFS的安装部署准备好了Acitve Directory域环境。

为TFS服务器创建服务账户

为了确保TFS服务的安全性,稳定性以及未来集成外围服务的方便性,我们需要使用专用的账户来运行TFS和其相关的服务。

服务账户

你需要至少创建以下几个 服务账户

账户名称 用途
TfsService 用来运行TFS的核心服务
TfsReport 用来代替TFS核心服务访问Tfs的报表
TfsBuild 用来代替TFS核心服务运行构建服务

服务账户不需要再创建的时候赋予任何特殊权限,他们的权限都通过TFS安装配置程序自动赋予,TFS安装配置程序会保证这些账户仅仅具备最基本的权限。

管理员账户

另外,你还可以创建几个公用的 管理员账户 用来完成TFS的安装部署以及日常的维护工作:

账户名称 用途
TfsAdmin 日常TFS系统维护,包括安装配置和日常数据备份和恢复

注意

使用公用账户有其方便的地方但也可能造成安全隐患,比如你无法知晓到底是谁在使用这个账户进行了操作。所以,我们更加推荐使用授权的方式,为那些行使TFS管理员职责的用户账户赋予相应的权限

在Active Directory中创建账户

服务器管理器 上点击 工具 | Active Directory 用户和计算机

_images/ad-account-001.png

Active Directory 用户和计算机 中,右键点击 vsalm.local,选择 **新建 | 组织单位 **

_images/ad-account-002.png

在弹出的 新建对象-组织单位 对话框中,输入 TFS 作为名称并点击 确定

_images/ad-account-003.png

右键单击 TFS 这个组织单位,选择 新建|用户

_images/ad-account-004.png

按照你要创建的账户名称填写表单,并点击 下一步

_images/ad-account-005-1.png

填写密码,并仅仅勾选以下两个选项

[x] 用户不能更改密码

[x] 密码永不过期

_images/ad-account-005-2.png

注意

对于 服务账户 来说,如果密码过期会造成服务失效。建议选定密码永不过期选项,如果你的组织有其他关于密码安全性的要求,则请按照要求进行配置。

重复以上方法,创建下列用户

_images/ad-account-005-2.png

这些用户中除了TfsAdmin是公用的管理员账户,其他的都是服务账户,对于服务账户,我们不需要赋予任何特殊的权限,但是对管理员账户,我们需要赋予Domain Admins组权限。

_images/ad-account-007.png

至此,我们就完成了TFS安装部署所需要的账户配置。

为TFS部署SQL Server环境

TFS 的不同版本支持使用不同版本的SQL Server,请参考下列表格决定是否您的SQL Server版本可以用户TFS部署。

TFS版本 SQL Server 版本
TFS 2015 SQL Server 2014 SQL Server 2012 (minimum SP1)
TFS 2013 Update 2 SQL Server 2014 SQL Server 2012 (minimum SP1)
TFS 2013 SQL Server 2012 (minimum SP1)
TFS 2012 SQL Server 2012 SQL Server 2008 R2
TFS 2010 SQL Server 2008 R2 SQL Server 2008
安装账户

确保你使用 TFS管理员账户 登录计算机进行以下操作

_images/account-tfsadmin.png
SQL Server 2014 安装过程
  1. 安装.NET Framework 3.5

    使用 添加角色和功能向导 安装 .NET Framework 3.5 功能

    _images/sql-install-netfx35-001.png

    由于这个安装过程会从互联网下载内容,你可以按照以下方式使用本地安装盘中的备用路径来加快安装过程

    _images/sql-install-netfx35-002.png
  2. 配置和安装SQL Server 2014

    运行SQL Server 安装程序并选择 安装|全新SQL Server独立安装或向现有安装添加功能

    _images/sql-install-001.png

    接受许可条款

    _images/sql-install-002.png

    如果您的服务器可以链接互联网,请选择 使用Microsoft Update检查更新

    _images/sql-install-003.png

    安装规则 页面中点击 下一步

    _images/sql-install-004.png

    注意

    这里的2个警告分别是提示我们正在一台域控制器上进行SQL Server安装,这是不推荐的方式;另外一个是因为我们没有针对SQL Server进行防火墙配置。

    由于我们采用单机安装的方式,这2个警告都可以忽略。

    选择 SQL Server功能安装

    _images/sql-install-005.png

    针对TFS的使用场景,我们至少需要安装以下所选定的功能

    • 数据库引擎服务
    • 全文和语义提取搜索
    • Analysis Service
    • Reporting Services - 本机
    • 客户端连接工具
    • 客户端连接工具向后兼容性
    • 管理工具 (基本和完整)
    _images/sql-install-006.png

    使用 默认实例

    _images/sql-install-007.png

    使用 TFS 服务账户 TfsService 运行所有服务

    _images/sql-install-008.png

    确保 排序规则 都使用 Chinese_PRC_CI_AS

    _images/sql-install-009.png

    推荐使用 混合模式 的身份认证,这样非域用户也可以比较容易的访问SQL Server 将TfsAdmin管理员账户加入SQL Server管理员组,确保TFS管理员可以有足够的权限管理SQL Server

    _images/sql-install-010.png

    将TfsAdmin管理员账户加入SQL Analysis Service管理员组,确保TFS管理员可以有足够的权限管理SQL Analysis Service

    _images/sql-install-011.png

    选择 Reporting Service 的版本安装和配置

    _images/sql-install-012.png

    检查配置,开始安装

    _images/sql-install-013.png

    等待安装完成,并检查所有组件安装成功。

    _images/sql-install-014.png

至此,我们就完成TFS所需要的SQL Server环境的安装部署。

小型(单机)部署安装说明

在这份文档中,我们将完成小型(单机)模式的TFS安装和配置过程。

安装账户

确保你使用 TFS管理员账户 登录计算机进行以下操作

_images/account-tfsadmin.png
TFS 安装过程

启动TFS安装程序并点击 安装

_images/tfs-install-001.png
TFS 配置过程

TFS配置中心 中选择 完整服务器 并点击 启动向导

_images/tfs-install-002.png

完全服务器配置向导 中点击 下一步

_images/tfs-install-003.png

数据库 页面中,确保 SQL Server实例正确,点击 测试,确保测试成功,点击 下一步

_images/tfs-install-004.png

账户 页面中,输入 TFS服务账户 TfsService,点击 测试,确保测试成功,点击 下一步

_images/tfs-install-005.png

应用层 页面中,点击 下一步

_images/tfs-install-006.png

报告 页面中,选中 配置用于Team Foundation Server的报告,点击 下一步

_images/tfs-install-007.png

报告|Reporting Services 页面中,点击 填充URL,确保服务器URL正确,点击 下一步

_images/tfs-install-008.png

报告|Analysis Services 页面中,确保实例名称正确,点击 测试 成功,点击 下一步

_images/tfs-install-009.png

报告|报表读取账户 中,输入tfsreport账户,点击 测试 成功,点击 下一步

_images/tfs-install-010.png

SharePoint 页面中,不要选中 启用与SharePoint的集成 ,点击 下一步

_images/tfs-install-011.png

项目集合 页面中,保留所有默认值,点击 下一步

_images/tfs-install-012.png

评审 页面中,检查所有配置正确,点击 下一步

_images/tfs-install-013.png

就绪检查 页面中,等待所有检查通过,点击 配置

_images/tfs-install-014.png

等待TFS安装完成,出现以下页面,并点击 下一步

_images/tfs-install-015.png
_images/tfs-install-016.png

点击 关闭

至此,我们就完成了小型(单机)模式的TFS部署,你可以在服务器上打开浏览器并导航到 http://localhost:8080/tfs, 查看TFS门户显示正常。

_images/tfs-install-success.png

下一步,你就可以在TFS服务器上创建项目,开始使用了!

中型(双机)部署安装说明
大型(集群)部署安装说明

TFS Build vNext Agent 简介及安装配置指导

TFS Build vNext 是微软与TFS 2015版本一同发布的全新一代持续集成引擎,它对不同的操作系统,开发环境,语言和工具提供了良好的兼容性。可以部署在包括Windows, Linux, Unix和Mac的各种主流操作系统上,支持包括.net, java, iOS, Android等各种语言的编译打包和自动化。

这一版本的 Build Agent 使用Node.js开发,通过开源的方式提供给社区,并接受社区的反馈和代码Pull Request, 以下是GitHub地址:

https://github.com/Microsoft/vso-agent

引擎中所提供的所有构建任务和脚本也通过GitHub开源,可以通过以下地址获取:

https://github.com/Microsoft/vso-agent-tasks

对于不同的开发语言和环境,您可能会使用不同的构建工具,本引擎中已经包括了主流的构建工具,如下图:

_images/add-build-steps.png

如果你的项目已经有了自己的构建脚本,你也可以很容易的进行调用;提供了不同操作系统上的脚本调用方式,如:Windows上的PowerShell和cmd,Linux上的shell script等,如下图:

_images/add-build-steps-utility.png

对于不同的语言的单元测试框架也提供了很好的支持,包括 VSTest, NUnit, XUnit和JUnit, 如下图:

_images/agent-install-8.png

测试结果可以被发布到TFS服务器上,并在构建结果中显示,对于失败的测试用例可以直接转换成Bug分配给开发人员进行修复

_images/agent-install-9.png
Windows环境安装和配置向导

在执行以下步骤前,需要在您的Windows系统上安装Node.JS,可以中以下地址获取Node.JS安装包:

https://nodejs.org

注解

一般来说,推荐使用LTS(长久支持版)的Node安装包,并根据您所使用的操作系统的版本选择x64或者x86版本来使用。

  1. 登录系统,在系统的右上角点击 齿轮 标志进入后台
_images/agent-install-1.png

注解

您的登录账户需要是 团队项目集合管理员 组的成员才具备管理构建代理的权限。

  1. 在后台 控制面板 中,点击 代理池 | 下载代理 按钮,并保存下载好的.zip文件
_images/agent-install-2.png
  1. 将zip包内容解压缩至一个本地路径,建议放置在 C:\buildagent 目录下面
_images/agent-install-3.png
  1. 以管理员身份 运行 Windows Powershell 命令行工具,并将ExecutionPolicy设置为Unrestricted,具体命令为
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
  1. 进入 c:\buildagent 目录,并运行 ConfigureAgent.cmd
_images/agent-install-4.png

上图对代理名称,服务器地址,代理池名称,工作文件夹进行了配置。如果作为服务运行,则还需要输入服务所使用的账户

_images/agent-install-5.png
配置项 说明
代理名称 默认为当前机器名
服务器地址 为你的TFS服务器的地址,如:http://tfs2015.vsalm.local:8080/tfs
代理池 代理池是服务上用来管理代理的容器,默认为default;也可以自己创建代理池。在配置构建的时候可以选择代理池来执行构建。
工作文件夹 构建的过程会在这个文件夹中执行,包括:下载代码,执行编译,运行测试等
服务账户 如果选择使用服务方式运行代理,则需要制定此服务所使用的账户名称和密码

注解

对于是否要将代理作为Windows服务进行安装,可以视情况而定,一般来说

  • 作为Windows服务运行:每次系统启动服务即可启动,相对维护简单
  • 不作为Windows服务运行:则每次需要人工运行RunAgent.cmd来启动,但是如果所运行的任务需要和桌面进行交互,则会比较方便,如:运行自动化界面测试。
  1. 回到TFS后台 控制面板 中,你将可以看到新配置的代理出现在代理池中,并在功能页中列出了这台机器所具备的能力(也就是当前代理商所安装的各种工具)
_images/agent-install-6.png

注解

为了能够支持不同开发语言的编译,测试的打包,我们需要安装不同的工具,如:对于传统的.NET应用,我们需要安装Visual Studio;对于Java应用,需要JDK和Maven/Ant;对于很多前端语言,我们还需要安装Grunt, Gulp等工具。

  1. 最后,我们还需要对权限进行配置,你可以将允许管理这个代理的人员加入到 Agent Pool Administrators 这个角色中。
_images/agent-install-7.png

至此,Windows环境上的安装和配置完成。

Linux环境安装和配置向导

todo

Mac环境安装和配置向导

todo

常见问题