写点什么

所有的团队都应该使用自动构建吗?

2013 年 7 月 29 日

我们与 Team Foundation Server 的高级项目经理 Chris Patterson 讨论了在现代化应用程序开发中,自动构建与持续交付所扮演的角色。Team Foundation Service 是由 Microsoft 托管的 Team Foundation Server。

InfoQ:你是否觉得所有的团队都应该使用自动构建?如果答案为是,为什么?如果为否,那么在何种环境下能体现出它的重要性呢?

Chris简短的回答是:是的,所有团队都应该使用。首先,我想区分一下代码编译与构建。我认为一个构建应该起码包含运行你的单元测试,否则的话就仅仅是代码编译而已,而这仅针对那些无法通过编译的项目才能起到作用。随着 HTML5 和 JavaScript 越来越多地被项目所采用,甚至使用在原生的 Windows 应用中,单纯的编译步骤已无法给你初级的反馈了。因此,单元测试现在成为了你和你所引入的 bug 之间的第一道防线。我甚至建议只有一个人的团队也要搭建自动构建系统。

记着这一点,你会发现使用自动构建的诸多好处。

首先它为流程的规范化带来好处。自动构建促使开发者或开发团队在创建软件的同时建立并维护一个可重复的、文档化的流程。多数开发者都在不同场合被“在我的机器上能够运行”这种 bug 所困扰。典型的原因是因为开发者工作机上的某些依赖项没有安装在测试或者客户环境上。持续的、可重复的自动构建流程能促使团队保证他们的软件在 IDE 和开发者工作机之外也能够编译并运行基本的单元测试集,这有效地避免了上述 bug 的发生。

除此之外,自动构建也有助于发现及突出一些其它常见问题:

  • 某个开发者的签入破坏了构建
  • 某个开发者忘了签入某个重要文件或者配置变更
  • 你的构建脚本不能运行,或者你的软件不能通过单元测试了

关于软件工程流程中自动构建的重要性的好文章有很多,Martin Fowler 就有一个极好的例子。

InfoQ:你是否认为要想成功应用自动构建,必需了解如何编写 MSBuild脚本?

ChrisMSBuild 是一门创建自动构建脚本的技术,也在 Visual Studio 中使用。从这个角度来看,如果你使用 Visual Studio 进行工作,你应该熟悉 MSBuild 并了解如何编写脚本。

.NET 社区中还流行着其它一些构建脚本工具,例如 NAnt 和 PSake 等等。我个人对它们虽然并不十分精通,不过我的确知道大家对它们热情十足。

我们在 Team Build 中组合使用了 MSBuild 和 Windows Workflow。MSBuild 用来处理 Visual Studio 解决方案和项目文件,我们用它进行代码自动编译。从 TFS 中获取你的代码,执行 MSBuild,运行单元测试并将结果写回 TFS 这一整套流程则是由 Windows Workflow Foundation 完成的。这种组合建立了一个非常强大而灵活的系统,开发者可以利用它实现完全的自动化,包括构建、测试环境管理甚至是生产环境的部署。

不过,如果你使用其它技术,那么你就需要了解如何运行它的构建系统。

InfoQ:你觉得 TFS 在怎样的自动化部署(例如持续交付)场景中表现得特别优秀或者糟糕?

ChrisTeam Build 的一大优势是你可以做任何想做的事,但这也可能是它最大的弱点。Windows Workflow 运行时功能非常强大并且适用。不过这对开发者而言意味着一定的学习曲线。对这个平台有所钻研并真正了解它的人能完成连我们都想象不到能为客户实现的功能,而对于不了解 WF 的开发者来说,即使是简单的构建定制也会是一个挑战。这意味着,Team Build 对于任一种自动化部署机制都是一个好的选择,但对开发者来说未必能马上了解如何使用它实现目标。

为了改善开发者在持续交付方面的体验,我们和 Azure 团队合作,提供了从 Team Foundation Service 到 Windows Azure 之间一个无缝的持续交付工作流。只需数次点击,开发者就能够将他们的 Team Foundation Service 帐号与他们的 Azure 订阅连接起来。这个流程同时还创建了一个预配置的构建定义,能够将 web 网站或云服务部署到该订阅中。开发者所要做的只是在他们的解决方案中指明该构建定义,其余的部分都将由我们完成。

今后,我们期待将更多的此类方案提供给 Team Foundation Service 的客户,以及在内部的防火墙中搭建 TFS 的客户。

InfoQ:有人主张持续交付不仅仅针对 QA,也可以应用到生产环境本身。这意味着,一旦自动化测试通过,它就会在没有任何人工干预的情况下自动部署到生产环境。你对这个观点的看法是什么?

Chris我非常提倡为 QA 实现持续交付,我认为能够将可运行的产品及变更交付给你的测试人员,是提高你的团队速率及软件质量最好的方法之一。再有,如果你都不能为 QA 实现持续交付,那更不可能应用到生产环境上。

为生成环境实现持续交付在某些地方正在流行起来,我相信对某些类型的业务和产品来说这是个长远之计,但对其它业务和产品就未必适用。它对开发者的自律性有着极高的要求,并且对你的自动构建要有足够的自信,确保它能够捕获任何类型的错误,而不让问题发布到客户那里。

InfoQ:对比那些独立的构建服务器,例如 CruiseControl,你觉得使用 TFS 构建 agent 的优势是什么?

