[BuildRelease Management]buildbot

 

 

一 buildbot安装

1. install Twisted
Twisted 依赖 zope.interface and Python
wget -c http://tmrc.mit.edu/mirror/twisted/Twisted/8.1/Twisted-8.1.0.tar.bz2
python setup.py install --prefix=$HOME

install zope.interface
wet -c http://www.zope.org/Products/ZopeInterface/3.3.0/zope.interface-3.3.0.tar.gz
python setup.py build
python setup.py install --prefix=$HOME

2。 buildbot 源码
buildbot依赖Twisted和Python
SF打不开,不过可以到python网站下载
wget -c http://pypi.python.org/packages/source/b/buildbot/buildbot-0.7.7.tar.gz#md5=4647a15a9d9b2db6a5b3493ac78e11d9

python setup.py build
python setup.py install --home=~
That will populate ~/lib/python and create ~/bin/buildbot. Make sure this lib directory is on your PYTHONPATH.

把新模块的路径加到python系统路径下。
export PYTHONPATH=$HOME/lib/python:$HOME/lib/python2.4/site-package:$PYTHONPATH
如果有root权限,你也把上面的程序安装在系统目录下,直接python setup.py install 不指定安装目录。

3. check buildbot is ready
$ buildbot --version
Buildbot version: 0.7.7
Twisted version: 8.1.0

参考:

buildbot系统维护知识 :http://blogold.chinaunix.net/u2/68938/showart_1111019.html

buildbot安装配置笔记 :http://www.cublog.cn/u2/68938/showart_1076484.html

 

二 buildbot设置

1 buildbot服务器端(buildbot master)维护
buildbot的服务器通过下面命令创建:buildbot create-master buildmaster_dir 命令执行后,会在指定的buildmaster_dir下生成buildbot的服务器信息。其中有四个重要的文件/目录:
a) buildbot.tac -- 该文件包含创建buildmaster的状态信息,里面指定buildmaster的工作路径(basedir)和默认的配置文件名(master.cfg)。这里basedir的值实际上就是buildmaster_dir。对于维护人员来说,改变这两个参数就可以改变buildmaster的工作路径和默认读取的配置文件名。

            例如运行 buildbot create-master /home/ray/buildbot_master,则生成的 buildbot.tac如下:
            1
            2 from twisted.application import service
            3 from buildbot.master import BuildMaster
            4
            5 basedir = r'/home/ray/buildbot_master'
            6 configfile = r'master.cfg'
            7
            8 application = service.Application('buildmaster')
            9 BuildMaster(basedir, configfile).setServiceParent(application)


b)master.cfg  -- 该文件是buildmaster的配置文件,控制整个buildbot系统的个工作流程。每当buildmaster启动后,第一件事情就是解析这个文件,是系统工作流程的核心。这个在文章最后详细介绍。
c)twistd.log   -- 该文件是buildmaster的日志,如有错误发生,应该优先分析这个文件。

d) public_html  -- 该目录是buildmaster的网页信息的根路径。下面有三个文件buildbot.css, index.html和robots.txt,可以自定义buildmaster的网页信息。

对于升级一个已经存在的buildmaster,则执行命令buildbot upgrade-master basedir

 

2 buildbot客户端(buildbot slave)维护
buildbot的客户端通过下面命令创建:buildbot create-slave --umask=022 ~/buildslave_dir buildmaster.example.org:42012 myslavename mypasswd (各个参数的具体意义参考“buildbot create-slave --help”)命令执行后,会在指定的buildslave_dir下生成buildslave的客户端信息。同样有三个重要的文件/目录:
a) buildbot.tac -- 该文件包含创建buildslave的状态信息,里面保存了5个重要的参数,分别是basedir, buildmaster_host, port, slavename和passwd。 这几个参数必须和buildmaster端master.cfg中的配置保持一致。因为buildslave需要通过port与buildmaster进行TCP通信,而buildmaster通过myslavename和mypasswd来查询buildslave的状态。对于维护人员来说,如果不想重新创建的buildslave, 完全可以重新定义这些参数,适应新的buildmaster。

              例如运行上述命令,则生成的 buildbot.tac如下:
              1
              2 from twisted.application import service
              3 from buildbot.slave.bot import BuildSlave
              4
              5 basedir = r'/home/ray/buildslave_dir'  # “/home/ray/”是用户home目录
              6 buildmaster_host = 'buildmaster.example.org'
              7 port = 42012
              8 slavename = 'myslavename'
              9 passwd = 'mypasswd'
             10 keepalive = 600
             11 usepty = 1
             12 umask = None
             13
             14 application = service.Application('buildslave')
             15 s = BuildSlave(buildmaster_host, port, slavename, passwd, basedir,
             16                keepalive, usepty, umask=umask)
             17 s.setServiceParent(application)

b)twistd.log   -- 该文件是buildslave的日志,如有错误发生,应该优先分析这个文件。
c)info -- 该目录是buildslave的个人信息。下面有两个文件admin和host, 这两个文件的内容会出现在buildmaster的网页上。

 

