buildbot系统维护知识


                1。 服务器端(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 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实时访问。