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 验证"热更新闭环实录。
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 checkconfig | Config file is good! |
| 热加载(不停止 master) | buildbot sighup | sending SIGHUP to process 1384419 + 日志 Reconfiguration appears to have completed successfully |
| 热加载日志 | tail twistd.log | beginning 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},
)
逐项实测结论:
| 子键 | 实测结论 |
|---|---|
port | 8150 实测监听 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 |
auth | 4.x 从 util.UserPasswordAuth 导入(plugins.www 已删,实测 ImportError:cannot import name 'www' from 'buildbot.plugins');字典键值即账号密码(示例 admin/q1w2e3r4) |
authz | 4.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.www | from 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, maxBuildReportsRunning | 4.x 删除了这两个键 | 删除该行(等价能力由日志轮转/参数控制) |
Unknown BuildmasterConfig key slaves | c['slaves'] 彻底移除 | c['workers'] |
WARNING: Title is too long to be displayed. | title 超 18 字符 | 缩短 c['title'] |
九、参考
本系列篇目
官方文档:配置手册 https://docs.buildbot.net/current/manual/configuration/index.html