buildbot入门系列—介绍篇
一、介绍
1. buildbot是一个开源的基于python的持续集成系统,它能够以下三种方式触发相应的自动构建和测试运行,从而迅速的发现问题所在,同时指出造成这个错误的开发人员,当然我们还可以通过页面直观的了解到当前所有和master绑定的任务以及各种测试状态。
1) 监控代码管理库的变化从而触发构建测试任务
2) 通过配置从而定时触发构建测试任务
3) 通过配置从而允许强制触发构建测试任务
2. 因为它有很多比较好的特点:
1) 跨平台:可以运行在各种平台上,实现不同平台上的测试
2) 可以处理各种语言编写的程序,例如C,Java,Python
3) 环境要求低并且配置简单:仅仅需要Python,和网络库Twisted
4) 结果的交付方式多,例如Email,webpage,IRC或者其他协议工具
5) 通过子类继承并重写父类从而灵活的配置
6) 很好的实现了分布式部署和集成工作
所以目前有很多大公司都在使用这个系统,比如
1) chrome : https://chromium-build.appspot.com/p/chromium/console
2) webkit : http://build.webkit.org/waterfall
二、系统基本原理
1.系统整体架构
buildbot主要由一个buildbot-master和一个或者多个buildbot-slave两部分通过网络拓扑结构中的星型结构连接而成,如图:
注意:由于历史原因,很多情况下,我们都直接称buildmaster为buildbot,而buildslave称呼不变。
下面我们通过上面这幅图来详细了解下各部分的作用吧。
1) Repository :代码管理库,用于团队开发的代码管理和版本控制,目前流行的有svn,cvs,git……
2) Buildmaster:主要负责分派并且告诉slave什么时候进行测试,怎样进行测试,进行什么样的测试,可以说是一个决策中心,而这个决策中心的核心在于master.cfg这个配置文件,它其实是一个用python语法来写的配置文件(配置文件后期会进行讲解)。
3) Buildslave : 负责根据buildmaster下发的Command命令执行测试,同时将执行状态和结果返回给buildmaster
4) Notifiers :当BuildMaster接收到BuildSlave的执行结果后触发Notifiers,根据配置的方式将结果交付。
2.BuildSlave、BuildMaster、Repository间的通讯
1) BuildSlave通常运行在一台或者多台不同的独立的机器中,这些机器可以有不一样的系统,具体根据你的兴趣和需求而定。然后这些BuildSlave机器都是通过TCP连接到BuildMaster机器的公共端口进行通讯的。当然这些机器和buildmaster或者Repository之间不一定必须直接相连,中间可以有一些简单的防火墙机器,只要不妨碍builslave和buildmaster、Repository之间的通讯即可。
2) 他们三者间的TCP连接,都是由BuildSlave主动发起的
3) 所有的命令都只能由BuildMaster下发到BuildSlave,而且不管是BuildMaster下发的命令,还是BuildSlave上传的结果都是通过TCP连接进行传输的
4) BuildMaster并不提供源代码,因此BuildSlave需要源代码的时候必须能够连接到Repository 进行相应操作。
2.BuildMaster的架构
Buildmaster由以下四大部分组成,如图,假设我们的Repository是VC Repository:
下面我们来简单介绍下上面的每个部分的用途,这些在master.cfg中都能够进行配置的:
1) ChangeSources:Scheduler的触发源,每当VC Repository发生了变动,就会创建一个Change对象提交给各个Scheduler
2) Schedulers : 决定什么时候进行构建和测试任务,该Scheduler将会收集ChangeSources提交过来的Changes到BuildRequests中,当BuilderSlave可用时,就将这些changes排队成Queue交付给Builders
3) Builder :决定如何执行构建和测试任务,每一个Build只运行在一部机器中
4) SlaveBuilder : 多个SlaveBuilder组成一个BuildSlave。
5) Status plugins:用于交付构建结果的插件
从图中我们还可以看出(注意BuildSlave和SlaveBuild是不一样的哦),
1) 每一个Builder是由一些列与他的构建任务相关的BuilderSlave组成的。这些BuilderSlave的地位是平等的,这么做的原因只是为了负载均衡
2) Builder将会在与它相关联的BuilderSlave中创建一到多个SlaveBilder,这些SlaveBuilder是独立运行在不一样的文件夹中。
3) 多个Builder可以共享一个BuildSlave。
3.Buildbot的控制流程
从2.BuildMaster的架构章节中的那幅图中,我们还可以看出BuildBot的整个控制流程。
1) 有这么一个开发人员,提交了一些改动了的代码到Repository 中,然后builbot中的相关脚本监控到了就通过Email或者网络连接将这些改变信息发送给了buildmaster,信息中包括了谁导致了这些变动,哪些文件被修改了,包含这些改变的版本以及一些其他的注释。
2) buildmaster分配这些改变到不同的Scheduler,一些相应有配置的改变将会触发tree-stable-timer开始计算,同时该改变被添加到一个新的Build中,当tree-stable-timer到了有效期,该Build将会被添加到一个Builder中并且运行在一个BuildSlave中,当然这个Builder中的所有Build构建运行测试任务用的都是同一版本的源代码。
3) 这些Build又是由一系列的步骤Step构成的。每个Step都会包含一条甚至多条将会在BuildSlave机器中运行的命令。一般情况下,第一个Step都是从Repository中导出源代码。接下来的一般都是进行编译或者单元测试的。在执行过程中,所有的Setp都会将它们自身执行命令的结果以及状态返回给buildmaster。
4) 当这些Build运行的时候,它们会将相应的如"Build Started", "Step Started", "Build Finished"这些命令打印到所有的状态终端中。比如我们常见的waterfall。
5) 当一个 MailNotifier 状态终端被激活的时候,一个build完成之后都会发送一封email通知相应的开发人员。当然我们也可以配置当且仅当运行失败的时候才通知相应的开发人员。
4.状态交付架构
BuildMaster维持着一个核心的Status对象,这个核心的Status对象连接着很多Status plugin,通过这个核心对象,我们可以获取到每一层的所有构建状态对象,如图:
因此,每一个Status plugin都有一个引用指向图中最顶层的那个核心Status对象,从而可以获取到每一个Builder、build,Step甚至日志文件的信息。除此之外,当有新的Build创建时,Status还可以通过核心Status对象去监听新的Build。
buildbot入门系列—介绍篇的更多相关文章
- Entity Framework 6.0 入门系列 第一篇
Entity Framework 6.0 入门系列 第一篇 好几年前接触过一些ef感觉不是很好用,废弃.但是 Entity Framework 6.0是经过几个版本优化过的产物,性能和功能不断完善,开 ...
- sencha touch 入门系列 扩展篇之sencha touch 项目打包压缩
经常有新手同学抱怨说sencha touch的项目加载速度为什么这么慢,经常要10秒左右的时间甚至更多, 大家都知道,sencha touch开发的项目中引用了大量的js文件,当我们打开项目时,st的 ...
- 智能家居系统 Home Assistant 系列 --介绍篇
一. HomeAssistant 是什么? HomeAssistant是构建智慧空间的神器.是一个成熟完整的基于 Python 的智能家居系统,设备支持度高,支持自动化(Automation).群组化 ...
- STM32入门系列-介绍STM32型号与功用
作为STM32初学者,一般会选择购置一块开发板,因为在开发板上有很多已经集成好的模块,如红外模块.按键模块.LED模块.DAC模块.ADC模块.can模块.485模块.以太网模块.WiFi模块.蜂鸣器 ...
- Microsoft Hololens 入门系列-01-开篇
1.能做什么 Microsoft HoloLens是第一台运行Windows10系统的全息计算机,它已经不受任何限制——没有线缆和听筒,并且不需要连接电脑.Microsoft Hololens能够让你 ...
- c#入门系列——基础篇
c#与VB的区别 刚接触c#发现c#与vb还是有所不同的--它可以在控制台显示.它比vb多出来了一些东西.代码规范上跟VB也稍有不同.....暂时就发现这么多,正在努力发现中. c#的代码结构 ...
- k8s入门系列之扩展组件(一)DNS安装篇
DNS (domain name system),提供域名解析服务,解决了难于记忆的IP地址问题,以更人性可读可记忆可标识的方式映射对应IP地址. Cluster DNS扩展插件用于支持k8s集群系统 ...
- k8s入门系列之集群安装篇
关于kubernetes组件的详解介绍,请阅读上一篇文章<k8s入门系列之介绍篇> Kubernetes集群安装部署 •Kubernetes集群组件: - etcd 一个高可用的K/V键值 ...
- k8s 入门系列之集群安装篇
关于kubernetes组件的详解介绍,请阅读上一篇文章<k8s入门系列之介绍篇> Kubernetes集群安装部署 •Kubernetes集群组件: - etcd 一个高可用的K/V键值 ...
随机推荐
- 危险的“我以为”DDoS&丑陋的现实
有些话题可能终其一生你也可以假装不知道就好了,比如全球气候在变暖,不过有些话题确是不得不面对的冰冷现实,在互联网日益发达的当下,比如你不得不面对的DDoS攻击. DDoS代表了分布式拒绝服务,通过许多 ...
- JQuery初体验
虽然做b/s也有一年半了,但是还没怎么认真的去看JQuery,趁自己生病的这几天,恶补一下JQuery方面的知识,保持学习的态度,内容很简单,聊以自慰一下>_<.废话不多说,直接上代码了. ...
- 关于webstorm 对 vue的设置
1. 首先安装vue插件,安装方法: setting --> plugin ,点击plugin,在内容部分的左侧输入框输入vue,会出现两个关于vue的插件,点击安装即可.安装完成后,就可 ...
- 【OpenGL】如何绘制Shadow
背景 Shadow即阴影,它是光线被不透明物体遮挡而产生的黑暗区域,与光源的方向相反. 在Blender中编辑过程中没有Shadow,只有在经过渲染后才能显示.目前有一个基于Blender的项目,要求 ...
- HTML页面跳转的5种方法
下面列了五个例子来详细说明,这几个例子的主要功能是:在5秒后,自动跳转到同目录下的hello.html(根据自己需要自行修改)文件.1) html的实现 <head> <!-- 以下 ...
- HTML5所有标签汇总
来自lampbrother兄弟连HTML5与CSS3教程.<xmp> 结构标签:(块状元素) 有意义的div<article> 标记定义一篇文章<header&g ...
- npm ERR publish 403,nodejs发布包流程
nodejs学习体验之发布包,发布环境如下:1:win10系统,2:已安装nodejs. 具体操作步骤如下: *编写模块 1)新建文件夹,比如:somepackage 2) 该文件夹下新建js文件,比 ...
- 在app中打开appStore中其他app
var str = "https://itunes.apple.com/cn/app/zhang-jiange-hao-tou-zi-ke/id402382976?mt=8"//这 ...
- redis cluster节点管理测试
####redis v3.2.0###添加节点:1.添加master节点 170 ./redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7001 171 ...
- mysql删除开放用户权限
来访用户ODBC 1,在本地的cmd中用root用户进入mysql2,创建一个ODBC的用户create user 'ODBC'@'localhost';查看用户是否创建成功select user,h ...