跳转到主要内容

一套zc.buildout配方以及Buildbot的声明性配置支持

项目描述

包描述

本软件包提供了一组基于 zc.buildout 的食谱,使得配置 buildbot 环境(构建主节点、构建从节点和项目)变得非常简单,并提供了运行 buildbot 主节点和从节点的脚本。这些食谱基于 buildout 配置生成 INI 风格的声明性配置文件。这些配置文件随后被 buildbot 运行器脚本读取,以初始化 buildbot 环境。

可用的食谱包括

  • collective.buildbot:master – 生成构建主节点的配置文件。

  • collective.buildbot:slave – 生成构建从节点的配置文件。

  • collective.buildbot:project – 为所选从节点上的项目构建生成配置。

  • collective.buildbot:poller – 为代码仓库轮询器生成配置。

可以在单个 buildout 中使用所有这些食谱,并将主节点和从节点(复数)放置在同一台机器上。然而,在大多数情况下,你将有一个用于构建主节点的 buildout,它使用 collective.buildbot:mastercollective.buildbot:project 来设置构建过程,然后在每个从节点上分别使用 collective.buildbot:slave 食谱创建独立的 buildout。

快速开始

软件包中包含一个 paster 模板,用于生成基本配置。只需运行

$ easy_install -U collective.buildbot
$ paster create -t buildbot my.project
$ cd my.project

检查生成的配置文件 master.cfg

构建环境

$ python bootstrap.py
$ ./bin/buildout

然后启动守护进程

$ ./bin/master start
$ ./bin/yourhostname start

访问 https://#:9080 并享受你的新 buildbot

构建主配方

collective.buildbot:master 食谱生成一个配置文件,用于设置构建主节点过程。一旦配置了构建主节点,就可以通过在 buildout 的 bin 目录下执行控制器脚本来运行它。控制器脚本将使用节名称命名,因此如果你在 buildout.cfg 中有一个 [buildmaster] 节,你会得到一个 bin/buildmaster 脚本。

支持选项

食谱支持以下选项

port

构建主节点过程监听来自构建从节点的连接的端口。从节点必须配置为使用 collective.buildbot:slave 食谱中使用的相应端口。

wport

用于服务 buildbot 网络界面的网络端口。

project-name

项目名称。在网络界面中显示。

project-url

项目 URL,在网络界面中使用。

url

buildbot URL。

build-slaves

构建从节点配置的序列。每个构建从节点必须在单独的一行中定义,包含构建从节点的名称和密码,两者之间用空格分隔。

allow-force(可选)

如果为 true,则允许用户使用网络界面强制构建。默认为 false

public-html(可选)

包含网络界面自定义资源(HTML、CSS、图片)的目录位置。

max-builds(可选)

每个从节点上运行的并行构建的最大数量。默认为 None(即无限制)。

如果你需要运行 IRC 机器人,还可以使用以下选项

irc-host

要连接的 irc 服务器。例如:irc.freenode.net

irc-channels

要加入的频道列表。例如:#plone 如果频道有密码,则在冒号后写入,例如。#private:passwd

irc-nickname

机器人昵称。默认为 buildbot

irc-password

用于识别机器人的密码。默认为空字符串

如果您需要运行一个 PBListener,也可以使用以下选项

listener-port

PBListener 应该监听连接的端口。

listener-user

用于连接认证的用户名。

listener-passwd

用于连接认证的密码。

示例用法

我们将首先创建一个使用该菜谱的 buildout

>>> write('buildout.cfg',
... """
... [buildout]
... parts = buildmaster
...
... [buildmaster]
... recipe = collective.buildbot:master
... port = 8080
... wport = 8082
... project-name = The project
... project-url = http://example.com/
... url = http://example.com/buildbot
... slaves =
...     slave1 password
...     slave2 password
... """)

运行 buildout 后,我们得到

>>> print system(buildout)
Installing buildmaster...
New python executable in /sample-buildout/parts/buildmaster/.../python...
Installing setuptools.............done.
Generated script '/sample-buildout/parts/buildmaster/buildbot.tac'.
Generated config '/sample-buildout/parts/buildmaster/buildbot.cfg'.
Generated script '/sample-buildout/bin/buildmaster'.

如上图所示,buildout 生成了所需的配置文件和 runner 脚本在 bin 下。您可以通过运行以下命令来控制构建主过程

$ ./bin/buildmaster [start | stop | restart]

用于启动 buildbot 进程的 Twisted .tac 文件