Chris主要的优点在于其集成度。Team Build 是 TFS 的一部分,在安装包和 service 中都有提供,这意味着你拥有了整套设计的方案。如果你遇到任何问题,我们也将为你提供世界级的支持。Team Build 包含了一套预配置的模板,支持 Visual Studio 解决方案和 Visual Studio test runner,这使开发者能在几分钟内轻松上手并运行构建。对于 Team Foundation Service 来说,开发者甚至不需要安装构建 agent。我们为 service 提供了构建 agent,能够构建绝大多数你能在 Visual Studio 中创建的项目。

当然,独立产品的一个优势就是来自社区方面的众多支持。CruiseControl 或 Jenkins 等工具有着丰富的插件,以提供不同的功能。另外,它们的 agent 都能够运行在 Linux 和 MacOS 平台上。我们有许多客户同时使用 Team Build 和独立的构建服务器。所有 Windows 平台上的产品使用 Team Build,而运行在其它平台上的产品使用独立的构建服务器。

InfoQ:是否有计划推出 Java、iOS 及 Android 平台上的构建 agent?

Chris在这个新平台不断出现的软件开发世界,我们将持续改善在其它平台上的功能。

我们提供了一系列的工作流 activity 以及 MSBuild 任务,以允许你使用在 Java 社区中非常流行的 Ant 和 Maven 实现自动构建。实际上,我们在内部构建 Team Explorer Everywhere 产品时也使用了这些用 Java 编写的 activity。由于 Android 开发环境同样基于 Eclipse 和 Java,我们也可以使用相同的技术。

目前,iOS 应用还只能在 Mac 上开发,而我们还没有能够运行在 Mac 上的 agent。

关于作者

Chris Patterson 是参与 Team Foundation Server 开发的高级项目经理,他在软件行业已工作了 15 年,有着多种技术的工作经验,包括经典的 ASP、VB、Java 及.NET。在 2005 年加入 Microsoft 之前,他就职于 TogetherSoft 及 Borland,通过指导和培训帮助客户改进他们的软件开发流程。在 Microsoft,他负责 Visual Studio 2008 及 2010 中负载、web 及手动测试的特性,目前他负责 Team Foundation Server 和 Team Foundation Service 中的构建自动化组件的工作。他乐于帮助客户解决问题,阅读和学习技术和陪伴家人。你可以在 Twitter 中通过 @chrisrpatterson,或者在产品论坛中找到他。

查看英文原文: Chris Patterson on Automated Builds in TFS


感谢杨赛对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2013 年 7 月 29 日 09:283959
用户头像

发布了 428 篇内容, 共 148.5 次阅读, 收获喜欢 20 次。

关注

评论

发布
暂无评论
发现更多内容

云原生如何来进行HTTPS升级

soolaugust

架构 云原生 设计模式

面试必备知识点:悲观锁和乐观锁的那些事儿

鄙人薛某

面试 乐观锁 悲观锁 CAS 并发控制

自己做的 PPT 总被批「缺少干货」?试试先回答这三个问题

Tony Wu

效率工具 方法论 PPT

性能相关 磁盘I/O子系统

Linuxer

挽救你的视频号:能够把PPT转换成视频,把备注转换成语音的开源项目

陈磊@Criss

SpreadJS 纯前端表格控件应用案例:MHT-CP数据填报采集平台

Geek_Willie

week 12 学习总结

Geek_2e7dd7

MySQL复杂where条件分析

程序员历小冰

MySQL

Golang写算法

卒迹

golang 算法

甲方日常4

句子

工作 随笔杂谈 日常

揭开链表的真面目

Java旅途

Java 数据结构 链表

区块链usdt支付系统开发,承兑支付跑分系统搭建

WX13823153201

区块链usdt支付系统开发

C语言内存泄露很严重,如何应对?

华为云开发者社区

c 内存泄露 内存 代码 函数

Cassandra Gossip协议的二三事儿

华为云开发者社区

源码 三次握手 开发者 Cassandra Gossip协议

你也许还不懂静态方法和实例方法

架构师修行之路

SpreadJS 纯前端表格控件应用案例:雨诺订单管理系统(雨诺OMS)

Geek_Willie

拖延症竟然是自己给自己的一种奖励?如何干掉它?

非著名程序员

个人成长 拖延症 番茄土豆工作法

oeasy教您玩转linux-010110内容回顾

o

话题讨论 | 当你敲代码累了时,一般喜欢吃点什么补充能量?

InfoQ写作平台官方

加班 写作平台 代码 话题讨论

anyRTC Native 4.1.0.1与Web SDK 4.0.11上线

anyRTC开发者

学习 WebRTC 语音 直播 sdk

产品经理的架构思维

吴世亮

架构 产品经理 电商

week 12 作业

Geek_2e7dd7

DockerHub 镜像仓库的使用

哈喽沃德先生

Docker 容器 微服务 镜像 容器技术

java安全编码指南之:对象构建

程序那些事

Java 安全 安全编码指南 对象构建

图解Janusgraph系列-分布式id生成策略分析

洋仔聊编程

分布式 分布式系统 janusgraph 图数据库

MAC系统初始化

焦振清

macos 重装系统

Keepass+Synology 打造私人密码管理器

zj坚果

Jenkins持续集成「编译打包、代码检查、单元测试、环境部署、软件测试​」

清菡

jenkins

SpreadJS 纯前端表格控件应用案例:表格数据管理平台

Geek_Willie

1. 不吹不擂,第一篇就能提升你对Bean Validation数据校验的认知

YourBatman

Hibernate-Validator Bean Validation 数据校验 JSR380

新时代背景下的Java语法特性

高翔龙

Java java 14 java 14 新特性 Java 分布式

NLP领域的2020年大事记及2021展望

NLP领域的2020年大事记及2021展望

所有的团队都应该使用自动构建吗?-InfoQ