buildbot + bazaar + mysql的测试…

本文将介绍一个基于buildbot分布式与bazaar版本控制的 mysql测试环境

简介:

以下是我在公司做总结报告时画的图,这里就直接拿过来用了。

图1介绍了buildbot的基本架构。它有1个master和多个slave。 通常而言, 每个slave运行在不同的测试机器上。 master发送指令给slave,slave在本机执行这些指令,然后把结果返回给master。

buildbot <wbr>+ <wbr>bazaar <wbr>+ <wbr>mysql的测试环境搭建

 

图1

图2解释了master是如何生成指令并把指令传送给slave的。 master一般都配有多个builder。 每个builder都包含了一个factory和一个slave。 注意一个slave可以对应多个builder。 factory中以step的形式定义了命令的细节,把这些steps组合起来就是要发送给slave的指令。 当master给builder发送命令时, builder就会通过factory生成指令,并把指令发送给指定的slave。

buildbot <wbr>+ <wbr>bazaar <wbr>+ <wbr>mysql的测试环境搭建

 

图2

图3分析了在什么情况下master会给builder下达命令。 buildbot至少支持两种方式。 一种是通过change source发送来的源码变更提醒,另一种是用户在master的网页上选中一个builder,然后点击“force build”。 本文中用到的bzr_poller就是一种change source, 它会定期地检查bzr源码库是否有新的更改,如果有就会提醒master。 当master接收到change source发送来的变更提醒时,它会根据预定义的scheduler来给对应的builder下达build命令。 当master接收到"force build"时,它会立即给用户指定的builder下达build命令。注一个scheduler可以对应多个builder.

buildbot <wbr>+ <wbr>bazaar <wbr>+ <wbr>mysql的测试环境搭建

图3

准备:

机器A安装buildbot, 机器B安装buildslave: 查看官网的教程:http://buildbot.net/buildbot/docs/current/tutorial/firstrun.html

机器C安装bazaar并下载mysql5.5代码:参考我的上一个博文(使用源码build mysql5.5 以及 在进行不用安装的情况下 进行测试和使用的方法):http://hi.baidu.com/gao1738/blog/item/993af91060844b9be950cdc3.html

注:机器A ,B,C 可以是一台机器也可以是不同的。同时安装buildslave的机器可以有很多,一般可以起数个虚拟机来当buildslave。

创建master并修改配置文件:

>buildbot create-master master

这是新建了一个master目录,其下有个master.cfg.sample文件,修改该文件名为master.cfg,并编辑该文件。

在c['slaves'] = [BuildSlave("example-slave", "pass") ] 中添加新的slave用户名和密码 如 BuildSlave("CentOS6-i386","123456")

找到c['change_source'] , 在其上添加

from bzr_buildbot import BzrPoller

然后把c['change_source']那段话修改为

repo_base_url='bzr+ssh://buildbot:bot_build@172.16.70.152/data/bzrroot/mysql-server/'
bzr_greatsql=BzrPoller(
url=repo_base_url+'greatsql-trunk', poll_interval=30, branch_name="greatsql-trunk")
bzr_mysql=BzrPoller(
url=repo_base_url+'mysql-5.5', poll_interval=30, branch_name="mysql-5.5")
c['change_source'] = [bzr_greatsql,bzr_mysql]

(注:你需要为你的每一个branch配置一个change_source, branch_name参数不是用来指定你取哪个branch而是用来给你取来的branch命名的, 这个名字会被后面的 schedule使用)

(注:这里需要自己修改下bzr_buildbot.py 然后把它拷贝到master的目录下,具体如何修改参照下面链接:

http://buildbot.net/buildbot/docs/current/manual/cfg-changesources.html#bzr-poller (介绍如何配置bzr poller的基础)

http://trac.buildbot.net/ticket/946 (介绍错误BzrPoller Unhandled Error)

http://trac.buildbot.net/ticket/1755 (介绍错误的解决方案)

另外在bzr_buildbot.py文件中还要做如下修改:

1. 修改“else:change['who'] = repository.get_revision()” 为 “else:change['who'] = new_rev.committer” 大约在157行。(这个是在版本0.8.3中)

2.修改“self.parent.addChange(change, src='bzr'))” 为 “self.parent.addChange(change))” 大约在303行。(这个是在版本0.8.3中)

