Buildbot 4.3.0 配置参数详解

Buildbot 4.3.0 master.cfg 配置参数逐项实测详解:全局键(workers/protocols/change_source/schedulers/builders/www/db_url/log*)、Worker/ChangeSource/Scheduler/BuildFactory/Step/Authz 对象写法,含 4.x 五处 API 变更排错与"改动→checkconfig→sighup→API 验证"热更新闭环实录。

BuildbotBuildbotCI/CD2026/10/20

Buildbot 4.3.0 配置参数详解

目标:逐项讲清 Buildbot 4.3.0 的 master.cfg 核心配置对象,每个参数都经 2026-10-20 实测:改动 → buildbot checkconfig 校验 → buildbot sighup 热加载 → Web API 回读验证。实验环境与部署过程见 《Buildbot 4.3.0 安装与部署指南》;命令行详见 《Buildbot 4.3.0 常用 CLI 命令详解》。

一、配置加载机制与验证方法

master.cfg 是纯 Python 程序,由 master 在启动与热加载时执行(源码 buildbot/config/master.py 中经 execfile 执行),最终必须产生名为 BuildmasterConfig 的字典。验证链条实测如下:

环节命令实测回显(逐行照抄)
静态校验(不加载进运行中的 master)buildbot checkconfigConfig file is good!
热加载(不停止 master)buildbot sighupsending SIGHUP to process 1384419 + 日志 Reconfiguration appears to have completed successfully
热加载日志tail twistd.logbeginning configuration update / Loading configuration from '/opt/data/buildbot-demo/master/master.cfg' / initializing www plugin 'waterfall_view' / configuration update complete (took 0.006 seconds)

热更新闭环实测(2026-10-20):把 c['title'] 从 Quzuo Buildbot 改为 Quzuo Buildbot CI(17 字符,未超限)→ checkconfig 通过 → sighup → 回读验证:

curl -s http://127.0.0.1:8150/config | python3 -c "import json,sys; d=json.load(sys.stdin); print('title:',d.get('title'))"
title: Quzuo Buildbot CI

首页 HTML 同步含 Quzuo Buildbot CI,证明 www 段改动经 sighup 即时生效、无需重启。

二、BuildmasterConfig 全局键逐项

以下全部键均在实测环境验证通过(标"实测"者为有正向验证动作的项):

2.1 必设键

键实测取值说明与实测结论
c['buildbotNetUsageData']None关闭匿名使用数据上报;内网/隐私环境必设,否则 master 启动/加载时会输出上报相关提示。实测设为 None 后无任何上报告警
c['workers'][worker.Worker('bb-local-worker', 'w1w2e3r4')]worker 账号清单(名称+密码)。实测旧键 c['slaves'] 在 4.3.0 已彻底移除:追加 c['slaves'] = c['workers'] 后 checkconfig 报 Configuration Errors: Unknown BuildmasterConfig key slaves(exit≠0)
c['protocols']{'pb': {'port': 8149}}worker 接入协议与端口。实测启动后 ss -ltn 出现 LISTEN 0 50 0.0.0.0:8149,worker 经此端口完成 PB 握手
c['builders'][util.BuilderConfig(...)]见第六节;实测 worker 日志出现 Worker bb-local-worker attached to demo-shell
c['schedulers'][AnyBranchScheduler, ForceScheduler]见第五节;实测热加载日志 adding 2 new schedulers,/api/v2/schedulers 返回 2 条记录
c['www']dict,见第七节Web 服务配置,实测 8150 端口监听、<title>Buildbot</title> 首页 200

2.2 常用可选键(实测全部通过 checkconfig)