>>> cat(join('parts', 'buildmaster', 'buildbot.tac'))
from twisted.application import service
from buildbot.master import BuildMaster
import os
import sys
import collective.buildbot
<BLANKLINE>
basedir = r'/sample-buildout/parts/buildmaster'
buildbot = os.path.dirname(collective.buildbot.__file__)
<BLANKLINE>
configfile = os.path.join(buildbot, 'master.py')
application = service.Application('buildmaster')
<BLANKLINE>
master = BuildMaster(basedir, configfile)
master.setServiceParent(application)
<BLANKLINE>

我们还可以看到,菜谱生成的配置文件反映了我们在 buildout 配置中选择的选项

>>> config_path  = os.path.join('parts', 'buildmaster', 'buildbot.cfg')
>>> config = ConfigParser()
>>> _ = config.read(config_path)
>>> slave_res = []
>>> for opt, val in (('slave1', 'password'),
...     ('slave2','password'),
... ):
...     slave_res.append(bool(val == config.get('slaves', opt)))
>>> False not in slave_res
True

>>> buildbot_res = []
>>> for opt, val in (('project-name','The project'),
...     ('projects-directory', '%s/parts/projects' % os.getcwd()),
...     ('pollers-directory', '%s/parts/pollers' % os.getcwd()),
...     ('wport', '8082'),
...     ('project-url', 'http://example.com/'),
...     ('port', '8080'),
...     ('allow-force', 'false'),
... ):
...     buildbot_res.append(bool(val == config.get('buildbot', opt)))
>>> False not in buildbot_res
True

构建从配方

collective.buildbot:slave 菜谱生成一个配置文件,用于设置构建从进程。一旦构建从进程配置完毕,您可以通过在 buildout 的 bin 目录下执行控制器脚本来运行它。控制器脚本将使用节名称命名,因此如果您在 buildout.cfg 中有一个 [buildslave] 节,您将得到一个 bin/buildslave 脚本。

由于使用此菜谱的节名称也将成为构建从进程的名称,因此选择与构建主配置相对应的名称很重要。

支持选项

食谱支持以下选项

host

构建主机的主机名。

port

构建主机的监听端口。这应该与 buildmaster buildout 中使用 collective.buildbot:master 菜谱的节中的 port 选项相匹配。

password

构建从进程密码。这应该与 buildmaster buildout 中 slave-names 节中的密码相匹配。

eggs

用于在从环境中安装额外的 eggs。

environment

可以定义一个节名称,其中包含将在从环境中定义的环境变量。

executable

您可以在此指定一个不同的 Python,使用不同的版本来设置虚拟环境。

umask

覆盖在构建目录中使用的默认 0077 umask。

示例用法

我们将首先创建一个使用该菜谱的 buildout

>>> write('buildout.cfg',
... """
... [buildout]
... parts =
...    buildslave
...
... [buildslave]
... recipe = collective.buildbot:slave
... host = localhost
... port = 8888
... password = password
... environment = slaveenv
... umask = 0002
...
... [slaveenv]
... PATH = /bin:/usr/bin:/usr/local/bin:/usr/local/firefox
... """)

运行 buildout 后,我们得到

>>> print system(buildout)
Installing buildslave.
...
Generated script /sample-buildout/parts/buildslave/buildbot.tac.
Generated script '/sample-buildout/bin/buildslave'.
<BLANKLINE>

如上图所示,buildout 生成了所需的脚本。您可以通过运行以下命令来控制构建从进程

$ ./bin/buildslave [start | stop | restart]

项目配方

collective.buildbot:project 菜谱负责为单个可测试组件创建 buildbot 配置,该组件是一个项目。该项目是否对应单个软件包或多个软件包取决于您。在大多数情况下,项目对应于 buildout,而 buildout 可能包含一个或多个软件包。每个项目都有一个单独的状态,并在瀑布显示中作为列可视化。

此菜谱应与 collective.buildbot:master 一起在相同的 buildout 中使用。

支持选项

食谱支持以下选项

slave-names(必填)

项目将在其上构建的从机名称的空白分隔列表。这些必须与使用 collective.buildbot:slave 菜谱的节名称相匹配,并随后在 collective.buildbot:master 菜谱节中的 slaves 选项中引用。

vcs(可选)

用于获取项目源代码的版本控制系统。默认为 svn。其他可能的值有:hgbzrgitcvs

vcs-mode(可选)

用于从版本控制系统获取源代码的模式。默认为 update。其他可能的值包括:clobbercopyexport。请参阅 buildbot 手册中的 Source Checkout 部分,了解每个选项的作用。

repositories(必填)

