Buildbot 4.3.0 安装与部署指南
Buildbot 4.3.0 pip/venv 形态全流程实测部署指南:venv 安装 master 与 worker、create-master/checkconfig/start、master.cfg 最小可跑配置、create-worker 连接、sendchange 与 change_hook 触发真实 shell 构建并取回 stdout,含 4.x 五处配置变更排错实录。
Buildbot 4.3.0 安装与部署指南
目标:在 Linux 服务器上以官方主线形态(Python venv + pip 安装 master 与 worker)完整部署 Buildbot 4.3.0,并跑通第一个真实构建。本文全部命令与回显均为 2026-10-20 在实测服务器逐条执行的真实记录(输入=实际执行命令,输出=实测回显逐行照抄);组件背景与选型见 《Buildbot 4.3.0 介绍与选型指南》。
一、实测环境
| 项目 | 值 |
|---|---|
| 操作系统 | Ubuntu 22.04(内核 6.8.0-138-generic) |
| 系统Python | Python 3.10.12(python3 --version) |
| 部署形态 | venv + pip(官方文档主线,非 Docker) |
| Buildbot 版本 | buildbot / buildbot-worker 均 4.3.0,Twisted 26.4.0 |
| 实验目录 | /opt/data/buildbot-demo(master 与 worker 均在此下) |
| 端口 | master PB 端口 8149(worker 连接用)、Web UI 8150(从空闲段取得,ss -ltn 确认未被占用;PB 默认 9989、Web 默认 8010,可按需修改) |
| 示例账号 | Web UI 管理员 admin / q1w2e3r4;worker 账号 bb-local-worker / w1w2e3r4 |
二、创建 venv 并安装 Buildbot
2.1 创建虚拟环境
本机 Python 3.10.12 缺少 ensurepip(未安装 python3.10-venv 系统包),标准 python3 -m venv 失败。实测采用 --without-pip 创建目录后用官方 get-pip.py 引导安装,全程无需 root 之外的系统包:
python3 -m venv --without-pip /opt/data/buildbot-demo/venv
curl -sS https://bootstrap.pypa.io/get-pip.py -o /opt/data/buildbot-demo/get-pip.py
/opt/data/buildbot-demo/venv/bin/python /opt/data/buildbot-demo/get-pip.py -q
/opt/data/buildbot-demo/venv/bin/pip --version
实测回显:
pip 26.2.1 from /opt/data/buildbot-demo/venv/lib/python3.10/site-packages/pip (python 3.10)
若系统已装
python3-venv,直接python3 -m venv /opt/data/buildbot-demo/venv即可,无此引导步骤。
2.2 安装 master 与 worker 包
/opt/data/buildbot-demo/venv/bin/pip install buildbot buildbot-worker
安装完成后验证版本:
/opt/data/buildbot-demo/venv/bin/buildbot --version
/opt/data/buildbot-demo/venv/bin/buildbot-worker --version
实测回显:
Buildbot version: 4.3.0
Twisted version: 26.4.0
worker version: 4.3.0
Twisted version: 26.4.0
2.3 补装 Web UI 包(4.x 必做,漏装启动必失败)
Buildbot 4.x 把 Web 前端与各视图拆成了独立 pip 包,pip install buildbot 只装核心。实测启动时报错并逐个补装:
/opt/data/buildbot-demo/venv/bin/pip install buildbot-www buildbot-waterfall-view buildbot-console-view buildbot-grid-view
装完后 pip list 中的 buildbot 全家桶(实测回显):
buildbot 4.3.0
buildbot-console-view 4.3.0
buildbot-grid-view 4.3.0
buildbot-waterfall-view 4.3.0
buildbot-worker 4.3.0
buildbot-www 4.3.0
不装这些包的症状见第八节排错表:master 启动即报
could not find buildbot-www; is it installed?或could not find plugin waterfall_view; is it installed?。
三、创建并配置 master
3.1 create-master 初始化
cd /opt/data/buildbot-demo && buildbot create-master master
实测回显(逐行照抄):
mkdir /opt/data/buildbot-demo/master
creating /opt/data/buildbot-demo/master/master.cfg.sample
creating database (sqlite:///state.sqlite)
buildmaster configured in /opt/data/buildbot-demo/master
生成三个关键文件:buildbot.tac(启动入口)、master.cfg.sample(配置样例)、state.sqlite(默认数据库)。
3.2 最小可跑 master.cfg
复制样例后覆写为最小可跑配置。以下为实测通过 checkconfig 的最终版本全文(关键点:worker 账号密码、PB 端口、调度器、Builder、Web 认证):
# -*- python -*-
# Buildbot 4.3.0 最小可跑配置
from buildbot.plugins import changes, schedulers, steps, util, worker
c = BuildmasterConfig = {}
# 关闭匿名使用数据上报(内网环境必改项,否则启动时告警)
c['buildbotNetUsageData'] = None
# ---- 工作节点 ----
c['workers'] = [worker.Worker('bb-local-worker', 'w1w2e3r4')]
# PB 协议端口(worker 经此端口连接 master)
c['protocols'] = {'pb': {'port': 8149}}
# ---- 变更源 ----
c['change_source'] = [changes.PBChangeSource()]
# ---- 调度器 ----
c['schedulers'] = [
schedulers.AnyBranchScheduler(name='demo-any', treeStableTimer=5,
builderNames=['demo-shell']),
schedulers.ForceScheduler(name='force', builderNames=['demo-shell']),
]
# ---- Builder 与工厂 ----
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),
]
# ---- Web 界面 ----
c['title'] = 'Quzuo Buildbot'
c['titleURL'] = 'https://www.quzuo.net'
c['buildbotURL'] = 'http://127.0.0.1:8150/'
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},
)
# ---- 项目级杂项 ----
c['db_url'] = 'sqlite:///state.sqlite'
c['logCompressionLimit'] = 16384
c['logCompressionMethod'] = 'gz'
c['logMaxSize'] = 4 * 1024 * 1024
3.3 checkconfig 校验
cd /opt/data/buildbot-demo/master && buildbot checkconfig
实测回显:
Config file is good!
校验过程并非一次通过——4.x 的五处写法变更(实测均踩到,报错原文见第八节排错表):plugins.www 已移除、Authz 不再接受 usernamePassword、StopEndpoint 更名为 StopBuildEndpointMatcher、RolesFromUsername 改为 roles=/usernames= 两个位置参数、c['slaves'] 等旧键已删除。逐项修正细节见 《Buildbot 4.3.0 配置参数详解》。
四、启动 master
cd /opt/data/buildbot-demo/master && buildbot start
实测回显(首次启动,master 初始化数据库较慢):
Following twistd.log until startup finished..
The buildmaster took more than 10.0 seconds to start, so we were unable to
confirm that it started correctly. Please 'tail twistd.log' and look for a line
that says 'BuildMaster is running' to verify correct startup.
按提示看日志确认(实测回显):
2026-10-20 15:58:27+0800 [-] BuildMaster is running
确认端口监听(实测回显):
ss -ltn | grep -E '8149|8150'
LISTEN 0 50 0.0.0.0:8149 0.0.0.0:*
LISTEN 0 50 0.0.0.0:8150 0.0.0.0:*
验证 Web UI(实测回显):
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8150/
curl -s http://127.0.0.1:8150/ | grep -oE "<title>[^<]*</title>"
200
<title>Buildbot</title>
五、创建并连接 worker
5.1 create-worker 初始化
cd /opt/data/buildbot-demo && buildbot-worker create-worker worker 127.0.0.1:8149 bb-local-worker w1w2e3r4
实测回显(逐行照抄):
mkdir /opt/data/buildbot-demo/worker
mkdir /opt/data/buildbot-demo/worker/info
Creating info/admin, you need to edit it appropriately.
Creating info/host, you need to edit it appropriately.
Not creating info/access_uri - add it if you wish
Please edit the files in /opt/data/buildbot-demo/worker/info appropriately.
worker configured in /opt/data/buildbot-demo/worker
名称 bb-local-worker 与密码 w1w2e3r4 必须与 master.cfg 中 worker.Worker('bb-local-worker', 'w1w2e3r4') 一致,否则连不上。
5.2 填写 worker 描述信息并启动
printf 'quzuo.net MCP Service Account\n' > worker/info/admin
printf 'Ubuntu 22.04 x86_64 / Python 3.10.12 / demo worker for docs\n' > worker/info/host
buildbot-worker start worker
worker 侧日志(实测回显,worker/twistd.log):
2026-10-20 15:59:19+0800 [Broker,client] Connected to buildmaster; worker is ready
2026-10-20 15:59:19+0800 [Broker,client] sending application-level keepalives every 600 seconds
master 侧日志(实测回显,master/twistd.log):
2026-10-20 15:59:19+0800 [Broker,0,127.0.0.1] worker 'bb-local-worker' attaching from IPv4Address(type='TCP', host='127.0.0.1', port=52552)
2026-10-20 15:59:19+0800 [-] bot attached
2026-10-20 15:59:19+0800 [Broker,0,127.0.0.1] Worker bb-local-worker attached to demo-shell
第三行 Worker bb-local-worker attached to demo-shell 表示 worker 已挂载到 demo-shell Builder,可接构建。
六、跑通第一个真实构建
6.1 用 sendchange 触发(PBChangeSource + AnyBranchScheduler)
cd /opt/data/buildbot-demo && buildbot sendchange -m 127.0.0.1:8149 -W quzuo-demo -c "first real build via sendchange" -r demo-0001 -P demo README.md
实测回显:
change sent successfully
master 日志显示调度与执行全过程(实测回显,节选):
2026-10-20 16:01:25+0800 [-] added buildset 1 to database
2026-10-20 16:01:25+0800 [-] starting build <Build demo-shell number:1 results:success> using worker <WorkerForBuilder builder='demo-shell' worker='bb-local-worker' state=AVAILABLE>
2026-10-20 16:01:25+0800 [-] starting build <Build demo-shell number:1 results:success>.. pinging the worker <WorkerForBuilder builder='demo-shell' worker='bb-local-worker' state=BUILDING>
2026-10-20 16:01:25+0800 [-] command '['bash', '-c', 'echo hello-from-buildbot; uname -sr; date +%F\\ %T; whoami']' in dir 'build'
2026-10-20 16:01:25+0800 [-] step 'shell-demo' complete: success (None)
2026-10-20 16:01:25+0800 [-] <Build demo-shell number:1 results:success>: build finished
6.2 构建步骤的真实 stdout
通过 REST API 取回 shell-demo 步骤 stdio 日志(实测回显,逐行照抄):
bash -c 'echo hello-from-buildbot; uname -sr; date +%F\ %T; whoami'
in dir /opt/data/buildbot-demo/worker/demo-shell/build (timeout 1200 secs)
using PTY: False
hello-from-buildbot
Linux 6.8.0-138-generic
2026-10-20 16:01:25
root
program finished with exit code 0
elapsedTime=0.010496
构建 #1 结果:success(results=0)。worker 在 /opt/data/buildbot-demo/worker/demo-shell/build 目录下真实执行了 shell 命令并回传输出。
6.3 用 change_hook 再触发一次(HTTP Webhook 入口)
master.cfg 中 change_hook_dialects={'base': True} 开启了 Webhook 端点,实测:
curl -s -X POST -H "Content-Type: application/json" \
-d '{"comments":"change-hook test","repository":"demo","project":"demo"}' \
http://127.0.0.1:8150/change_hook/base
实测回显:
1 change found
约 5 秒后(treeStableTimer=5)触发构建 #2。用 REST API 查询全部构建(实测回显):
curl -s "http://127.0.0.1:8150/api/v2/builds" | python3 -c "import json,sys; [print('build',b['number'],'results:',b['results']) for b in json.load(sys.stdin)['builds']]"
build 1 results: 0
build 2 results: 0
两次构建均 success,master + worker 链路完整跑通。
七、日常启停
master 与 worker 的启停、重启、热重载命令的逐参数实测(buildbot stop/restart/sighup/reconfig、buildbot-worker stop/restart 等)见 《Buildbot 4.3.0 常用 CLI 命令详解》。实测要点:
buildbot stop:向 twistd.pid 记录的进程发信号,回显buildbot process 1384399 is dead;buildbot restart:先停后启,回显The buildmaster appears to have (re)started correctly.,重启后 worker 会自动重连(master 日志再次出现bot attached);buildbot sighup/reconfig:热加载 master.cfg,回显Reconfiguration appears to have completed successfully,日志中configuration update complete (took 0.008 seconds),无需停机。
八、实测排错表(4.x 五处坑,报错原文逐行照抄)
实测中按顺序踩到并修复的报错,全部真实发生,可供同类环境直接对号入座:
| # | 触发点 | 实测报错原文 | 原因与修复 |
|---|---|---|---|
| 1 | checkconfig | builtins.ImportError: cannot import name 'www' from 'buildbot.plugins' | 4.x 移除了 plugins.www 命名空间,认证类改从 buildbot.plugins.util 导入;from buildbot.plugins import changes, schedulers, steps, util, worker |
| 2 | checkconfig | builtins.TypeError: Authz.__init__() got an unexpected keyword argument 'usernamePassword' | 4.x 的 util.Authz 只接受 allowRules/roleMatchers/stringsMatcher,旧版 usernamePassword 参数已删 |
| 3 | checkconfig | builtins.AttributeError: Unknown component name: StopEndpoint | 4.x allowRules 用 util.StopBuildEndpointMatcher / ForceBuildEndpointMatcher / RebuildBuildEndpointMatcher,旧 *Endpoint 名称已不存在 |
| 4 | checkconfig | builtins.TypeError: RolesFromUsername.__init__() got an unexpected keyword argument 'admins' | 4.x 签名为 RolesFromUsername(roles, usernames):写 util.RolesFromUsername(roles=['admins'], usernames=['admin']) |
| 5 | checkconfig | Configuration Errors: Unknown BuildmasterConfig keys logMaxTailBytes, maxBuildReportsRunning | 这两个键在 4.x 已删除;另实测确认旧键 c['slaves'] 报 Unknown BuildmasterConfig key slaves,必须写 c['workers'] |
另有两处非致命告警/报错:
- Title 长度告警:
WARNING: Title is too long to be displayed. "Buildbot" will be used instead.——实测c['title']超过 18 字符即触发(源码max_title_len = 18),改短即可,不影响运行; - 缺 UI 包启动失败:启动报
builtins.RuntimeError: could not find buildbot-www; is it installed?,补装 buildbot-www 后再报could not find plugin waterfall_view; is it installed?,需把三个视图包一并装齐(见 2.3 节)。
九、参考
本系列篇目
官方文档:安装手册 https://docs.buildbot.net/current/manual/installation/index.html