键实测取值实测/源码结论
c['title']'Quzuo Buildbot CI'超过 18 字符触发告警:实测 19 字符的 Quzuo Buildbot Demo 报 WARNING: Title is too long to be displayed. "Buildbot" will be used instead.(源码 max_title_len = 18,仅告警不阻断)
c['titleURL']'https://www.quzuo.net'实测热加载后 /config 回读为 https://www.quzuo.net/——源码对 titleURL/buildbotURL 强制补尾斜杠,配置不写斜杠也会被规范化
c['buildbotURL']'http://127.0.0.1:8150/'对外访问地址;实测 /config 回读一致
c['db_url']'sqlite:///state.sqlite'默认 SQLite;生产可换 MySQL/MariaDB/PostgreSQL 连接串。实测 create-master 阶段即输出 creating database (sqlite:///state.sqlite)
c['change_source'][changes.PBChangeSource()]见第四节;实测 buildbot sendchange 经 PB 通道送达变更
c['logCompressionLimit']16384日志超过该字节数启用压缩,通过 checkconfig
c['logCompressionMethod']'gz'压缩算法,通过 checkconfig
c['logMaxSize']4 * 1024 * 1024单日志最大字节数,通过 checkconfig

2.3 已删除键(实测报错原文)

追加以下两个 3.x 时代键后,checkconfig 实测报错:

Configuration Errors:
  Unknown BuildmasterConfig keys logMaxTailBytes, maxBuildReportsRunning

结论:4.3.0 对未知键是硬错误(非告警),从旧版升级必须清理。upgrade-master 迁移说明见 CLI 篇。

三、Worker 对象

from buildbot.plugins import worker
c['workers'] = [worker.Worker('bb-local-worker', 'w1w2e3r4')]
  • 第一个参数是 worker 名,第二个是密码,必须与 worker 侧 buildbot-worker create-worker <dir> <master> <name> <passwd> 完全一致,实测不一致时 worker 连接被拒并提示 botname or password 错误。
  • 实测连接成功链路:master 日志 worker 'bb-local-worker' attaching from IPv4Address(...) → bot attached → Worker bb-local-worker attached to demo-shell。
  • 常用扩展参数:max_builds(最大并发构建设置)、properties(注入属性)、locks;弹性 worker 为独立类(worker.EC2LatentWorker、worker.DockerLatentWorker、worker.KubernetesLatentWorker 等,官方文档列出,未在本次实测范围)。

四、ChangeSource 变更源

实测启用的是 PB 变更源 + HTTP Webhook 两条入口:

from buildbot.plugins import changes
c['change_source'] = [changes.PBChangeSource()]
  • PBChangeSource(实测):开放 PB 端口上的 change 通道,buildbot sendchange -m 127.0.0.1:8149 ... 实测回显 change sent successfully,master 日志 added buildset 1 to database。
  • change_hook(实测):在 c['www']['change_hook_dialects'] 配置 {'base': True} 后,POST /change_hook/base 即接收 Webhook。实测回显 1 change found(HTTP 200),随后自动触发构建 #2。
  • 其他官方变更源(官方文档列出,未逐一实测):changes.GitPoller、changes.SVNPoller、changes.HgPoller、changes.GitHubPullrequestPoller 等,均为"轮询仓库转 Change"模型。

五、Scheduler 调度器

实测配置了两个调度器:

c['schedulers'] = [
    schedulers.AnyBranchScheduler(name='demo-any', treeStableTimer=5,
                                  builderNames=['demo-shell']),
    schedulers.ForceScheduler(name='force', builderNames=['demo-shell']),
]
调度器实测结论
AnyBranchScheduler消费 Change;实测 treeStableTimer=5 时,change_hook 收到变更约 5 秒后 master 日志出现 starting build <Build demo-shell number:2 ...>,稳定窗口行为与参数一致。支持 ChangeFilter(branch=..., project=...) 过滤(官方文档)
ForceScheduler手动强制触发入口;实测注册后 /api/v2/forceschedulers 能查到该调度器及其表单字段定义(name: force)
其他(官方文档列出,未实测)Nightly(定时)、Periodic(周期)、Triggerable(被上游构建触发)、TryScheduler(配合 buildbot try)等

调度器通用要点(实测验证):改名重建即视为新调度器(热加载日志 adding 2 new schedulers, removing 0);builderNames 必须指向已定义的 Builder,否则 checkconfig 报错。

六、Builder 与 BuildFactory/Step

factory = util.BuildFactory()
factory.addStep(steps.ShellCommand(
    name='shell-demo',
    description='running shell demo',
    command=['bash', '-c',
             'echo hello-from-buildbot; uname -sr; date +%F\\ %T; whoami'],
))
c['builders'] = [
    util.BuilderConfig(name='demo-shell',
                       workernames=['bb-local-worker'],
                       factory=factory),
]

实测验证点:

  • BuilderConfig.name 是构建名,workernames 必须来自 c['workers'] 中的名字;实测 worker 挂载日志直接打印了这两者的绑定关系(Worker bb-local-worker attached to demo-shell)。
  • steps.ShellCommand 的 command 支持列表形式;实测构建在 worker 的 worker/demo-shell/build 目录执行,stdout 逐行回传(hello-from-buildbot / Linux 6.8.0-138-generic / 2026-10-20 16:01:25 / root / program finished with exit code 0),完整实录见部署篇第六节。
  • 同一 Builder 可配置多台 worker(workernames 列表多个成员)实现分摊;factory.addStep 顺序即执行顺序,Step 返回码决定成败与是否继续(官方文档 results 语义)。

七、www 段(端口/插件/Webhook/认证授权)

c['www'] = dict(
    port=8150,
    change_hook_dialects={'base': True},
    auth=util.UserPasswordAuth({'admin': 'q1w2e3r4'}),
    authz=util.Authz(
        allowRules=[
            util.StopBuildEndpointMatcher(role='admins'),
            util.ForceBuildEndpointMatcher(role='admins'),
            util.RebuildBuildEndpointMatcher(role='admins'),
        ],
        roleMatchers=[
            util.RolesFromUsername(roles=['admins'], usernames=['admin']),
        ],
    ),
    plugins={'waterfall_view': True, 'console_view': True, 'grid_view': True},
)

逐项实测结论:

子键实测结论
port8150 实测监听 0.0.0.0:8150,首页 200
plugins视图开关;实测三个视图包(buildbot-waterfall-view/console-view/grid-view)缺一即启动失败:could not find plugin waterfall_view; is it installed?;热加载日志逐个 initializing www plugin 'xxx_view'
change_hook_dialects{'base': True} 开启通用 Webhook;实测 POST /change_hook/base 返回 1 change found
auth4.x 从 util.UserPasswordAuth 导入(plugins.www 已删,实测 ImportError:cannot import name 'www' from 'buildbot.plugins');字典键值即账号密码(示例 admin/q1w2e3r4)
authz4.x 大改。实测旧写法三连报错:Authz.__init__() got an unexpected keyword argument 'usernamePassword'、Unknown component name: StopEndpoint、RolesFromUsername.__init__() got an unexpected keyword argument 'admins'。正确写法:allowRules 用 util.*EndpointMatcher(role=...) 声明权限,roleMatchers 用 util.RolesFromUsername(roles=[...], usernames=[...]) 授角色
回读验证curl http://127.0.0.1:8150/config 实测返回 "auth": {"name": "UserPasswordAuth"}、plugins 三视图为 true、"versions": [["Python","3.10.12"], ["Buildbot","4.3.0"], ["Twisted","26.4.0"]]

八、常见配置错误对照表(实测报错原文速查)

报错原文(逐行照抄)根因正确写法
cannot import name 'www' from 'buildbot.plugins'4.x 移除 plugins.wwwfrom buildbot.plugins import changes, schedulers, steps, util, worker
Authz.__init__() got an unexpected keyword argument 'usernamePassword'旧版 Authz 参数已删util.Authz(allowRules=[...], roleMatchers=[...])
Unknown component name: StopEndpoint旧 allowRules 组件名已改util.StopBuildEndpointMatcher(role='admins')
RolesFromUsername.__init__() got an unexpected keyword argument 'admins'签名变为两个位置参数util.RolesFromUsername(roles=['admins'], usernames=['admin'])
Unknown BuildmasterConfig keys logMaxTailBytes, maxBuildReportsRunning4.x 删除了这两个键删除该行(等价能力由日志轮转/参数控制)
Unknown BuildmasterConfig key slavesc['slaves'] 彻底移除c['workers']
WARNING: Title is too long to be displayed.title 超 18 字符缩短 c['title']

九、参考

本系列篇目

官方文档:配置手册 https://docs.buildbot.net/current/manual/configuration/index.html