一系列以换行符分隔的代码仓库 URL,对应所选版本控制系统。对于 Subversion,可能是像 https://svn.plone.org/svn/collective/collective.buildbot/trunk 这样的地址;对于 Git,可能是像 git@github.com:dokai/hexagonit-swfheader.git 这样的地址;对于 CVS,可能是像 :pserver:anonymous@cvs.sourceforge.net:/cvsroot/buildbot!buildbot 这样的地址。

对于 Subversion,如果 URL 根在 HOME/.buildout/.httpauth 中找到,则将使用用户名和密码执行签出和更新。请参阅:[http://pypi.python.org/pypi/lovely.buildouthttp](http://pypi.python.org/pypi/lovely.buildouthttp)。

对于您定义的每个仓库,都会生成一个独立的 Buildbot 项目配置,共享所有其他选项。如果您在同一仓库中有多个类似的项目,这很有用,可以节省您大量的输入。由于 Subversion URL 包含分支信息,甚至可以拉取来自单独分支的代码。对于使用 branch 选项的其他版本控制系统(例如 Git),您限制为单个共享分支名称。

branch(可选)

版本控制系统中要签出的分支。对于 Subversion 签出,应提供所需分支的完整 URL(例如,以 trunkbranches/foo 结尾的地址),并保留此选项为空。对于 Git 仓库,默认值为 master。请注意,对于 Git 仓库,您可以使用任何可以解析到(在 git rev-parse 意义上的)树状对象标识符。

always-use-latest(可选,默认为 False

是否始终更新到此构建的最新可用源代码。请参阅 buildbot.steps.source.Source 的 'alwaysUseLatest' 选项以获取更多信息。

基本上,如果您的 buildbot 正在监视来自多个仓库的更改,则您很可能需要将此选项设置为 True

hg-branch-type(可选,默认为 inrepo

如果使用 mercurial,则定义要使用的分支类型。默认为 inrepo。另一个可能的值是 dirname

email-notification-sender(可选)

用于通知消息中 From: 头部的电子邮件地址。

email-notification-recipients(可选)

以换行符分隔的电子邮件地址序列,通知消息将发送到这些地址。

mail-mode(可选)

用于发送邮件的模式。可用选项包括:

  • all

    发送关于所有构建的邮件,无论是通过还是失败

  • failing

    仅发送关于失败的构建的邮件

  • problem

    仅发送关于在先前构建通过时失败的构建的邮件。如果您的构建通常通过,则只有在出现问题时才会发送邮件。

默认为

failing

build-sequence(可选)

在从仓库签出代码并在构建奴隶上执行后构建项目时执行的 shell 命令的换行符分隔序列。

默认为

bin/python bootstrap.py
bin/buildout

这对于基于 buildout 的项目是适当的。

如果命令以python开头,则该命令将被替换为构建bot奴隶的python的完整路径。奴隶有自己的virtualenv python

test-sequence(可选)

在构建奴隶上执行的shell命令序列,以执行测试套件。默认值为

bin/test

default-scheduler(可选)

设置默认调度器,在每次更改后触发构建,并使用宽限期等待更多更改。该周期可以以秒为单位指定。

periodic-scheduler(可选)

设置周期性调度器,每n分钟调度一次构建,其中n是给定的整数值。

cron-scheduler(可选)

设置类似于cron的调度器,在指定的时间进行构建。时间以crontab方式配置,使用空格分隔以下字段的值

[minute] [hour] [day of month] [month] [day of week]

值可以是

  • 给定字段适当范围内的整数,

  • 格式为2,4,6的整数列表。指定的整数需要在该字段的适当范围内,

  • */n,其中n是一个整数,表示给定字段适当范围内的每个n个整数,

  • *(星号)表示该字段的所有可能值。

例如,要安排每天凌晨3:00进行构建,您会使用

cron-scheduler = 0 3 * * *

要安排每2小时在时间四分之一进行构建,您会使用

cron-scheduler = 15 */2 * * *

dependent-scheduler(可选)

设置给定项目和当前项目之间的依赖关系。在给定项目的成功构建之后,将触发此构建。

dependencies(可选)

一个以换行符分隔的路径序列,当在更改集上找到时,应在此奴隶上触发构建。

例如,如果您想在每个名为some.other-project的依赖项目更改时运行您的构建,您会使用

dependencies = some.other-project/trunk

您在此处列出的路径将使用子字符串匹配进行检查。因此,例如,如果您不关心some.other-project的哪个分支已更改,您可以使用

dependencies = some.other-project

或者,如果您只关心该项目中的单个文件是否已更改,您也可以使用更具体的路径

dependencies = some.other-project/trunk/versions.cfg

pyflakes(可选)

要运行的newline分隔的PyFlakes命令序列。如果已定义,则在测试序列之后将运行给定的PyFlakes命令。

命令应包含pyflakes脚本的路径和源代码容器的路径。例如,在构建目录中的src/some.project下使用全局pyflakes安装的项目,你会设置

pyflakes = pyflakes src/some.project

您也可以让奴隶构建安装pyflakes并使用它而不是全局安装版本。

示例用法

我们将首先创建一个使用该配方构建的构建。完整的示例可能包含定义构建主机和奴隶的其他部分,但在这里我们将仅演示collective.buildbot:project配方的使用。

>>> write('buildout.cfg',
... """
... [buildout]
... parts = my.package other.package
...
... [my.package]
... recipe = collective.buildbot:project
... email-notification-sender = email@example.com
... slave-names = slave1
... mail-host = localhost
... email-notification-recipients =
...         email@example.com
... vcs = svn
... vcs-mode = clobber
... repositories = http://example.com/svn/my.package/trunk
... always-use-latest = yes
...
... [other.package]
... recipe = collective.buildbot:project
... slave-names = slave1
... vcs = git
... branch = 3720f2e9b3a6a148b01843bc64fbea5af59df2af
... repositories = git://github.com/dokai/other.package.git
... dependencies = my.package/trunk
... """)

运行 buildout 后,我们得到

>>> print system(buildout)
Installing my.package.
Generated config '/sample-buildout/parts/projects/my.package.cfg'.
Installing other.package.
Generated config '/sample-buildout/parts/projects/other.package.cfg'.

正如我们所见,该配方在parts目录下的projects目录中生成了项目配置文件。

>>> config_path  = os.path.join('parts', 'projects', 'my.package.cfg')
>>> config = ConfigParser()
>>> _ = config.read(config_path)
>>> res = []
>>> for opt, val in (('name', 'my.package'),
...     ('repository','http://example.com/svn/my.package/trunk'),
...     ('email-notification-sender', 'email@example.com'),
...     ('slave-names', 'slave1'),
...     ('mail-host', 'localhost'),
...     ('email-notification-recipients', '\nemail@example.com'),
...     ('vcs', 'svn'),
...     ('vcs-mode', 'clobber'),
...     ('always-use-latest', 'yes'),
... ):
...     res.append(bool(val == config.get('project', opt)))
>>> False not in res
True

>>> config_path  = os.path.join('parts', 'projects', 'other.package.cfg')
>>> config = ConfigParser()
>>> _ = config.read(config_path)
>>> res = []
>>> for opt, val in (('name', 'other.package'),
...     ('repository', 'git://github.com/dokai/other.package.git'),
...     ('slave-names', 'slave1'),
...     ('vcs', 'git'),
...     ('dependencies', 'my.package/trunk'),
...     ('branch', '3720f2e9b3a6a148b01843bc64fbea5af59df2af'),
... ):
...     res.append(bool(val == config.get('project', opt)))
>>> False not in res
True

如果您有多个类似的项目,您可以在单个构建区域中定义它们,只需提供多个仓库URL。所有项目都共享相同的选项(除了仓库URL)。为了进一步减少重复,我们在构建区域中定义了我们的仓库的基本URL。

>>> write('buildout.cfg',
... """
... [buildout]
... parts = my_project
... svn = http://svn.example.com/svnroot
...
... [my_project]
... recipe = collective.buildbot:project
... slave-names = slave1
... vcs = svn
... repositories =
...    ${buildout:svn}/my.package/trunk
...    ${buildout:svn}/other.package/tags/1.2.3
...    ${buildout:svn}/third.package/branches/foobar
...    ${buildout:svn}/third.package/branches/another
...    ${buildout:svn}/third.package/branches/another
... """)

当我们运行构建时,我们可以看到它为每个项目生成了一个单独的配置文件,代表单个仓库。如果可检测到分支名称,则使用它作为额外标识符,否则添加一个整数。

>>> print system(buildout)
Uninstalling other.package.
Uninstalling my.package.
Installing my_project.
Generated config '/sample-buildout/parts/projects/my.package.cfg'.
Generated config '/sample-buildout/parts/projects/other.package.cfg'.
Generated config '/sample-buildout/parts/projects/third.package.cfg'.
Generated config '/sample-buildout/parts/projects/third.package_another.cfg'.
Generated config '/sample-buildout/parts/projects/third.package_2.cfg'.

轮询配方

轮询食谱定义了轮询器,这些轮询器会自动查询项目代码库中的更改,并在发现更改时执行构建器。

支持选项

食谱支持以下选项

vcs

版本控制系统。默认为 svn。目前仅支持Subversion仓库。

repositories

一系列以换行符分隔的URL,指向包含项目代码的Subversion仓库的根目录。注意:这是仓库的根URL,而不是您项目的完整路径。您只需为每个仓库提供一个URL,而不是为每个项目提供。

splitter

一个用于解析轮询器分析的路径的正则表达式。正则表达式必须返回2组。唯一重要的是在构建器仓库中匹配的项目名称。

请注意,您提供的正则表达式将按原始字符串格式处理(例如,此 (?P<project>\S+\/foo|\S+\/bar\/[^\/]+)/(?P<relative>.*)) 变为 r'(?P<project>\S+\/foo|\S+\/bar\/[^\/]+)/(?P<relative>.*))'

(默认 '(?P<project>\S+\/trunk|\S+\/branches\/[^\/]+)/(?P<relative>.*)')。

hist-max

要查看的历史行数(默认100)。

user

一个svn用户(默认None)。

password

为用户提供的有效svn密码(默认None)。

poll-interval

检查更改的时间间隔(默认600秒)。

svn-binary

svn二进制文件的路径。默认为svn,如果您已在PATH中,则应正常工作。

示例用法

我们可以定义一个轮询器,让buildbot知道提交。

>>> write('buildout.cfg',
... """
... [buildout]
... parts = svnpoller
...
... [svnpoller]
... recipe = collective.buildbot:poller
... repositories = http://example.com/svn
... user = h4x0r
... password = passwd
... """)

>>> print system(buildout)
Installing svnpoller.
Generated config '/sample-buildout/parts/pollers/svnpoller.cfg'.

轮询器生成。您在这里可以看到所有可用选项。

>>> config_path  = os.path.join('parts', 'pollers', 'svnpoller.cfg')
>>> config = ConfigParser()
>>> _ = config.read(config_path)
>>> res = []
>>> for opt, val in (('hist-max', '100'),
...     ('repository','http://example.com/svn'),
...     ('vcs','svn'),
...     ('user','h4x0r'),
...     ('svn-binary','svn'),
...     ('password','passwd'),
...     ('poll-interval','60')
... ):
...     res.append(bool(val == config.get('poller', opt)))
>>> False not in res
True

您还可以让轮询器观察多个仓库。

>>> write('buildout.cfg',
... """
... [buildout]
... parts = svnpoller
...
... [svnpoller]
... recipe = collective.buildbot:poller
... repositories =
...     http://example.com/svn
...     http://otherexample.com/svn
...     http://other.server.com/svn
... user = h4x0r
... password = passwd
... """)
>>> print system(buildout)
Uninstalling svnpoller.
Installing svnpoller.
Generated config '/sample-buildout/parts/pollers/svnpoller_0.cfg'.
Generated config '/sample-buildout/parts/pollers/svnpoller_1.cfg'.
Generated config '/sample-buildout/parts/pollers/svnpoller_2.cfg'.
<BLANKLINE>

整合所有部分

以下我们将演示如何将所有这些部件组合在一起,为您的项目创建一个buildbot环境。我们将使用两个独立的构建区域:一个用于构建主进程,一个用于单个构建奴隶。对于您的项目,您可以选择使用多个构建奴隶,每个奴隶在不同的架构或不同的python版本上运行,例如。

我们将从构建主进程的构建区域开始,该区域定义了构建主进程的过程以及我们希望构建和测试的所有项目。我们还包含一个轮询器配置,该配置将轮询Subversion仓库以查找项目的更改,并在发生更改时执行构建。如果我们使用另一个版本控制系统,例如Git,我们需要使用提交钩子或基于时间的构建调度器。

我们还将使用PyFlakes对源代码进行额外的检查。

>>> write('buildout.cfg',
... """
... [buildout]
... parts =
...     buildmaster
...     svnpoller
...     my.project
...     my.buildout
...     another.package
...
... [buildmaster]
... recipe = collective.buildbot:master
... port = 8080
... wport = 8082
... project-name = The company buildout
... project-url = http://my.company.com
... url = http://buildbot.my.company.com
... allow-force = true
... public-html = ${buildout:directory}/buildbot_css
... slaves =
...     buildslave secretpassword
...
... [svnpoller]
... recipe = collective.buildbot:poller
... repositories =
...     ${my.project:svnroot}
...     ${my.buildout:svnroot}
... user = someuser
... password = anothersecret
...
... [my.project]
... recipe = collective.buildbot:project
... slave-names = slave1
... svnroot = https://svn.company.com/svn
... repositories = ${my.project:svnroot}/my.project/trunk
... email-notification-sender = buildbot@my.company.com
... email-notification-recipients =
...     my.project@my.company.com
...     dev@my.company.com
... mail-mode = problem
... mail-lookup = plone.org
... build-sequence =
... test-sequence = ../../bin/python setup.py test
...
... [my.buildout]
... recipe = collective.buildbot:project
... slave-names = slave1
... svnroot = https://svn.othercompany.com/svn
... repositories = ${my.buildout:svnroot}/my.buildout/trunk
... email-notification-sender = buildbot@my.company.com
... email-notification-recipients = dev@my.company.com
... test-sequence = bin/zope-instance test -v -vv
... pyflakes =
...     ../../../../bin/pyflakes src/collective.foo
...     ../../../../bin/pyflakes src/collective.bar
...
... [another.package]
... recipe = collective.buildbot:project
... slave-names = slave1
... vcs = git
... repositories = git://git.company.com/projects/another-package.git
... email-notification-sender = buildbot@my.company.com
... email-notification-recipients = dev@my.company.com
... build-sequence =
... test-sequence = ../../bin/python setup.py test
... periodic-scheduler = 60
... pyflakes = ../../../../bin/pyflakes .
... """)

我们允许强制构建,这在某些时候非常有用。由于默认的buildbot网络界面不是最美观的,我们还包含了一个包含我们的自定义CSS的目录。

《my.project》和《another.package》这两个包是简单的Python包,因此我们使用setup.py脚本来运行测试套件。因为这些是简单的包,所以我们还清除了build-sequence选项,因为运行测试之前没有要做的事情。在《my.buildout》部分,这是一个典型的Zope buildout,使用Zope控制器脚本(在本例中是zope-instance)来运行测试。

另外,因为《another.package》项目使用Git仓库,SVN轮询器不会应用于它,所以我们已设置了一个周期性的调度器,每小时构建一次项目。另一种选择是将post-commit钩子安装到Git仓库中,以通知buildout更改并安排构建。

《my.buildout》项目是基于buildout的项目,因此我们可以使用默认的build-sequence,这将为我们引导并运行buildout。对于zope.testing测试运行器,我们传递了--exit-with-status参数,这样buildbot就会知道测试是否失败。主干可能还定义了额外的svn:externals,实际上会拉取要测试的代码,这是常见的情况。我们还展示了在多个源包上使用pyflakes的情况,这在完整的buildout中可能是这种情况。

现在我们来运行buildout。

>>> mkdir('buildbot_css')
>>> print system(buildout)
Installing buildmaster...
New python executable in /sample-buildout/parts/buildmaster/.../python...
Installing setuptools............done.
Generated script '/sample-buildout/parts/buildmaster/buildbot.tac'.
Generated config '/sample-buildout/parts/buildmaster/buildbot.cfg'.
Generated script '/sample-buildout/bin/buildmaster'.
Installing my.project.
Generated config '/sample-buildout/parts/projects/my.project.cfg'.
Installing my.buildout.
Generated config '/sample-buildout/parts/projects/my.buildout.cfg'.
Installing svnpoller.
Generated config '/sample-buildout/parts/pollers/svnpoller_0.cfg'.
Generated config '/sample-buildout/parts/pollers/svnpoller_1.cfg'.
Installing another.package.
Generated config '/sample-buildout/parts/projects/another.package.cfg'.
<BLANKLINE>

正如我们所见,我们得到了运行构建主进程的bin/buildmaster脚本以及相应的配置文件。我们的构建主现在已准备就绪,您可以通过运行以下命令来启动它:

$ ./bin/buildmaster start

接下来,我们为构建从属创建buildout。这个buildout可能位于不同的机器上,尽管将它放在同一台机器上也可以正常工作。

>>> write('buildout.cfg',
... """
... [buildout]
... parts =
...    buildslave
...    pyflakes
...
... [buildslave]
... recipe = collective.buildbot:slave
... host = buildbot.my.company.com
... port = 8080
... password = secretpassword
...
... [pyflakes]
... recipe = zc.recipe.egg
... eggs = pyflakes
... entry-points = pyflakes=pkg_resources:run_script
... arguments = 'pyflakes', 'pyflakes'
... """)

由于构建主负责一切,从属构建非常简单,它只需要联系主并接收指示。我们已配置了构建主地址和密码,以匹配上面的构建主buildout中的配置。

我们还将在从属buildout中包含PyFlakes,以确保它在从属机器上可用。主buildout中的pyflakes命令使用一个指向这个版本pyflakes的路径。

运行buildout将给我们从属控制脚本和pyflakes脚本。

>>> print system(buildout)
Uninstalling...
Installing buildslave...
New python executable in /sample-buildout/parts/buildslave/.../python...
Installing setuptools............done.
Generated script /sample-buildout/parts/buildslave/buildbot.tac.
Generated script '/sample-buildout/bin/buildslave'.
Installing pyflakes...
Generated script '/sample-buildout/bin/pyflakes'.
<BLANKLINE>

可以通过运行以下命令来启动构建从属:

$ ./bin/buildslave start

一旦构建主和从属都已运行,轮询器应该会响应SVN仓库的提交,并在每次更改后运行构建。您可以在配置的地址查看buildbot状态页面,例如在本例中为http://buildbot.my.company.com:8082/。您可以使用Web界面强制构建,这可以用来验证buildbot和项目是否正确配置。

现在,通过修改buildout配置并重新运行buildout,可以轻松地添加新的项目或构建从属。

支持

贡献者

项目由Ingeniweb启动(http://ingeniweb.com

初始作者
  • Gael Pasgrimaud

  • Tarek Ziade

在2008年巴黎Plone冲刺期间移动到collective。

贡献者
  • Gael Pasgrimaud [gawel]

  • Tarek Ziade [tarek]

  • Kai Lautaportti [dokai]

  • Jean-Francois Roche

  • Mustapha Benali [mustapha]

  • Sylvain Viollon [thefunny]

  • Reinout van Rees [reinout]

  • Kevin Deldycke [kdeldycke]

变更历史

0.4.1 (2010-04-13)

  • 添加hg-branch-type选项并支持Mercurial分支。[thefunny42]

0.4 (2010-02-19)

  • 将扩展CSS设置为默认样式。这来自于全新的buildbot v0.7.12构建。 [kdeldycke]

  • 项目现在按ID排序。 [thefunny42]

  • 从属服务器可以使用与buildout不同的Python解释器。您可以使用executable选项定义您的解释器。[thefunny42]

  • 现在支持如*/48,12,16这样的值作为有效的cron指定符。[thefunny42]

0.3.7 (2010-01-24)

  • 添加了num_events和num_events_max参数。感谢Baiju M。[gawel]

  • buildbot要求max_builds从属服务器参数是一个整数。[kdeldycke]

0.3.6 (2009-12-22)

  • 更好地修复了在不同构建部分中出现类似项目名称的问题。对于SVN项目,这修复了不必要地附加_trunk以及允许自动的projectname_branchname名称再次工作。

  • 在slave.tac中将“usepty”设置为buildbot的新默认值0。请参阅http://buildbot.net/trac/ticket/158和特别是http://buildbot.net/trac/ticket/255。这修复了简单shell命令如“cp”和“rm”失败的问题,没有明显的原因。现在stdio输出似乎反应更快:很好。[reinout]

  • 允许配置更新再次工作。[hannosch]

  • 添加了使用默认调度器的可能性,该调度器在等待更多更改的宽限期后触发构建。[witsch]

  • 当使用SVN并测试同一项目的多个分支时,您现在会得到project_branch-a, project_branch-b而不是project_2, project_3。以分支/标签名称命名。[reinout]

  • SVNScheduler在addChange中将传入的更改对象更改为其内部结构。但更改在下一个项目中再次使用时不会匹配,因为更改。[do3cc]

  • 为collective.buildbot mail-mode和mail-lookup中的配置提供buildbot的另外两个邮件功能。请参阅更新的collective.buildbot文档[do3cc]

  • 修复了在不同构建部分中出现的类似项目名称的问题[do3cc]

  • 修复了poller配方中多个仓库的问题[do3cc]

0.3.5 (2009-07-17)

  • buildbot 0.7.11兼容性

  • 各种小修复

0.3.4 (2009-05-21)

  • 从文档中删除无用的导入。[gawel]

  • 可以配置PBListener。[stxnext]

  • 在项目配方中添加了对CVS仓库的支持。CVS中代码的位置由cvsrootcvsmodule描述。这两个参数通过在仓库位置上分割!符号来获取。[stxnext]

  • IRC机器人可以加入受密码保护的频道。[stxnext]

  • 重构所有展示子类BaseRecipe并依赖于其write_config方法的配方示例的doctests。实现依赖于ConfigParser模块,该模块使用字典数据结构来存储部分和选项。这永远不能假设在Python版本之间是有序的,我们真的不应该在我们的实现中关心顺序。测试现在验证在预期部分中的存在和正确的值,而不是位置。[andrewb]

  • 完成r67547的工作(例如,将email-notification-recipients的用法更改为复数形式)。当初始化collective.buildbot.project.Project时,我们实际上想查找复数版本。此外,我们希望我们的master.cfg_tmpl中对通知的注释建议设置正确的值。[andrewb]

  • 使超时可配置,全局和独立于构建和测试步骤。[sidnei]

  • 删除always_use_latest选项以避免与空格的问题。[sidnei]

  • 使源代码签出重试最多3次,间隔10秒。似乎buildbot的较新版本在删除签出目录时失败得更频繁,希望这可以解决这个问题。[sidnei]

  • 通过vcs-mode使源代码签出模式可配置。[sidnei]

  • 设置 build 步骤的 haltOnFailure=True。如果构建步骤失败,则无需进行任何测试。[sidnei]

  • 修复了与 buildbot 0.7.9 的兼容性问题。[dokai]

  • 修复了测试套件初始化问题,导致所有 doctests 都没有运行。同时修复了由于该问题而未被发现的问题回归。[dokai]

0.3.3 (2008-09-26)

  • 应用 Chris Shenton 的补丁以覆盖默认的 umask。[gawel]

  • 改进了默认模板配置。[gawel]

  • 将 clean css 添加到模板中。[gawel]

0.3.2 (2008-09-14)

  • 添加 paster 模板以快速生成基本配置。[gawel]

  • email-notification-recipients 的出现修正为单数形式,如大多数地方所使用。[hannosch]

  • 添加了用于 Subversion 认证的用户名/密码机制,该机制包括一个 buildbot 补丁和指向 buildout 侧 .httpauth 的链接。[tarek]

  • 添加项目之间的依赖关系。一个项目的构建可以触发另一个项目的构建。[thefunny]

  • 改进了 Windows (mingw) 和 Cygwin 的虚拟环境创建。egg 的安装与 mingw 一起工作,我们应从 Cygwin 获取一个 python ../../bin/python(指向运行 buildout 的 python 的符号链接)。[thefunny]

0.3.1 (2008-05-31)

  • 修复了 poller 文档和示例。[mustapha]

  • 修复了当您的可执行文件名称不是 python 时失败的测试,例如 python2.4。[mustapha]

0.3.0 (2008-05-28)

  • 使用自定义调度器使 poller 再次工作。[gawel]

  • 将拆分器选项添加到 poller 食谱中。[gawel]

  • 为项目添加了运行 PyFlakes 的支持。[dokai]

  • 重构了项目名称提取逻辑。[dokai]

    • 添加了对 Git 的支持。

    • 添加了对定义具有重复项目名称的多个项目的支持(例如,指向 Subversion 仓库中不同分支的项目)。

  • 尝试从 svn urls 中检索项目名称。[gawel]

  • 在拥有多个仓库时,使用 cron-scheduler 的随机分钟。[gawel]

  • 在 cygwin 下禁用虚拟环境,这不起作用。[thefunny]

  • “环境”可用于在从属服务器上指定环境变量。[thefunny]

  • “egg”可用于在从属服务器上安装额外的 egg。[thefunny]

  • 将“projects”食谱的功能重构到“project”食谱中,并删除了“projects”入口点。[dokai]

  • 将“pollers”食谱的功能重构到“poller”食谱中,并删除了“pollers”入口点。[dokai]

  • 现在 poller 配置文件以部分名称命名,允许定义多个 poller 部分。[dokai]

0.2.1 (2008-05-21)

  • 修复了 fullexample.txt 中从属服务器名称配置中的关键错误。[dokai]

0.2.0 (2008-05-21)

  • 添加了 irc 选项,以便将 irc 机器人附加到主 buildbot。[mustapha]

  • 允许定制 public_html。[gawel]

  • 添加了自定义关于页面以链接到 collective.buildout。[gawel]

  • 添加了对 Git 仓库的支持。[dokai]

  • 重构了仓库 URL 配置。对于 Subversion,您应仅使用 repository 选项来指定要构建的分支(主干、标签或分支)的完整 URL。对于 Git,除了设置 repository 选项之外,您还可以使用 branch 选项来指定要构建的特定分支。默认情况下,Git 仓库将使用 master 分支。[dokai]

  • 清理了大量冗余导入。[dokai]

  • 更新了文档和示例。[dokai]

  • 已弃用 collective.buildbot:projects 食谱。[dokai]

  • 修复了首次运行时丢失 twistd.log 文件的问题。[dokai]

  • 修复了在没有配置 SVN poller 时阻止主服务器启动的 bug。[dokai]

  • 添加了新的选项 periodic-schedulercron-scheduler,用于设置项目的被动调度器。[dokai]

0.1.1 (2008-05-02)

  • 修复了错误 [gawel]

0.1.0 (xxxx-xx-xx)

  • 使用 ZopeSkel 创建了配方 [Gael Pasgrimaud]。

下载

项目详细信息


下载文件

下载适用于您平台的自定义文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。

源分发

collective.buildbot-0.4.1.tar.gz (68.2 kB 查看哈希值)

上传时间

支持