使用buildbot实现持续集成(转载)
转载自:http://www.oschina.net/p/buildbot
使用 Buildot 实现持续集成
使用基于 Python 的工具实现持续集成的理论与实践
牛仔式编码的日子在大多数组织中早已不复存在,由一种优质软件创建新潮所取代。持续集成(CI)测试是敏捷的编程方法实践中一个至关重要的部分,能够实现高品质软件。通过探索 Buildbot 来学习 CI 测试的理论和实践,Buildbot 是用 Python 编写的一个开源 CI 系统。
持续集成(CI)是发扬以下原则的一个软件开发流程:
维护单源存储库
自动化构建过程
实现自测试构建
每个人每天都有贡献
每一份贡献都应用于在一个集成机上构建主线
加快构建过程
在一个相同的生产环境中执行测试
使任何人都可以简单获取最新的可执行文件
每个人都可以看到当前状况
自动化部署
经 Martin Fowler 大力普及,CI 的基本理念就是持续测试并构建每个分支程序和将分支代码合并后的软件。这可以从总体上提高代码库的健康状况。还可以增加与团队成员的交流,并有机会获取对代码整体质量的反馈。人们通常使用这个周期来生成代码覆盖报告和其他统计信息。
Buildbot 类似于其他 CI 系统,有助于自动化这个检查、构建和测试流程。Buildbot slaves 通常运行于不同的平台,比如 Win32、Solaris、Intelx64 等。当一个构建(build)中断时,Buildbot 可以发送一个电子邮件通知,它追踪所有运行中的构建,这样开发人员就可以鸟瞰整个流程。最后,人们常常利用自动化周期构建既定时间内软件质量的度量标准。本文结尾将谈及该度量标准以及在一个 CI 系统内运行它们的原因。
Buildbot 简介
在我们深入探讨 Buildbot 之前,先看一下其架构。如图 1 所示,在构建流程的顶部主要有三个层。首先是一个版本控制层,它从一个版本控制系统钩入通知。其次是一个构建层,它从构建主服务器那里获取通信,并返回构建结果。最后是一个通知层,用于在构建失败时发送电子邮件或一个 IRC 消息,或让一个 web 页面显示构建的累积结果。
图 1. Buildbot 架构概览
Buildbot 架构的中心特性之一是对基于 Python 的 Twisted 库的依赖性,用于处理主服务器(master)和伺服机(slave)之间的异步通信。这个基于回调的架构支持一个很简单、但健壮的主/伺服反馈圈。在本文后面的 参考资料 部分可以找到有关 Twisted 的更多信息。
如果您尚未听说过 Buildbot,在 Google 上搜索一下就会找到大量与大小开源项目相关的主服务器和伺服机。关于伺服机,我在前面简单地提及了一下,它本义上是一个由主 Buildbot 服务器控制的伺服机器。一般来讲,一个伺服机是多个运行不同测试平台的伺服机之一。这是 Buildbot 服务器中一个很重要的概念。例如,您可能在一个开源项目的邮件列表上,听到有人说,“有人自愿充当 Windows 伺服机的虚拟机吗?”
Python 语言项目本身使用大量 Buildbot 伺服机,在尽可能多的平台上持续构建和测试最新版的 Python。图 2 显示了运行 Python 主干的许多伺服机以及测试。随着虚拟化技术的发展,现在可以常常要求开发社区成员托管一个 Buildbot 伺服机,或仅仅运行模拟不同硬件配置的几个虚拟机。
图 2. Python Buildbot;参见 放大图
另一个备受瞩目的 Buildbot 用户是 Google Chrome 浏览器项目。图 3 显示了一个高度定制的 Buildbot,它极大地增强了 Buildbot 用户界面的外观。幸运的是,Google 将这些增强的开放代码提供给 Buildbot,从下面的 参考资料 部分,您可以获取源代码并构建这个定制版本。
图 3. Google Chrome 增强的 Buildbot;参见 放大图
构建这个配置不在本文讨论范围内,但是我建议您自己看一下。现在我们看一下如何使一个 Buildbot 主服务器快速运转起来。
5 分钟内设置 Buildbot
我在 Ubuntu 8.10 上执行了这几步,不过它们应该在大部分 Linux 系统上都适用:
- 下载 ez_setup.py:
wget http://peak.telecommunity.com/dist/ez_setup.py
- 安装 easy_install:
sudo python ez_setup.py
- 使用 apt-get 安装 Python Twisted 包
sudo apt-get install python-Twisted
- 遵循这个 collective.buildbot “秘诀”:
sudo easy_install collective.buildbot
此时,许多东西开始涌出 shell,因为有一大堆包被下载且得到自动安装。完成这些步骤之后,就可以开始创建 Buildbot 了!如果安装过程进行得很顺利,在 shell 提示符处输入:
$ paster create -t buildbot my.project $ cd my.project
现在设置已经快完成了,但在完成之前,我要提几个在首次配置 Buildbot 时您容易出错的地方。在您的 my.project/master.cfg 文件中,应该可以看到以下内容:
清单 1. master.cfg 内容
[buildout]
master-parts =
master
passing.project
# uncomment this to enable polling
poller [master]
recipe = collective.buildbot:master
project-name = passing.project project # allow to force build with the web interface
allow-force = true # internal port
port = 9051 # http port
wport = 9081 # buildbot url. change this if you use a virtualhost
url = http://localhost:9081/ # static files
public-html = ${buildout:directory}/public_html slaves =
localhost NaOaPSWb [passing.project]
recipe = collective.buildbot:project
slave-names = localhost
vcs = hg
repositories = /home/ngift/myhgrepo # notifications
mail-host = localhost
email-notification-sender = buildbot@cortese
email-notification-recipient =
super@example.com # run test each hour
periodic-scheduler=60 # cron build
cron-scheduler = 0 8 * * * # You can change the sequences to build / test your app
# default options should work for most buildout based projects
build-sequence =
# /usr/bin/python2.5 bootstrap.py -c project.cfg
# /usr/bin/python2.5 bin/buildout -c project.cfg test-sequence =
nosetests
# zope.testing require exit with status
# bin/test --exit-with-status [poller]
recipe = collective.buildbot:poller
# don't forget to check this
# since it's generated from the paster template it may be a wrong url
repositories = /home/ngift/myhgrepo
#user = h4x0r
#password = passwd
poll-interval = 120
最初检查最重要的内容是确保有合适的源控制存储库,一开始将 build-sequence
留空,当代码迁出您为它提供的存储库时,您的 test-sequence
(在我的例子中是 “nose”)会通过测试。如果您有其他问题,请查阅 collective.buildbot 资源指南(参阅 参考资料 对该指南的链接)。
设置好配置文件之后,只需运行下面两个命令:
$ python bootstrap.py $ ./bin/buildout
在运行 buildout
命令时,您会看到以下输出:
清单 2. buildout 命令的输出
{673} > ./bin/buildout
Unused options for buildout: 'master-parts'.
Installing master.
New python executable in /home/ngift/my.project
Installing setuptools............done.
[output suppressed for space]
该命令结束之后,您就完成了 Buildbot 的安装,现在就可以使用它了。运行以下 shell 命令启动 Buildbot 守护进程:
$ ./bin/master start $ ./bin/yourhostname start
如果您在浏览器中输入在主 .cfg 文件中设置的 URL,默认情况下为 http://localhost:9081/,您会看到全新的 Buildbot。当然,它现在可能还没有多少功能。如果您为它提供一个构建脚本和一个测试运行程序,它会很乐意检查、构建并自动测试您的代码。当然,您稍后应当浏览一些配置选项,但最难的部分已经完成了。
生成代码度量报告
“测试迷” 中一个最新的智能开发,是要利用持续集成周期来生成有关源代码的度量。其中一种最流行的方法是运行带既定选项的 nosetest 测试收集器。如果您有一个名为 “foo” 的项目,您通常会运行:
nosetests --with-coverage --cover-package=example --cover-html \ --cover-html-dir=example_report.html test_example.py
这会生成一个 HTML 报告,显示未涉及的所有代码行,以及类似于清单 3 的 stdout 的输出:
清单 3. nosetest 输出
nglep% nosetests --with-coverage --cover-package=example
--cover-html-dir=example_report.html test_example.py
.
Name Stmts Exec Cover Missing
---------------------------------------
example 2 2 100%
----------------------------------------------------------------------
Ran 1 test in 0.004s OK
您可以从 下载 部分下载 example.py 和 test_example.py。
每次修改代码后都运行这个报告,为开发人员和管理人员提供有关代码变化的元数据。这是展示为何同时运行度量标准的一个绝佳例子,因为 CI 对一个项目有好处。
另一个提供代码元数据的度量工具是 PyMetrics 的 McCabe 评定。早在20 世纪 70 年代,Thomas McCabe 就提出一个简单、但独创性的代码观察结论:一段代码越复杂,它中断的可能性就越大。这虽然看起来很明显,但遗憾的是,很多开发人员似乎看不到其中的联系。使用 PyMetrics 的命令行工具,您可以确定每个函数的分支数。
通常,您希望将编写的每个方法或函数的分支数保持在 10 以下,因为在人脑中保留 7 或 8 份内容很难。类似的,大于 50 段的代码基本上是无法测试/无法维护的。
我就亲眼看到过 140 多段的代码,代码很差,它确实验证了 McCabe 的理论。如果您可以在开发前期捕获和标记这个复杂、脆弱的代码,那么即使所有测试都通过,它也不会出现在生产环境中。
结束语
持续集成的主要优势是,能够通过软件的自动化构建以及测试和软件度量标准(可选)精简品质保证周期。每次更改源代码并为项目生命期提供即时反馈和报告时,都会触发构建。当 CI 得到正确配置时,它实际上就集成到代码生成过程中,如同亲自参与编写代码一样。
Buildbot 并非用于 CI 测试的惟一工具。您也可以了解一下 Hudson 和 Bitten。它们都支持使用 Python 插件进行定制,即使 Hudson 是用 Python 编写的。参阅以下的参考资料,详细了解这些系统相关内容。
使用buildbot实现持续集成(转载)的更多相关文章
- 入门系列之在Ubuntu 16.04使用Buildbot建立持续集成系统
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由angel_郁发表于云+社区专栏 介绍 Buildbot是一个基于Python的持续集成系统,用于自动化软件构建,测试和发布过程. 在 ...
- (转载)持续集成(第二版)[来自:Martin Fowler]
转载自:iTech的博客 持续集成(第二版) 作者:Martin Fowler 译者:雷镇 持续集成 是一种软件开发实践.在持续集成中,团队成员频繁集成他们的工作成果,一般每人每天至少集成一次,也可以 ...
- 《转载》Jenkins持续集成-自动化部署脚本的实现《python》
本文转载自慕课网 读者须知:1.本手记本着记续接前面的两张手记内容整理2.本手记针对tomcat部署测试环境实现 最近工作比较繁忙,导致这章一直拖延,没有太抽出时间来总结.要实现Jenkins端的持续 ...
- Jenkins持续集成git、gitlab、sonarqube(7.0)、nexus,自动化部署实战,附安装包,严禁转载!!!
导读 之前用的都是SVN,由于工作需要用到Git,求人不如求己,技多不压身,多学一项技能,未来就少求别人一次,系统的学一遍,自己搭建一整套环境,自动化部署(自动发版),代码质量检测等等(为啥不用doc ...
- [转载]"百度方法+"案例—从持续集成到持续交付
前言 百度开放云(https://bce.baidu.com)是百度基于十五年基础架构核心技术积累推出的云服务,目前推出了14个云计算产品和9个大数据产品,并提供数字营销云.在线教育.物联网等10种解 ...
- 【转载】soapui基于持续集成工具自动化运行的调研姿势
soapui中的testrunner.bat调研姿势,用于自动化测试副标题:soapui基于持续集成工具自动化运行的调研姿势 各位亲爱的同仁们,大家好吗?最近项目在搞持续集成工具,我们的测试用例都是基 ...
- 持续集成工具hudson【转载】
第一节 我的理解 项目中使用了hudson,那么hudson是处在怎样的一个地位呢? 首先就我自己的认知,项目中hudson的作用有一下几点: 1.获取svn服务器上的最新代码: 2.把最新代码编译打 ...
- ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(一)(转载)
本文结构 ASP.NET Core应用程序的构建 ASP.NET Core应用程序容器化所需注意的问题 应用程序的配置信息 端口侦听 ASP.NET Core的容器版本 docker镜像构建上下文(B ...
- 【转载】Maven安装配置+ GIt&SVN + Jenkins详细配置 软件项目管理 持续集成实验
原文地址: https://www.cnblogs.com/clownice/p/5395933.html 以下是学习笔记: Jenkins是一款开源持续集成的软件,实现集成的自动化 自动构建工具:M ...
随机推荐
- PHP图标类库 - JpGraph使用详解
http://w3note.com/web/181.html 微信平台开发的推广支持应用里,为了满足用户渠道推广分析的需要,公众平台提供了生成带参数二维码的接口.使用该接口可以获得多个带不同场景值的二 ...
- ***php解析html类库simple_html_dom
下载地址:https://github.com/samacs/simple_html_dom 一直以来使用php解析html文档树都是一个难题.Simple HTML DOM parser 帮我们很好 ...
- Selenium WebDriver 中鼠标和键盘事件分析及扩展(转)
本文将总结 Selenium WebDriver 中的一些鼠标和键盘事件的使用,以及组合键的使用,并且将介绍 WebDriver 中没有实现的键盘事件(Keys 枚举中没有列举的按键)的扩展.举例说明 ...
- XML DOS 攻击
内容来自此文:http://msdn.microsoft.com/en-us/magazine/ee335713.aspx DoS(Denial of service:拒绝服务)攻击由来已久(1992 ...
- JAVA! static什么作用?
是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只 ...
- linux下centos安装android sdk最新全面教程【可行】
1.此教程解决了当你配置完android sdk的环境变量以后,可能在命令中打入adb还是提示错误.现在给大家提供最新解决方法,此方法同时可以解决最新的centos 6.5版本 2.本教程支持最新ja ...
- javascript精确计算
一篇文章: 4 个用于执行高级数学计算的 JavaScript 库 numbers.js Numeric Javascript accounting.js Tangle 有时只需要加减乘法能精确,没 ...
- PHP命名空间概念解析
1. PHP中的命名空间是什么? 什么是命名空间?“从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮 ...
- Drawable(5)关于从资源文件构造的Drawable不显示
要给它设置个bounds才可以 TextView noticeHeaderView; TextView headerRefreshText; ProgressBar headerRefreshPgrs ...
- CFF前端沙龙总结
一. -OOCSS + Sass ——大漠 1. OOCSS 结构<=>皮肤 分离 容器<=>内容 分离 2. Sass 工具.处理器 SCSS(CSS风格)<=> ...