3 配置文件(master.cfg)维护
在buildmaster的basedir下有个基本的配置文件示例(master.cfg.sample),更多的例子可以在源码包中的doc目录找到。这个文件实际上是个python脚本,buildmaster启动的时候,会逐行解析这个python脚本,从而得到一个完整的配置信息。信息保存在BuildmasterConfig(字典)中,其中重要的keys如下,我们分成两组来分析。

一组提供基本的配置,包括两端通信端口, web访问URL和客户端信息。
    * c['buildbotURL']: Defining the Project
    * c['status']: Defining Status Targets
    * c['slaves']: Buildslave Specifiers
    * c['slavePortnum']: Setting the slaveport

另一组提供更多的控制选项,包括监测源码更新的方式,构建的调度器和自定义的构建过程。
    * c['builders']: Defining Builders
    * c['change_source']: Listing Change Sources and Schedulers
    * c['schedulers']: Listing Change Sources and Schedulers

继续上面的例子,通过下面命令来生成buildmaster和buildslave
buildbot create-master buildmaster_dir
buildbot create-slave --umask=022 ~/buildslave_dir buildmaster.example.org:42012 myslavename mypasswd
如果想通过buildmaster.example.org:10000访问buildbot服务器,各个key的赋值应当设置为:
    c['slavePortnum'] = 42012
    c['buildbotURL']   = buildmaster.example.org:10000
    c['slaves']        = [BuildSlave("myslavename", "mypasswd")]
    c['status']        = [(html.WebStatus(http_port=10000))]

注意,这里涉及到两个端口,一个用于两端的TCP通信,另一个就是公开的web访问端口, 而且这两个端口不能够相同。


如果想增加新的buildslave, 除了在客户端用命令“buildbot create-slave --umask=022 ~/buildslave_dir2 buildmaster.example.org:42012 myslavename2 mypasswd2”之外,还需要更新服务器master.cfg文件,通知服务器,增加了新的buildslave。此时,  c['slaves'] = [BuildSlave("myslavename", "mypasswd"), BuildSlave("myslavename2", "mypasswd2")]同时c['status']也可以有多种表现形式,出了web方式,最常用来监测buildbot状态的就是MailNotifier。 每当完成一次自动构建,系统会自动给相关人员发送邮件。具体的写法就是:
c['status'].append(mail.MailNotifier(fromaddr="buildbot@localhost",
                                    extraRecipients=["builds@example.com"],
                                    sendToInterestedUsers=False))

最后的才是重点,关于master.cfg的第二组配置参数。c['change_source']设置监测源码更新的方式,最常用的也是系统build-in的方式是PBChangeSource。 我们可以通过built-in buildbot sendchange来通知服务器代码更新, 或者使用buildbot下载包自带的工具,例如contrib/svn_buildbot.py,contrib/arch_buildbot.py, contrib/hg_buildbot.py。这些脚本可以做为commit hook script,一旦代码更新,立即通知buildmaster。上面这些脚本需要你有权限访问SVN/ARCH/HG服务器,可以在源码树中添加commit hook script。如果没有权限,可以尝试另外一个脚本contrib/vn_watcher.py,该脚本可以运行在任何机器(当然要有python环境),如果放在buildmaster机器上运行svn_watcher.py https://skyeye.svn.sourceforge.net/svnroot/skyeye localhost:42012 watch这个脚本每隔10分钟,运行svn log命令来检查svn是否有更新,如果有则运行buildbot sendchange来通知buildmaster。

c['schedulers']顾名思义就是buildmaster的调度器,指定哪些buildslave需要开始工作,哪些branch需要关注。例如
c['schedulers'].append(Scheduler(name="all", branch=None,
                                 treeStableTimer=2*60,
                                 builderNames=["buildbot-full"]))

最后c['builders']才是实际的自动构建过程。这个配置项也是一个字典,最重要的key就是factory。 该factory详细定义构建过程的步骤,例如下载源码,编译连接,测试运行。例如:
cvsroot = ":pserver:anonymous@cvs.sourceforge.net:/cvsroot/buildbot"
cvsmodule = "buildbot"

f1 = factory.BuildFactory()
f1.addStep(CVS(cvsroot=cvsroot, cvsmodule=cvsmodule, login="", mode="copy"))
f1.addStep(Compile(command=["python", "./setup.py", "build"]))
f1.addStep(Trial(testpath="."))

b1 = {'name': "buildbot-full",
      'slavename': "myslavename",
      'builddir': "full",
      'factory': f1,
      }
c['builders'] = [b1]
很显然,这个builders的名字是buildbot-full, 工作机器是myslavename, 工作路径是full(basedir/full),构建过程包含三个步骤(从CVS下载源码,构建源码,测试源码)。如果想增加新的builders, 则可以c['builders'] = [b1,b2]。整个构建步骤,名字和buildslave都可以在web实时访问。

 

三 主页:http://trac.buildbot.net/

 

完!

 

posted @ 2011-02-27 22:18  iTech  阅读(2145)  评论(0编辑  收藏  举报