(以下是对应与版本0.8.5)

1.修改大约267行“yield self.addChange(buildbot.changes.changes.Change(**change)” 改为 “yield self.addChange(change)”

2. 修改大约303行“self.parent.addChange(change)”改为"self.master.addChange(src='bzr',**change))" (注:src必须在前)

3. 修改大约154和157行把“change['who']” 改为 “change['author']”, 修改大约155行和157行把“get_apparent_author”改为“committer”。 (注这里的修改是因为它们在新的版本中被deprecated了)

4. 修改大约300行的 addChange 函数 把:

def addChange(self, change):
d = twisted.internet.defer.Deferred()
def _add_change():
d.callback(
self.master.addChange(src='bzr',**change))
twisted.internet.reactor.callLater(0, _add_change)
return d

改为:

def addChange(self, change):
d = twisted.internet.defer.Deferred()
#def _add_change():
# d.callback(
# self.master.addChange(src='bzr',**change))
#twisted.internet.reactor.callLater(0, _add_change)
d.callback(
defer.waitForDeferred(self.master.addChange(src='bzr', **change))
return d

注:这么修改主要是为了避免defer.py中的“exceptions.AssertionError”错误。 在buildbot0.8.5中应该使用“defer.waitForDeferred”。

5. 从“/usr/lib/python2.6/site-packages/buildbot/steps/source/”下拷贝bzr.py到我们自己创建的master目录下,并修改:

到bzr.py的大约91行把“command.append(['-r', self.revision])”改为"command.extend(['-r', self.revision])" (这是新版本的一个bug)



)

在c['schedulers'] = []下添加

c['schedulers'].append(Scheduler(name="CentOS6-i386", branch='greatsql-trunk',
treeStableTimer=300,
builderNames=["CentOS6-i386"]))

注:name自己起,这里把它弄成和slave同名主要是为了配置方便,branch是要取的分支名,与BzrPoller中 url里配置的一致

注: “treeStableTimer=300”表示这个scheduler在得到变更通知后会等待300秒,以避免在版本库代码还没完全提交完成的时候进行测试。

找到factory = BuildFactory(), 在其前添加如下 引用: (注:facotry里面定义你希望buildslave做的具体的工作,工作有一系列step组成)

from buildbot.process import factory
from buildbot.steps import source, shell
from buildbot.steps.shell import ShellCommand, Compile
from buildbot.steps.source.bzr import Bzr
from buildbot.process.properties import Property, WithProperties
from buildbot.process.mtrlogobserver import MTR, MtrLogObserver, EqConnectionPool

#定义一个函数来使用MTR函数来执行mysql测试, 使用MTR的好处是它会把所有失败的测试用例单独显示到waterfall上

def getMTR(**kwargs):
return MTR(

timeout=9600, #默认的timeout时间是1200, 但对于使用valgrind来说就不够了。
warningPattern="MTR's internal check of the test case '.*' failed", **kwargs
)

定义一个函数使用Compile进行编译,并且能够捕捉编译过程中的warning

gccWarningPattern= "^(.*?):([0-9]+): [Ww]arning: (.*)$" #定义匹配warning的正则表达式

def getCompileStep(cmd, subdir="", **kwargs):
return Compile(command=cmd,
warningPattern=gccWarningPattern,
warningExtractor=Compile.warnExtractFromRegexpGroups,
suppressionFile=WithProperties(subdir + "support-files/compiler_warnings.supp"),
**kwargs
)

然后在factory = BuildFactory() 后新建一个factory3(名字随意):

factory3 = BuildFactory()
factory3.addStep(Bzr(mode = 'update' ,
repourl='bzr+ssh://用户名:密码@主机ip/data/bzrroot/mysql-server/greatsql-trunk', timeout = 7000))

注:repourl是bzr库的地址,要加上验证信息, 这里也可以把repourl替换为baseURL 和 defaultBranch 来添加灵活性。
factory3.addStep(ShellCommand(description=["cleaning"],descriptionDone=["clean"],command="""rm -r build"""))
factory3.addStep(ShellCommand(description=["making dir"],descriptionDone=["make dir"],command="""mkdir build"""))
factory3.addStep(ShellCommand(description=["compiling"],descriptionDone=["compile"],command="""cd build;cmake ..;make"""))

(以上代码现在不用了,因为最好使用mysql提供的编译脚本进行编译,基本在BUILD目录下)

factory3.addStep(getCompileStep(
["BUILD/complile-pentium-debug-max"],
description=["compiling code"],
descriptionDone=[description_Done]))

注:如果你写的指令中有修改路径,那么在新目录中的指令必须跟在路径修改指令之后,用;分割。 因为每次新的step路径都会被重置。

注:description 和 descriptionDone 分别为执行时和执行结束后任务在waterfall上的显示。

注:直接使用mysql自带的编译脚本 "BUILD/complile-pentium-debug-max" 用于32位机器,"BUILD/compile-pentium64-debug-max"用于64位机器。如果要使用valgrind的话,使用脚本 “BUILD/complile-pentium-valgrind-debug-max”和“BUILD/complile-pentium64-valgrind-max”。

factory3.addStep(getMTR(
test_type="all",
test_info="Makedist, with all",
mtr_subdir="build/mysql-test",
command="""cd build/mysql-test;./mtr 1st bool gao --force --vardir=var-test""" #若使用valgrind的话 在command中添加选项 "--valgrind"
))

注:1st bool 和 gao是要执行的测试用例,用空格分割, 如果不指定要执行的测试用例, 就默认执行所有缺省的测试用例

在c['builders'] = []后添加新的builder:

c['builders'].append(
BuilderConfig(name="CentOS6-i386", slavenames=["CentOS6-i386"], factory=factory3))

注:这里把slave和factory关联起来, 这里的name在c['schedulers']中被引用。

在c['projectName'] 和c['projectURL']可以设置buildbot服务的名字和图片,这些会显示在web客户端上。web客户端的地址在 c['status'].append(html.WebStatus(http_port=8010, authz=authz_cfg)) 和 c['buildbotURL'] = "http://localhost:8010/"中定义。

启动master:

到master的上一级目录运行如下命令:

>buildbot start master 启动master服务。 这时你就可以通过浏览器登入web客户端了http://localhost:8010/。

创建和运行slave:

在master上一级目录下运行如下命令: (这里目录的位置随意)

>buildslave create-slave centos localhost:9989 CentOS6-i386 123456

注:centos是你要建的slave的本地名字,这个随意。 localhost是你在master配置文件中定义的主机ip地址,9989是默认端口, CentOS6-i386和123456是定义在master配置文件中的slave的用户名和密码。

创建成功后,目录下就多了一个centos文件夹。 在centos文件夹的上一级目录中运行:

>buildslave start centos 来启动slave

利用slave进行build:

在web客户端了http://localhost:8010/ 上选builders ,点CentOS6-i386然后填写一些基本信息后 点 Force按钮, 指示slave开始build。 build过程中的每一步的结果都可以在网页上查到详细的log信息。

注:这里在slave的机器上可能会提示你输入密码, 这个问题在服务器和slave机器配置ssh的公钥和私钥来解决。需要注意的是如果你的ssh密钥文件是拷贝过来的,需要运行如下命令:sudo chmod 600 id_rsa (必须关闭所有执行权限)

配置ssh公钥和密钥具体可以参考:http://wenku.baidu.com/view/7634542eed630b1c59eeb5e6.html

设置buildbot开机自启动:


在/etc/rc.local 中添加如下语句:buildbot start 路径/master (slave 的雷同 )

自定义buildbot的web客户端:

buildbot的web客户端默认在服务端的8010端口(可在配置文件中修改)。

如果想定制一些页面功能,比如为每个分支分配一个单独的超链接来显示某个分支的waterflow。 到机器python安装目录下找到buildbot文件夹下的root.html 例如如下路径:/usr/share/pyshared/buildbot/status/web/templates/root.html。

The <a href="waterfall">Waterfall Display</a> 后添加: <a href="waterfall?branch=greatsql-trunk">greatsql-trunk</a><br/>

这样就可以在欢迎页面上的Waterfall Dispaly后就添加了一个新的超链接来专门显示分支为greatsql-trunk的waterfall。

或者更好的方式是在你master的根目录下创建一个templates文件夹,把/usr/share/pyshared/buildbot/status/web/templates/root.html 和你所要修改的其他文件拷贝到新建的templates下,然后进行修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值